Linux
如何跨發行版可移植地獲取可用記憶體量?
報告記憶體的標准文件/工具在不同的 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
:目前,可用於新工作負載的記憶體量,無需將系統推入交換狀態,可以通過
MemFree
、Active(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