250

我有一个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

4

12 回答 12

333

在 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。您将看到按内存使用情况排序的活动进程

于 2012-03-07T18:12:48.483 回答
288

首先,重复这个口头禅一会儿:“未使用的内存是浪费的内存”。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多少内存。它做了一些聪明的工作来弄清楚什么是真正独特的,什么是共享的,并按比例将共享内存与共享它的进程进行统计。可能会帮助您更好地了解您的记忆在哪里,但它是一个很好的第一个工具。smemtoptop

于 2011-01-26T09:23:30.670 回答
38
ps aux | awk '{print $2, $4, $11}' | sort -k2rn | head -n 10

(将 -n 数字标志添加到排序命令。)

于 2013-04-23T08:05:04.330 回答
28

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

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

那么我们也许可以提供更多帮助:-)

于 2011-01-26T08:29:02.587 回答
21

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

ps -e -orss=,args= | sort -b -k1,1n | pr -TW$COLUMNS
于 2013-10-18T01:45:56.170 回答
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'
于 2014-05-21T16:35:54.333 回答
5

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

有时即使查看最大的单个进程,仍然有很多已使用的内存下落不明。要检查是否有很多相同的较小进程使用内存,您可以使用如下命令,该命令使用 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
于 2019-09-19T15:22:00.713 回答
4

您可以通过以下步骤指定要排序的列:

脚步:
* 顶部
* 班次 + F
* 从列表中选择一列
    例如 n 表示按内存排序,
* 按回车
* 行
于 2013-12-25T14:33:10.680 回答
4

基于gaoithe 的 回答,我试图让内存单位以兆字节为单位显示,并按内存降序排序,限制为 15 个条目:

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 | tail -n 15 | sort -nr | awk '{ hr=$1/1024; printf("%13.2fM", hr); print "\t" $2 }'

       588.03M  /usr/sbin/apache2
       275.64M  /usr/sbin/mysqld
       138.23M  vim
        97.04M  -bash
        40.96M  ssh
        34.28M  tmux
        17.48M  /opt/digitalocean/bin/do-agent
        13.42M  /lib/systemd/systemd-journald
        10.68M  /lib/systemd/systemd
        10.62M  /usr/bin/redis-server
         8.75M  awk
         7.89M  sshd:
         4.63M  /usr/sbin/sshd
         4.56M  /lib/systemd/systemd-logind
         4.01M  /usr/sbin/rsyslogd

这是在 bash 配置文件中使用它的示例别名:

    alias topmem="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 | tail -n 15 | sort -nr | awk '{ hr=\$1/1024; printf(\"%13.2fM\", hr); print \"\t\" \$2 }'"

然后,您只需topmem在命令行上键入即可。

于 2020-08-28T23:11:52.267 回答
3

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

$ watch -n2 free -m
$ htop
于 2018-03-02T11:09:14.353 回答
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)仅显示您的流程。$(some command) 现在计算

| 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
}
于 2020-06-01T03:04:43.887 回答
-2

你有这个简单的命令:

$ free -h
于 2019-01-30T22:42:39.867 回答