Ubuntu 12.04サーバーでOOMの状況をデバッグしようとしていて、Landscapeのメモリグラフを見ると、深刻なメモリ使用量のスパイクがないことに気付きました。それからfree
コマンドの出力を見ましたが、両方のメモリ使用量の結果が互いにどのように関係しているかはよくわかりませんでした。
サーバー上のランドスケープの出力は次のとおりです。
$ landscape-sysinfo
System load: 0.0 Processes: 93
Usage of /: 5.6% of 19.48GB Users logged in: 1
Memory usage: 26% IP address for eth0: -
Swap usage: 2%
それからfree
コマンドを実行すると、次の結果が得られます。
$ free -m
total used free shared buffers cached
Mem: 486 381 105 0 4 165
-/+ buffers/cache: 212 274
Swap: 255 7 248
2%のスワップ使用量は理解できますが、26%のメモリ使用量はどこから来ますか?
landscape-sysinfo
は、実際に/proc/meminfo
からデータを直接取得します。
dpb@helo:~$ cat /proc/meminfo |egrep 'MemTotal:|Active:'
MemTotal: 12286760 kB
Active: 3794832 kB
dpb@helo:~$
この場合の「メモリ使用量」の計算は次のようになります。
((MemTotal - Active) / MemTotal) * 100
これらの計算は次の場所で確認できます。
/usr/share/pyshared/landscape/sysinfo/memory.py
/usr/share/pyshared/landscape/lib/sysstats.py
/proc/meminfo
から直接データを取得します:
free
ユーティリティは、/proc/meminfo
からデータを直接取得します。
MemTotal
MemTotal
-MemFree
MemFree
Buffers
Cached
MemTotal
-MemFree
-Buffers
-Cached
MemFree
+ Buffers
+ Cached
SwapTotal
SwapTotal
-SwapFree
SwapFree
MemTotal
+ SwapTotal
MemTotal
-MemFree
+ SwapTotal
-SwapFree
MemFree
+ SwapFree
修正されたキャッシュ-lzap
これらのグラフは、すべての単一のメモリ割り当て/解放イベントを反映しているわけではありませんが、/proc/meminfo
(正確には dpb 記述)のサンプルを一定の間隔で反映しています。グラフに表示されない理由の少し推測的な説明は、メモリ使用量がサンプリングされたポイント間で発生しただけだということです。
ここで起こったことは、いくつかのプロセスが急いで大量のメモリを獲得し、OOMキラーがサンプルを作成する前にそれを破棄したためだと思います。それはかなり極端な状況であり、また、マシン全体が激しくスワップしているため、マシン全体の動作が遅いことを意味します。マシンへのこのロードにより、システムがそのウィンドウ中にメモリ使用量をサンプリングし、Landscapeサーバーに報告するために利用可能な時間を持つ可能性が低くなります。
Dpbの正解に追加するには、メモリタイプの違いを定義する必要があります。 redhatの/ proc/meminfoのドキュメント :
使用する主な定義:
MemUsed-Buffers/Cachedよりも多くのアクティブメモリを簡単に使用できます。このシナリオは、メモリにキャッシュされているディスクの部分に頻繁にアクセスしているときに発生します。同様に、メモリを割り当てたが、その割り当てたメモリを最近使用していないプロセスを使用することもできます。メモリをさらに必要とする場合は、この割り当てられたメモリをスワップに移動することが理想的です。