GNU/Linux >> Linux の 問題 >  >> Linux

ディストリビューション間で移植可能な使用可能なメモリの量を取得するにはどうすればよいですか?

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

変数に格納される結果はバイト単位です。


Linux
  1. Linux –ディストリビューション間で移植可能なメモリの量を取得するにはどうすればよいですか?

  2. Pythonで(MB)ファイルのtar.gzのサイズを取得する方法

  3. コピーで使用するキャッシュを制限して、他のキャッシュに使用できるメモリを残すにはどうすればよいですか?

  1. ファイルの各行の先頭に文字列を追加するにはどうすればよいですか?

  2. bashでファイルの絶対ディレクトリを取得するにはどうすればよいですか?

  3. ファイルの行数だけを取得する方法

  1. システムが ~/.screenrc ファイルを使用していることを確認するにはどうすればよいですか?

  2. ディレクトリツリーで最も古いファイルを見つけるにはどうすればよいですか

  3. コマンドラインから Dropbox ファイルの URL を取得するには?