进程声称使用了大量内存,但“free”表示内存仍然可用

进程声称使用了大量内存,但“free”表示内存仍然可用

我曾看到过与此相反的情况,但这令人费解。

简而言之,我有一个进程,在使用“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

我认为有一个简单的解释,freetop之间的区别ps。如果你检查top输出,你会看到126.370G cached内存,该内存free显示为可用内存。它是如何计算的。你有189.054G总内存,你的进程使用139G驻留内存,所以你应该有50G用于缓冲区等的内存。如果你检查你的进程共享内存,你会看到它有81G共享内存,它可以计入你的驻留内存中。所以,如果你的进程使用文件,它们可能位于缓冲区中并与你的进程共享(这只是假设,我不知道共享内存如何与文件一起计算)。所以这只是拥有如此多可用空间的一个原因。

相关内容