Linux

如何跨發行版可移植地獲取可用記憶體量?

  • October 16, 2020

報告記憶體的標准文件/工具在不同的 Linux 發行版上似乎有不同的格式。例如,在 Arch 和 Ubuntu 上。

$ free
             total        used        free      shared  buff/cache   available
Mem:        8169312     3870392     2648348       97884     1650572     4110336
Swap:      16777212      389588    16387624


$ head /proc/meminfo 
MemTotal:        8169312 kB
MemFree:         2625668 kB
MemAvailable:    4088520 kB
Buffers:          239688 kB
Cached:          1224520 kB
SwapCached:        17452 kB
Active:          4074548 kB
Inactive:        1035716 kB
Active(anon):    3247948 kB
Inactive(anon):   497684 kB
  • Ubuntu
$ free
            total       used       free     shared    buffers     cached
Mem:      80642828   69076080   11566748    3063796     150688   58358264
-/+ buffers/cache:   10567128   70075700
Swap:     20971516    5828472   15143044


$ head /proc/meminfo 
MemTotal:       80642828 kB
MemFree:        11565936 kB
Buffers:          150688 kB
Cached:         58358264 kB
SwapCached:      2173912 kB
Active:         27305364 kB
Inactive:       40004480 kB
Active(anon):    7584320 kB
Inactive(anon):  4280400 kB
Active(file):   19721044 kB

那麼,我如何可移植地(僅跨 Linux 發行版)並可靠地獲得可供我的軟體在特定時間使用的記憶體量(不包括交換)?free大概這就是 Arch和Arch的輸出中顯示為“可用”和“MemAvailable”的內容,cat /proc/meminfo但我如何在 Ubuntu 或其他發行版中獲得相同的結果?

MemAvailable``/proc/meminfo自核心 3.14 版起包含在其中;它是由送出 34e431b0a添加的。這是您顯示的輸出變化的決定因素。送出消息指示如何在沒有以下情況下估計可用記憶體MemAvailable

目前,可用於新工作負載的記憶體量,無需將系統推入交換狀態,可以通過MemFreeActive(file)Inactive(file)SReclaimable以及來自 的“低”水印來估計/proc/zoneinfo

低水位線是系統將交換的級別。因此,在沒有MemAvailable您的情況下,您至少可以將 、 和 (以 中存在的任何一個)給出的值相加MemFree,並從Active(file)中減去低水位線。後者還列出了每個區域的可用頁面數,這可能有助於比較……Inactive(file)``SReclaimable``/proc/meminfo``/proc/zoneinfo

完整的算法在更新檔中給出meminfo.c並且看起來相當容易適應:

  • 對所有區域的低水位線求和;
  • 獲取已辨識的空閒記憶體(MemFree);
  • 減去低水位線(我們需要避免觸摸它以避免交換);
  • 添加我們可以從頁面記憶體中使用的記憶體量(和 的總和Active(file)Inactive(file):這是頁面記憶體使用的記憶體量,減去頁面記憶體的一半或低水位線,以較小者為準;
  • 添加我們可以回收的記憶體量(SReclaimable),遵循相同的算法。

因此,將所有這些放在一起,您可以通過以下方式獲得可用於新程序的記憶體:

awk -v low=$(grep low /proc/zoneinfo | awk '{k+=$2}END{print k}') \
'{a[$1]=$2}
 END{ 
  print a["MemFree:"]+a["Active(file):"]+a["Inactive(file):"]+a["SReclaimable:"]-(12*low); 
 }' /proc/meminfo 

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