我有一台12G内存的服务器。top的一个片段如下所示:

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                                                                                                                                                                      
12979 frank  20   0  206m  21m  12m S   11  0.2  26667:24 krfb                                                                                                                                                                                                                                                          
13 root      15  -5     0    0    0 S    1  0.0  36:25.04 ksoftirqd/3                                                                                                                                                                                                                                                   
59 root      15  -5     0    0    0 S    0  0.0   4:53.00 ata/2                                                                                                                                                                                                                                                         
2155 root      20   0  662m  37m 8364 S    0  0.3 338:10.25 Xorg                                                                                                                                                                                                                                                          
4560 frank  20   0  8672 1300  852 R    0  0.0   0:00.03 top                                                                                                                                                                                                                                                           
12981 frank  20   0  987m  27m  15m S    0  0.2  45:10.82 amarok                                                                                                                                                                                                                                                        
24908 frank  20   0 16648  708  548 S    0  0.0   2:08.84 wrapper                                                                                                                                                                                                                                                       
1 root      20   0  8072  608  572 S    0  0.0   0:47.36 init                                                                                                                                                                                                                                                          
2 root      15  -5     0    0    0 S    0  0.0   0:00.00 kthreadd

free -m显示如下:

             total       used       free     shared    buffers     cached
Mem:         12038      11676        362          0        599       9745
-/+ buffers/cache:       1331      10706
Swap:         2204        257       1946

如果我理解正确的话,系统只有362 MB的可用内存。我的问题是:如何知道哪个进程消耗了最多的内存?

作为背景信息,系统正在运行64位的OpenSuse 12。


当前回答

如何按进程名合计使用的内存:

有时,即使查看最大的单个进程,仍然有许多使用的内存未被考虑。要检查是否有很多相同的小进程使用内存,您可以使用如下命令,使用awk来计算相同名称的进程使用的内存总量:

ps -e -orss=,args= |awk '{print $1 " " $2 }'| awk '{tot[$2]+=$1;count[$2]++} END {for (i in tot) {print tot[i],i,count[i]}}' | sort -n

如输出

9344 docker 1
9948 nginx: 4
22500 /usr/sbin/NetworkManager 1
24704 sleep 69
26436 /usr/sbin/sshd 15
34828 -bash 19
39268 sshd: 10
58384 /bin/su 28
59876 /bin/ksh 29
73408 /usr/bin/python 2
78176 /usr/bin/dockerd 1
134396 /bin/sh 84
5407132 bin/naughty_small_proc 1432
28061916 /usr/local/jdk/bin/java 7

其他回答

ps aux | awk '{print $2, $4, $11}' | sort -k2rn | head -n 10

(在排序命令中添加-n数字标志。)

首先,您应该阅读关于free输出的说明。底线:至少有10.7 GB的内存可供进程使用。

然后,您应该定义一个进程的“内存使用”是什么(相信我,这并不容易,也不明确)。

然后我们也许能帮助更多:-)

你可以通过在你的终端上执行这段代码来查看内存使用情况:

$ watch -n2 free -m
$ htop

根据内存使用情况列出和排序进程:

ps -e -orss=,args= | sort -b -k1,1n | pr -TW$COLUMNS

就在这一秒

ps -U $(whoami) -eom pid,pmem,pcpu,comm | head -n4

不断更新

watch -n 1 'ps -U $(whoami) -eom pid,pmem,pcpu,comm | head -n4'

我还在这里添加了一些好吃的东西,你可能会喜欢(或者你可能会忽略)

-n 1个手表,每秒更新一次

-U $(whoami)只显示你的进程$(一些命令)现在计算

为了一次只显示头部和3个进程,通常你只需要高使用率的行项

${1-4}表示我的第一个参数$1我想默认为4,除非我提供它

如果你使用的是mac,你可能需要先安装watch 酿造安装手表

也可以使用函数

psm(){
    watch -n 1 "ps -eom pid,pmem,pcpu,comm | head -n ${1-4}"
    # EXAMPLES: 
    # psm 
    # psm 10
}