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

Qua*_*dom 9 memory top htop ram

以下三个输出基本上是同时进行的:

最佳:

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
Run Code Online (Sandbox Code Playgroud)

免费-h:

             total       used       free     shared    buffers     cached
Mem:           15G        10G       4.7G         0B       844K        10G
-/+ buffers/cache:       578M        14G
Swap:          15G         0B        15G
Run Code Online (Sandbox Code Playgroud)

顶: 顶

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 版,然后也看到了相同的差异。

Run*_*ium 11

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

简而言之:差异的原因是 openSUSE 使用了topfree的补丁版本,它为`cached'添加了一些额外的值。


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
Run Code Online (Sandbox Code Playgroud)

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

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

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

[Used U % of total | Buffers % of total | Cached % of total ] UsedU MB
Run Code Online (Sandbox Code Playgroud)

(MB 实际上是 MiB。)


B) 补丁版本

用于基础freetop在Debian,Fedora的,openSUSE的是是procps的-NG。但是,每种风格都会添加自己的补丁,这些补丁可能会或可能不会成为主要项目的一部分。

在 openSUSE 下,我们发现了 top/free (procps) 包的各种附加功能。这里要注意的是一些用于表示缓存值的附加值。(我没有在上一篇文章中包含这些内容,因为我的系统使用“干净”的 procps。)

B.1) 添加

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

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

最后是NFS_Unstable,它是发送到服务器但尚未提交到稳定存储的页面。

cache在 openSUSE 补丁版本中添加了以下值:

SReclaimable
SwapCached
NFS_Unstable
Run Code Online (Sandbox Code Playgroud)

(此外还有一些检查,total 必须大于 free,used 必须大于 buffers + cache 等)

B.2) 结果

查看free,结果以下值相同: 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)
Run Code Online (Sandbox Code Playgroud)

top进行相同的添加。

htop没有改变,因此只与旧的/或未打补丁的 top/free 版本保持一致。