メモリを報告する標準のファイル/ツールは、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
の出力で「利用可能」および「MemAvailable」として表示されるものです。 およびcat /proc/meminfo
Archで使用できますが、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