top 如何计算 Linux 上的内存数字?

jar*_*oan 5 memory linux top

我对内存数字如何加起来有点困惑。

如果我理解正确的话,“真正”使用的内存量是total - free - buffers - cached。在下面的示例中,这将是 14370248k - 75736k - 178892k - 10459552k = 3656068k,这是总内存 (3656068/14370248) 的 25%。

同样,如果我理解正确的话,RES%MEM列中显示的数字显示了进程“真正”使用的物理内存量。仅httpd进程的RES值之和为7254m,即7428096k(7254*1024),占总内存(7428096/14370248)的52%。httpd 进程的%MEM值总和为 53%,足够接近。

为什么摘要部分仅显示使用了 25% 的内存,而单独的 httpd 进程声称使用了超过 50% 的内存?我在这里缺少什么?

top - 15:37:00 up 117 days, 18:27,  6 users,  load average: 4.82, 4.44, 3.60
Tasks: 433 total,   4 running, 429 sleeping,   0 stopped,   0 zombie
Cpu(s): 59.6%us,  6.5%sy,  0.0%ni, 33.0%id,  0.1%wa,  0.0%hi,  0.8%si,  0.0%st
Mem:  14370248k total, 14294512k used,    75736k free,   178892k buffers
Swap:  8388600k total,      116k used,  8388484k free, 10459552k cached

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
3566 mysql     21   0  554m  60m 4576 S 74.6  0.4  11422:52 mysqld
23305 apache    15   0  327m  27m 3792 S  3.2  0.2   0:01.30 httpd
23474 apache    15   0  327m  27m 3800 S  3.2  0.2   0:01.09 httpd
...
Run Code Online (Sandbox Code Playgroud)

Pet*_*aut 2

httpd 进程可能共享一些内存,因为它们是彼此分叉的。由于写时复制机制,他们都声称该内存是自己的虚拟内存,尽管它只在物理内存中存在一次。

一般来说,Linux 上的内存输出包含此类的各种 bogosities。我不会试图去理解它太多的意义。查看进程的行为是否与应有的行为不同很有用;但这些数字并不一定相加。