19

Linux では/proc/meminfo、多くのメモリ使用統計が表示されます。

MemTotal:      4040732 kB
MemFree:         23160 kB
Buffers:        163340 kB
Cached:        3707080 kB
SwapCached:          0 kB
Active:        1129324 kB
Inactive:      2762912 kB

それらの間にはかなりの重複があります。たとえば、私が理解している限り、アクティブなページ キャッシュ (「キャッシュ」と「アクティブ」に属する) と非アクティブなページ キャッシュ (「非アクティブ」+「キャッシュ」) が存在する可能性があります。

私がやりたいのは、「空き」メモリを測定することですが、システム全体のパフォーマンスに大きな影響を与えることなく削除される可能性が高い使用済みページが含まれるようにします。

最初は「free」+「inactive」に傾倒していたのですが、Linuxの「free」ユーティリティは「バッファ調整」表示で「free」+「cached」を使っているので、どのようなアプローチが良いのか気になります。

カーネルがメモリ不足になった場合、削除するページの優先順位と、使用可能なメモリを測定するためのより適切なメトリックは何ですか?

4

5 に答える 5

8

「使用可能なメモリ」が正確に何を意味するかは、目的によって異なり、OOMの状況を回避することが目的であるため、次のようになります。

Qt Extended(以前のQtopia)がOOMの状況をどのように予測するかを確認してください。

2つのイベントがあります:

  • (MemFree +バッファ+キャッシュ)/ MemTotal <しきい値(in /proc/meminfo
  • 主要なページ障害>しきい値(私が思うにpgmajfault /proc/vmstat

1つ目は、メモリが不足していることを早期に警告し、ページ障害のより頻繁な監視をトリガーします。2番目の信号はトラッシングを示します。これはシステムパフォーマンスを低下させ、OOMキラーが実行される良いヒントです。

于 2010-06-13T10:49:03.647 に答える
3

free最初は、「+ buffers/cache」列からの実際の出力が私が使用するものであり、通常は機能するため、質問は簡単であることがわかりました。

しかし、それが機能しない状況の 1 つは、同じブロックへの大量の読み取りがある場合です。たとえば、同じ 1 gb_file を何度も読み取る場合:

while true; do cat 1gb_file >/dev/null; done

システムに 1 GB を超えるキャッシュがある場合、これは高速に実行されます。しかし、そのキャッシュの一部を別の用途に使用し始めると、システムのパフォーマンスが大幅に低下します。

したがって、ソリューションを評価するときは、上記を試して、ソリューションがそれを考慮しているかどうかを確認してください。

于 2010-06-13T14:50:11.907 に答える
2

どのページがドロップされた場合に、システムが「システム全体のパフォーマンスに重大な影響」を与えるかを測定するのは難しいと思います. ユーザー プロセスで使用中のページは、(合計) - (空き + キャッシュ + ページ) になります。第 2 項は、必要に応じてカーネルが解放できるすべてのメモリです。ただし、キャッシュとページに使用されているメモリ ページを解放すると、システム全体のパフォーマンスに大きな影響を与えます。

ヒューリスティックを使用する場合は、「非アクティブ」の値を取得する必要があると思います。これは、「空いていて使用可能な、キロバイト単位のバッファまたはページ キャッシュ メモリの合計量です。これは、使用可能なメモリです。最近使用されていないため、他の目的に再利用できます。」あなたがそれを取り、システムが引き続き正常に動作することがわかった場合、システムが最近いくつかのページを使用した可能性があるため、推測として「アクティブ」の割合を見積もることができますが、それらを再び使用するつもりはありません. あなたは私よりもシステムについてよく知っています。システムがあなたがやろうとしていることすべてに専念している場合、すぐに使用される可能性のある Active のページとキャッシュされたファイルは、システムが最近別の目的で使用されたかどうかによって異なります。

于 2010-06-11T17:53:30.347 に答える
2

私は以下を使用します:

FREE_KB = MemFree + Buffers + Cached

FREE_KB=$(($(echo `sed -n '2p;3p;4p' <  /proc/meminfo | sed "s/ \+/ /g" | cut -d' ' -f 2 ` | sed "s/ /+/g")))


USED_KB = MemTotal - MemFree - Buffers - Cached

USED_KB=$(($(echo `head -n4 /proc/meminfo | sed "s/ \+/ /g" | cut -d' ' -f 2 ` | sed "s/ /-/g")))
于 2013-06-18T13:32:14.550 に答える