如何解释Linux的“顶部”命令的输出?

在这里讨论了关于PHP-FPM如何消耗内存的问题之后,我发现在top命令中读取内存时出现问题。 这是刚刚重新启动PHP-FPM后,我的top屏幕截图。 一切正常:大约20个PHP-FPM进程,每个进程消耗5.5MB内存(占总数的0.3%)。

在这里输入图像描述

这是PHP-FPM重启之前的老化服务器(上一次重启后的一天)。 在这里,我们仍然有大约25 PHP-FPM双内存使用的PHP-FPM (10MB,占总数的0.5%)。 因此,使用的总内存应该是600-700 MB。 那么,为什么使用1.6GB的内存呢?

在这里输入图像描述

    TL; DR 1

    您的服务器位于某种virtuozzo / openvz / virtualization-du-jour容器内。 试图理解内存使用情况正在风车上倾斜。

    TL; DR 2

    Linux吃了你的RAM! 但是没关系,这对每个人都是这样。


    漫长的故事

    让我们来分解一下!

    Mem:部分我们有:

    • $n total :机器中物理RAM的数量
    • $n used$n used :Linux消耗了多less内存,而不仅仅是进程的总和。
    • $n free :Linux没有占用多less内存。 这并没有考虑到caching和缓冲内存本质上是“免费的”。
    • $n buffers :缓冲区空间是已经被读取或等待写入的磁盘I / O的块被存储的地方。 缓冲区是单个磁盘块的RAM表示。

    Swap:部分我们有:

    • $n total :自我解释。 可用于交换页面的磁盘空间量。
    • $n used :自我解释。 多less磁盘交换空间被使用。
    • $n free :Herp Derp。
    • $n cache :与上面的缓冲区密切相关。 它实际上是页面caching的一部分,本身在物理磁盘上没有空间。 不要担心这个对话的细节。

    有趣的部分来自free -m 。 你会看到三行,所有的数字将与顶部相关。 我将以自己的个人电脑为例:

      total used free shared buffers cached Mem: 8070 7747 323 0 253 5713 -/+ buffers/cache: 1780 6290 Swap: 5055 0 5055 

    Mem行以MB $n total显示了总RAM( $n total在顶部),使用了多less( $n used在顶部使用),多less空闲( $n free在顶部),共享多less(忽略)现在是最好的部分! free -mbufferscached列与可预测的$n buffers$n cache 。 但是看看free -m的第二行,它以-/+ buffers/cache:开头。 math表明使用的数量实际上是(总计) – ((used-buffers)-cached)。 免费(总计) – (新使用)。

    这是什么意思? 这意味着Linux吃了你的RAM! 简而言之,Linux内核吞噬了RAM,因为它可用于磁盘caching。 除非你想编译一个定制的内核,否则你无能为力。 专业提示:不要。

    内存真的在那里,可以随意使用。 这就是free -m-/+ buffers/cache:行的含义。 但是,你在非Hyper-visor虚拟化容器内部,这使得事情有点松动。 在这一点上,你无法用字节的精度来评估你的内存。 但是,你没有看到任何exception的行为。

    保持冷静并进行。 另外,得到一个物理服务器(除非你喜欢内存统计,看起来像Kreskin是你的系统pipe理员)。

    顶部不是检查内存使用情况的最佳方法。 然而,由于我的问题被标记为这个问题的重复,我将在这里发布我的决议。

    我在论坛上看到ps_mem.py会检查你的内存使用情况。

    储存库: https : //github.com/pixelb/ps_mem/

    下载:

     pip install ps_mem 

    用法:

     ps_mem 

    输出:

     # ps_mem Private + Shared = RAM used Program 4.0 KiB + 15.5 KiB = 19.5 KiB udevd 4.0 KiB + 16.0 KiB = 20.0 KiB mysqld_safe 4.0 KiB + 25.5 KiB = 29.5 KiB dbus-daemon 4.0 KiB + 27.5 KiB = 31.5 KiB xinetd 60.0 KiB + 14.5 KiB = 74.5 KiB epmd 108.0 KiB + 23.0 KiB = 131.0 KiB init 8.0 KiB + 135.0 KiB = 143.0 KiB saslauthd (2) 180.0 KiB + 34.0 KiB = 214.0 KiB check_scripts.s 796.0 KiB + 41.0 KiB = 837.0 KiB bash 528.0 KiB + 359.0 KiB = 887.0 KiB crond (7) 1.2 MiB + 218.0 KiB = 1.4 MiB sshd (2) 1.6 MiB + 45.0 KiB = 1.6 MiB rsyslogd 2.0 MiB + 133.0 KiB = 2.1 MiB beam.smp 1.3 MiB + 2.3 MiB = 3.6 MiB httpd (8) 12.8 MiB + 956.0 KiB = 13.8 MiB sendmail.sendmail (7) 53.5 MiB + 114.0 KiB = 53.7 MiB mysqld 317.6 MiB + 2.3 MiB = 320.0 MiB python (6) --------------------------------- 398.5 MiB =================================