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
スティーブンの答えは完全に十分であり、注意が必要ですが、最小限の比較を含む完全なロジックを書き出すことにしました。情報は最初に /proc/meminfo から読み取られ、メモリの詳細が一貫するように変数に格納されます。
LOW_WATERMARK=$(awk '$1 == "low" {LOW_WATERMARK += $2} END {print LOW_WATERMARK * 4096}' /proc/zoneinfo)
MEMINFO=$(</proc/meminfo)
MEMINFO_MEMFREE=$(echo "${MEMINFO}" | awk '$1 == "MemFree:" {print $2 * 1024}')
MEMINFO_FILE=$(echo "${MEMINFO}" | awk '{MEMINFO[$1]=$2} END {print (MEMINFO["Active(file):"] + MEMINFO["Inactive(file):"]) * 1024}')
MEMINFO_SRECLAIMABLE=$(echo "${MEMINFO}" | awk '$1 == "SReclaimable:" {print $2 * 1024}')
MEMINFO_MEMAVAILABLE=$((
MEMINFO_MEMFREE - LOW_WATERMARK
+ MEMINFO_FILE - ((MEMINFO_FILE/2) < LOW_WATERMARK ? (MEMINFO_FILE/2) : LOW_WATERMARK)
+ MEMINFO_SRECLAIMABLE - ((MEMINFO_SRECLAIMABLE/2) < LOW_WATERMARK ? (MEMINFO_SRECLAIMABLE/2) : LOW_WATERMARK)
))
if [[ "${MEMINFO_MEMAVAILABLE}" -le 0 ]]
then
MEMINFO_MEMAVAILABLE=0
fi
変数に格納される結果はバイト単位です。