我曾看到过与此相反的情况,但这令人费解。
简而言之,我有一个进程,在使用“ps”和“top”时,%MEM 声称使用了 74% 的内存。但是,“free”显示我只使用了 32% 的可用内存。
以下是“top”的输出:
top - 18:25:49 up 203 days, 14 min, 1 user, load average: 3.48, 3.75, 3.79
Tasks: 349 total, 1 running, 347 sleeping, 1 stopped, 0 zombie
Cpu(s): 10.3%us, 4.7%sy, 0.0%ni, 75.1%id, 6.5%wa, 0.0%hi, 3.4%si,0.0%st
Mem: 189.054G total, 188.280G used, 793.473M free, 253.570M buffers
Swap: 4095.996M total, 967.234M used, 3128.762M free, 126.370G cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
14416 root 20 0 165g 139g 81g S 250.3 74.0 764266:39 asd
30660 root 20 0 15164 1328 836 R 2.0 0.0 0:00.01 top
您会注意到,“asd”进程声称使用了 74%(139g)的可用 RAM。如果您查看使用的总内存 - 缓存内存(188-126),看起来整个系统仅使用了 62G。这显然比“asd”进程声称使用的内存要低得多。
“免费”同样令人困惑。它显示有 61G 可用:
# free -g
total used free shared buffers cached
Mem: 189 188 0 81 0 126
-/+ buffers/cache: 61 127
Swap: 3 0 3
‘ps’ 似乎与‘top’ 中列出的进程一致:
# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 14416 261 74.0 173381464 146791980 ? Ssl Jan25 764310:00 /usr/bin/asd
我理解为什么“free”会声称可用内存比“top”少,但我不明白一个进程怎么能声称使用的 RAM 比整个系统报告的“used”还要多。
更新:我认为这和你向我指出的帖子不一样,Tim。那些帖子似乎提到了相反的问题,即人们要么误读了“free”输出,要么没有考虑缓存和缓冲区。因此,他们找不到使用他们认为“free”声称使用的内存的进程。在我的例子中,我有一个声称使用大量内存的进程,但“free”似乎认为内存仍然可用。
答案1
我认为有一个简单的解释,free
和top
之间的区别ps
。如果你检查top
输出,你会看到126.370G cached
内存,该内存free
显示为可用内存。它是如何计算的。你有189.054G
总内存,你的进程使用139G
驻留内存,所以你应该有50G
用于缓冲区等的内存。如果你检查你的进程共享内存,你会看到它有81G
共享内存,它可以计入你的驻留内存中。所以,如果你的进程使用文件,它们可能位于缓冲区中并与你的进程共享(这只是假设,我不知道共享内存如何与文件一起计算)。所以这只是拥有如此多可用空间的一个原因。