如何通过实际内存使用情况来查看顶级进程?

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

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的可用内存。 所以问题是如何找出哪个进程正在消耗大部分的内存?

仅供参考,系统运行64bit OpenSuse 12

首先,重复一下这个咒语:“未使用的内存是浪费的内存”。 Linux内核保留了大量的文件元数据和文件,直到看起来更重要的东西将数据推出。 这就是为什么你可以运行:

 find /home -type f -name '*.mp3' find /home -type f -name '*.aac' 

并有第二个find实例以荒谬的速度运行。

Linux只留下一点“免费”的内存来处理内存使用的高峰,而不需要太多的努力。

其次,你想find正在吃掉你所有记忆的过程; 在top使用M命令按内存使用sorting。 随意忽略VIRT列,它只是告诉你已经分配了多less虚拟内存,而不是该进程使用多less内存。 RES报告有多less内存是驻留的 ,或者目前是内存(而不是交换到磁盘,或者从来没有实际分配,尽pipe被请求)。

但是,由于RES几乎会在每个进程中对例如/lib/libc.so.6内存进行一次计数,所以它并不完全是一个进程正在使用多less内存的真棒测量。 SHR列报告与其他进程共享多less内存,但是不能保证另一个进程实际上是共享的 – 这是可共享的,只是没有人愿意共享。

smem工具旨在帮助用户更好地衡量在每个单独的进程中应该有多less内存。 它做了一些聪明的工作来找出什么是真正独特的,什么是共享的,并按比例共享共享内存共享进程。 smem may smem may smem top top

在linux / unix中使用使用top命令的快速提示

 $ top 

然后按Shift + m (即写入大写M )。

man top

 SORTING of task window For compatibility, this top supports most of the former top sort keys. Since this is primarily a service to former top users, these commands do not appear on any help screen. command sorted-field supported A start time (non-display) No M %MEM Yes N PID Yes P %CPU Yes T TIME+ Yes 

或者,也可以: 按住Shift + f ,然后select显示器按内存使用顺序,然后按Enter键 。 您将看到由内存使用情况sorting的活动进程

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

(添加-n数字标志来sorting命令。)

首先你应该阅读关于free输出的解释 。 底线:至less有10.7 GB的内存可以被进程使用。

那么你应该定义什么“内存使用”是一个过程(这是不容易或毫不含糊,相信我)。

那么我们可以帮助更多:-)

按内存使用列出和sorting进程:

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

ps aux --sort '%mem'

从procps的ps (默认在Ubuntu 12.04)生成输出如下:

 USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND ... tomcat7 3658 0.1 3.3 1782792 124692 ? Sl 10:12 0:25 /usr/lib/jvm/java-7-oracle/bin/java -Djava.util.logging.config.file=/var/lib/tomcat7/conf/logging.properties -D root 1284 1.5 3.7 452692 142796 tty7 Ssl+ 10:11 3:19 /usr/bin/X -core :0 -seat seat0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch ciro 2286 0.3 3.8 1316000 143312 ? Sl 10:11 0:49 compiz ciro 5150 0.0 4.4 660620 168488 pts/0 Sl+ 11:01 0:08 unicorn_rails worker[1] -p 3000 -E development -c config/unicorn.rb ciro 5147 0.0 4.5 660556 170920 pts/0 Sl+ 11:01 0:08 unicorn_rails worker[0] -p 3000 -E development -c config/unicorn.rb ciro 5142 0.1 6.3 2581944 239408 pts/0 Sl+ 11:01 0:17 sidekiq 2.17.8 gitlab [0 of 25 busy] ciro 2386 3.6 16.0 1752740 605372 ? Sl 10:11 7:38 /usr/lib/firefox/firefox 

所以在这里,Firefox是我记忆力最高的消费者。

您也可能对。。。有兴趣:

 ps aux --sort '%cpu' 

您可以指定要sorting的列,步骤如下:

脚步:
 * 最佳
 * shift + F
 *从列表中select一列
    例如n表示按内存sorting,
 *按回车
 * 好