我有一个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如下:
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。
64bit OpenSuse 12
首先,重复这个口头禅一会儿:“未使用的内存是浪费的内存”。Linux 内核保留了 大量 的文件元数据和请求的文件,直到看起来更重要的东西将这些数据推出。这就是为什么你可以运行:
find /home -type f -name '*.mp3' find /home -type f -name '*.aac'
并让第二个find实例以荒谬的速度运行。
find
Linux 只留下一点点“空闲”内存来处理内存使用高峰,而无需付出太多努力。
其次,你想找到消耗你所有记忆的进程;在top使用M命令按内存使用排序。随意忽略该VIRT列,它只是告诉您分配了多少虚拟内存,而不是进程正在使用多少内存。RES报告有多少内存是 驻留 的,或者当前在 ram 中(而不是交换到磁盘或从未实际分配过,尽管被请求)。
top
M
VIRT
RES
但是,由于几乎每个进程RES都会计算/lib/libc.so.6一次内存,因此它并不是衡量一个进程正在使用多少内存的好方法。该列报告与其他进程 共享SHR了多少内存,但不能保证另一个进程实际上正在共享——它可能是可共享的,只是没有其他人想要共享。 __
/lib/libc.so.6
SHR
该工具旨在帮助用户更好地衡量每个单独进程 真正 应该归咎于smem多少内存。它做了一些聪明的工作来弄清楚什么是真正独特的,什么是共享的,并按比例将共享内存与共享它的进程进行统计。可能会帮助您更好地了解您的记忆在哪里,但它是一个很好的第一个工具。 __smem``top``top
smem
smem``top``top