データベースを実行しているUbuntu 8.04サーバーと、Javaアプリケーションサーバーの束があります。そのメモリ構成と使用法は次のとおりです。
total used free shared buffers cached
Mem: 16456176 15930028 526148 0 81372 9674196
-/+ buffers/cache: 6174460 10281716
Swap: 1951888 366100 1585788
スワップは毎晩上がり、夜に解放されることに気づきました。需要はすべての日で同じではなく、異なる時間に始まります。そのため、あいまいな「午後-夜」の境界を除いて、かなりランダムです。
このマシンの負荷は日によって異なります。午前0時から午前6時から7時の間は非常に低く、午後6時から8時まではずっと高くなります(ただし安定します)。
今、私は次の質問があります:
あなたが説明するスワップの使用パターンは意外に聞こえません。それらは、めったに使用されないページを持つ、永続的に実行されているいくつかのプロセスと一致しています。日中はアクティビティが多いため、ほとんど使用されないページがほとんど常にスワップされています。夜になると、RAMに空き容量が増えます。
各プロセスがtop
またはhtop
で使用しているさまざまな種類のメモリの量を垣間見ることができます。どちらもデフォルトではスワップの使用法を表示しませんが、どちらも(top:f
を押してSWAP
列をオンにするように構成できます; htop:を押す F2、NSWAP
列を追加します)。特定のプロセスに関する詳細情報は、cat /proc/12345/vmstat
を使用して取得できます。ここで、12345
はプロセスIDです。一部のページは複数のプロセスで共有されているため、「プログラムが使用しているスワップの量」は完全には定義されていないことに注意してください。
RAMの競合相手には、主に2種類あります。プロセスメモリ(スワップアウト可能)とディスクキャッシュ(ファイルから再読み取り可能)です。常にディスクキャッシュよりもプロセスメモリを優先する理由はありません。ファイルを何度もメモリに読み込み続けるよりも、プロセスメモリのほとんど使用されない部分をスワップアウトする方が適切です。メモリの約半分(30%〜70%など)をディスクキャッシュに割り当てた場合の数値は、RAMすることになっています。
vmstat
、free
、top
などのツールの出力をポーリングおよび解析しない場合、調べるのに最適な場所は、システム上のrootユーザーまたは他のユーザーのcrontabです。システムに対する一般的な負荷が特定の時間に確実に急上昇する場合は、リソースの必要性を生み出すプロセスがcronにある可能性があります。それ以外の場合は、常にscript
ユーティリティを使用してゲットースローアウェイロギングユーティリティを作成できます。このユーティリティは、STDOUTに送信されるすべてのものを記録するだけです。
したがって、後で検査するために出力をキャッチするために1回限りの使い捨てスクリプトを実行する必要がある場合は、1つのターミナルで次のように入力します。
script /tmp/free.txt
その後
while (true); do date; free; sleep 30; done
そして別のターミナルで
script /tmp/top.txt
その後
while (true); do date; top -n 1; sleep 30; done
そして翌朝、両方のscript
呼び出しを強制終了し、top
とfree
の出力を一致させます
もう一度、これはゲットーのアプローチですが、1回限りで十分なようです。
あなたも読みたいかもしれません buntu swapガイド
StackOverflowでは、最初の質問(「実際にどのプロセスが実際にswapを使用していますか?」)に対する優れた回答があります。
https://stackoverflow.com/a/7180078/1442301
簡単に言えば、top
やhtop
などのツールは、スワップの使用に関する正確な情報をまったく提供しません。より正確な情報を取得するには、/proc
フォルダー(疑似ファイル/proc/$PID/smaps
内)に飛び込む必要があります。
上記の post には、この情報を適切にエコーするための短いシェルスクリプトが含まれています。