Memory

htop 報告的記憶體使用量比 free 或 top 高得多

  • March 27, 2018

以下三個輸出基本上是同時進行的:

最佳:

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

頂部: htop

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

完全重寫了我之前的文章。有點好奇並進一步檢查。

簡而言之:差異的原因是 openSUSE 使用了top和*free的更新檔版本,它為**`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

*我正在使用Used U使用者模式使用的記憶體名稱。Aka Used 減號 (Cached + Buffers)

所以實際上使用相同的計算。

htop在記憶體表中顯示以下內容:

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

(MB 實際上是 MiB。)


B) 更新檔版本

freeDebian、Fedora 、 openSuse 的基礎topprocps-ng。但是,每種風味都添加了自己的更新檔,這些更新檔可能會或可能不會成為主項目的一部分。

在 openSUSE 下,我們發現top/free (procps) 包的各種附加功能。這裡要注意的是一些用於表示記憶體值的附加值。(我沒有在我之前的文章中包含這些,因為我的系統使用“乾淨”的 procps。)

B.1) 補充

在 /proc/meminfo 我們有Slab,它是核心資料結構記憶體。作為一個子類別,我們發現SReclaimable它是 Slab 的一部分,可能會被核心和使用者模式回收用於其他用途。

此外,我們還有SwapCached,它是曾經被換出、被換入但也在交換文件中的記憶體。因此,如果需要再次更換它,這已經完成了。

最後是NFS_Unstable,它們是發送到伺服器但尚未送出到穩定儲存的頁面。

cache在 openSUSE 更新檔版本中添加了以下值:

SReclaimable
SwapCached
NFS_Unstable

(此外還有一些檢查,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)

對top進行了相同的添加。

htop沒有改變,因此只與舊版本/或未修補版本的 top/free 對齊。

引用自:https://unix.stackexchange.com/questions/65835