我以前认为 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 cached
。46017056k used
不确定每个进程status
文件中是否计算了缓冲区,但您可能也必须减去它们。
该free
命令通过一行“-/+ buffers/cache:”显示这一点,当您排除这些内容时,显示实际“已使用”和“可用”的内容。