顶部的“已用”内存大于 /proc/ 中列出的所有进程的 VmSize?

顶部的“已用”内存大于 /proc/ 中列出的所有进程的 VmSize?

我以前认为 top 对内存“使用”的定义是映射到任何进程的物理页面数量。但是,最近我看到的一些东西让我改变了想法。我真的很想有人来解释一下。

举个例子,根据我以前的理解,我期望的结果如下:/proc/ 中总计的 vmsize 几乎是 top 中“已使用”的三倍(89916452KB,32787948KB)。有些页面映射到多个进程,有些页面映射到磁盘(因此 top 根本不应该计算在内),等等。

$ grep VmSize /proc/*/status | awk '{total += $2} END{print total}'
89916452
$ top
top - 09:39:34 up 5 days,  7:37,  9 users,  load average: 4.89, 4.14, 3.92
Tasks: 242 total,   2 running, 239 sleeping,   0 stopped,   1 zombie
Cpu(s): 69.0%us,  0.5%sy,  0.0%ni, 30.3%id,  0.0%wa,  0.0%hi,  0.2%si,  0.0%st
Mem:  32961916k total, 32787948k used,   173968k free,   248132k buffers
Swap: 16777208k total,  1584300k used, 15192908k free,  7659572k cached

但是,我最近遇到了以下情况。总的 vmsize 几乎小了 4 倍!怎么可能这样呢?即使有人争辩说映射到每个进程的内核页面没有被计入 /proc/*/status 中的 VmSize 条目中,人们仍然很难证明它们占了正在使用的 ~46GB 的任何相当大的一部分。

$ grep VmSize /proc/*/status | awk '{total += $2} END{print total}'
8519308
$ top
top - 09:43:55 up 291 days, 15:16,  8 users,  load average: 1.02, 1.08, 1.08
Tasks: 291 total,   1 running, 290 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  49324520k total, 46017056k used,  3307464k free,  5448168k buffers
Swap:  8388600k total,      228k used,  8388372k free, 36486236k cached

请解释。

答案1

top的“已使用”数字包括文件系统缓存。要获取实际进程使用情况,您必须从中减去36486236k cached46017056k used不确定每个进程status文件中是否计算了缓冲区,但您可能也必须减去它们。

free命令通过一行“-/+ buffers/cache:”显示这一点,当您排除这些内容时,显示实际“已使用”和“可用”的内容。

相关内容