如何查看按实际内存使用量排序的顶级进程?


240

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

就像背景信息一样,系统正在运行64bit OpenSuse 12


Answers:


280

首先,重复一会儿这一口号:“未使用的内存就是浪费的内存”。Linux内核保持周围巨大的文件元数据并要求提供的文件量,直到一些看起来更重要的是推动了数据。这就是为什么您可以运行:

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

find以令人难以置信的速度运行第二个实例。

Linux只剩下一点点的“空闲”内存即可轻松处理内存使用高峰。

其次,您要查找正在消耗您全部内存的进程。在top使用该M命令的内存使用排序。随意忽略该VIRT列,该列仅告诉您已分配了多少虚拟内存,而不是进程正在使用的内存量。RES报告驻留或当前在ram中有多少内存(而不是交换到磁盘或从不实际分配,尽管有请求)。

但是,由于几乎每个进程RES都会对/lib/libc.so.6一次内存进行计数,因此,这并不是衡量一个进程使用多少内存的好方法。该SHR列报告了与其他进程共享的内存量,但是不能保证实际上有另一个进程正在共享-它可以共享,只有其他人不想共享。

smem工具旨在帮助用户更好地衡量每个进程实际上应归还多少内存。它做了一些聪明的工作,以找出真正唯一的内容,共享的内容,并按比例将共享内存与共享它的进程相加。smem也许可以帮助您了解记忆的发展状况top,但top它是出色的入门工具。


因此,如果仅“ free”列统计信息下降,top表示没有其他不同,我们可以得出结论,Linux内核分配了内存以存储文件内容,并在必要时将内存分配给其他进程?
Al2O3

@Rubby,这可能是真的;在/proc/meminfo/proc/slabinfo-是什么内核使用的存储的文件的详细slabtop程序是非常喜欢top过板坯分配器的分配了多少,而是表演,什么他们的比例是一样等
sarnold

感谢有关“ smem”的提示-我希望Linux“浪费”一些RAM,以便我的机器可以快速运行。如果“发现”在第二遍上花费了更长的时间,那没关系。Linux决定需要清除哪个RAM(它不必要地占用了内存)并需要重新分配给我现在正在做的事情-甚至交换到磁盘-时,卡住鼠标和冻结的窗口是不可行的。我在此盒子上有16 GB的内存,我希望其中的几个GB可以免费使用,并且可用于正在运行的应用程序。
JosephK

@JosephK,移动鼠标与安排优先级和算法有关;如果必须分配内存来移动鼠标指针,则您使用的软件存在严重问题。:)
sarnold

2
@JosephK实际上,将内核从一种用途重新分配到另一种用途所花费的时间要少于使可用内存投入使用的时间。一个要求访问和修改空闲列表,而另一个则不需要。不幸的是,这是一个XY问题。该问题与性能有关,并且可能与内存消耗完全无关(尽管有证据表明,释放更多的内存可以解决问题,这可能是比OP怀疑的原因更复杂的原因),但他们却询问了分析内存使用情况的问题。与得到实际问题相比,得到的答案没有那么有用。
David Schwartz

321

在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,然后按键,n然后按来选择要按内存使用量排序的显示Enter。您将看到活动进程按内存使用情况排序


71
或者,您可以按MShift+ m
Patryk 2013年

8
@risnandar有没有办法以MB而不是%显示内存
codecowboy

2
嗨,codecowboy,也许您可​​以在commandlinefu.com/commands/view/3/…上查看我的服务器中使用的更详细的内存,我使用的是第三方应用,例如newrelic.com
risnandar 2014年

6
或只是 top -o mem -O cpu
skipy 2015年

在Ubuntu 16上,我top -o RES否则需要“无法识别的字段名称'mem'”
AdamS


28

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

然后,您应该定义什么是“内存使用情况”用于流程(这并不容易或明确,请相信我)。

然后,我们也许可以提供更多帮助:-)


您是从哪里获得10.7的?从缓冲区/缓存[免费]?感谢您的链接,我将阅读它。
user3111525 2011年

3
是。关键是大多数内存由缓冲区和缓存使用。如果任何进程需要更多内存,则可以立即“转储”该内存。当你减去的内存从使用量用于缓存/缓存量,或将其添加到可用容量,你上了第二条线,然后imples只有1.3演出的人数确实使用,或者,从另一个见过角度来看,您有10.7 gig随时可用的内存(因为缓冲区和缓存可以根据需要进行insta-dump)。
stolsvik 2013年


17

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是拥有16%内存的最大用户。

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

ps aux --sort '%cpu'

4

您可以按照以下步骤指定要排序的列:

脚步:
* 最佳
* Shift + F
*从列表中选择一列
    例如n表示按内存排序,
*按Enter
* 好

1
上面的risnandar答案重复。
2015年

3

您可以通过在终端中执行以下代码来查看内存使用情况:

$ watch -n2 free -m
$ htop

3

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

有时即使查看最大的单个进程,仍然有很多未使用的内存。要检查是否有很多相同的较小的进程使用内存,可以使用类似以下的命令,该命令使用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

0

这是第二时间

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)仅显示您的过程。$(某些命令)现在求值

| head -n4 要一次仅显示一次标题和3个流程,通常您只需要高使用率的订单项

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

如果您使用的是Mac,则可能需要先安装watch

brew install watch 

或者,您可以使用一个函数

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

如果更改-m-r
jasonleonhard

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.