小编典典

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

all

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


阅读 155

收藏
2022-05-23

共1个答案

小编典典

首先,重复这个口头禅一会儿:“未使用的内存是浪费的内存”。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

2022-05-23