htop 报告的内存使用量比 free 或 top 高得多

htop 报告的内存使用量比 free 或 top 高得多

以下三项产出基本上是同时获得的:

顶部:

top - 02:54:36 up 2 days, 13:50,  3 users,  load average: 0.05, 0.05, 0.09
Tasks: 181 total,   1 running, 179 sleeping,   0 stopped,   1 zombie
%Cpu(s):  2.5 us,  0.8 sy,  0.0 ni, 96.6 id,  0.1 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:  16158632 total, 11234480 used,  4924152 free,      844 buffers
KiB Swap: 16777212 total,        0 used, 16777212 free, 10640832 cached

自由-h:

             total       used       free     shared    buffers     cached
Mem:           15G        10G       4.7G         0B       844K        10G
-/+ buffers/cache:       578M        14G
Swap:          15G         0B        15G

顶部: 顶部

free 和 top 似乎同意。顶部使用了 11234480 KiB,减去缓存的 10640832 KiB 得到 579.7 MiB,这非常接近使用的 +/- 缓冲区/缓存下的免费报告。

然而 htop 报告使用了 1836 (MiB),据我所知,这既不存在也不存在。这种差异从何而来? htop 显然不包括缓存的数据,但它报告的内存使用量仍然是 free 或 top 的三倍多。

我知道有很多类似的问题,但我还没有遇到一个可以解释这种差异的问题(困惑通常似乎只是有/没有缓存计数)。

编辑:我应该提到我正在运行 openSUSE,并且我在版本 12.2 和 12.3 RC1 中看到了同样的差异。

Edit2: htop 包含的版本是 1.0.1。我还从源代码编译了 1.0.2 版本,然后也看到了相同的差异。

答案1

完全重写我之前的帖子。有点好奇并进一步查看。

简而言之:造成差异的原因是 openSUSE 使用了修补版本顶部自由的这增加了一些额外的价值‘缓存’


A) 标准版

顶部, 免费, htop, ...:

使用量是通过读取来计算的数据来自 /proc/meminfo:

例如:

#free:
Row   Column  | Corresponding /proc/meminfo entry
-----|--------|----------------------------------
Mem:

      total   : MemTotal
      used    : MemTotal - MemFree
      free    : MemFree
      shared  : MemShared
      buffers : Buffers
      cached  : Cached
-----|--------|----------------------------------
-/+ buffers/cache:

      used    : (MemTotal - MemFree) - (Buffers + Cached)
      free    :  MemFree             + (Buffers + Cached)

#htop:
    Used U*   : ((MemTotal - MemFree) - (Buffers + Cached)) / 1024

*我使用Used U用户模式使用的内存名称。阿卡使用减去(缓存+缓冲区)

所以实际上使用相同的计算。

htop在内存仪表中显示以下内容:

[Used U % of total | Buffers % of total | Cached % of total ] UsedU MB

(MB 实际上是 MiB。)


B) 补丁版本

freeDebian 、Fedora、openSuse 的基础topprocps-ng。然而,每种风格都会添加自己的补丁,这些补丁可能会或可能不会成为主项目的一部分。

在 openSUSE 下我们发现顶级/免费(procps)包的各种添加。这里需要注意的是一些用于表示缓存值的附加值。(我没有在上一篇文章中包含这些,因为我的系统使用“干净”的过程。)

B.1) 补充

在 /proc/meminfo 中我们有板坯这是内核数据结构缓存。作为一个子类别,我们发现S可回收它是 Slab 的一部分,可以被内核和用户模式回收以供其他用途。

进一步我们有交换缓存这是曾经被换出的内存,被换入但也在交换文件中。因此,如果需要再次更换它,这已经完成了。

最后还有NFS_不稳定这是发送到服务器但尚未提交到稳定存储的页面。

cacheopenSUSE 补丁版本中添加了以下值:

SReclaimable
SwapCached
NFS_Unstable

(此外还有一些检查,总数必须大于空闲,已用必须大于缓冲区+缓存等。)

B.2) 结果

看着自由的,因此以下值相同: total, used, free and buffers

更改如下: cached and "+/- buffers".

used    = MemTotal - MemFree

old:
    cached         : Cached
    +-/buffers-used: used - (Buffers + Cached)
    +/-buffers-free: free + (Buffers + Cached)

patched:
    cached         : Cached + SReclaimable + SwapCached + NFS_Unstable
    +/-buffers-used: used - (Buffers + Cached + SReclaimable +
                     SwapCached + NFS_Unstable)
    +/-buffers-free: free + (Buffers + Cached + SReclaimable +
                     SwapCached + NFS_Unstable)

进行相同的添加顶部

顶部没有改变,因此仅与旧的/或未修补的顶级/免费版本保持一致。

相关内容