Ubuntu 9.10 64 ビット サーバーを使用していますが、使用可能なメモリをすべて使い果たしているようです。munin グラフによると、使用されているメモリのほぼすべてがスワップ キャッシュ、キャッシュ、およびスラブ キャッシュにあります。(これは仮想メモリ キャッシュを意味すると解釈していますが、この推測は正しいでしょうか?)
メモリ使用量が 100% に近づくと、SSH などの一部の (すべてではない) システム サービスが遅くなり、応答しなくなります。システムを再起動すると、パフォーマンスとメモリ使用量はしばらくの間正常になります。
興味深い豆知識:
- このシステムは、Apache 2、MySQL、Munin、および sshd を実行します。
- メモリ使用量の急増は毎晩同じ時間(午後 10 時ちょうど)に発生します。
- どのユーザーの crontab にも何もないように見えます。また、/etc/cron.d/* にも、午後 10 時に発生するような異常なことは何もありません。
私の質問は、メモリ消費の原因をどうやって突き止めるかということです。通常のユーティリティ (ps、top など) を試しましたが、異常な点は見つからないようです。
何かアイデアはありますか?よろしくお願いします!
答え1
本当にメモリ関連ですか? キャッシュはすべてのメモリを消費するわけではありません。キャッシュは一時的かつ動的であり、アクティブなメモリが必要になったときに再割り当てされます。キャッシュは、処理を高速化し、そうでなければ無駄になるメモリを活用するためだけにあります。
おそらく、システムを停滞させる何か他のものがあるかどうか確認したほうがよいでしょう。Top を使用しているときに、システム負荷が高くなっていますか? 「通常」の時間と比べて、その時間はどうなっていますか? Top を CPU 使用率とアクティブ メモリ使用率に分類していますか?
iotop を実行してディスク I/O を確認し、ドライブに何か障害が発生していないか確認してみましたか?
すべての crontab はどのようになっているのでしょうか?
日中に ps のスナップショットを数回撮り、10:00 頃と比較して、どのようなプロセスが出現したかを確認しましたか?
長期的には、netstat によるネットワーク接続はどうでしょうか? その時点でシステムに出入りする何か異常なことはありましたか?
「locate」のようにシステム データベースを再構築またはインデックス付けしているようですが、その実行によってシステムが停止するほど遅くなることはありません。
答え2
メモリの使用と動作の遅さは、同じ問題の症状です。その時点で何かが発生し、システムのディスク キャッシュがスラッシングします。システムは、余分なディスク I/O を回避するためにメモリをすべて使用しますが、それでも失敗します。
これは、最近読み取られていないディスク領域に対して大量のディスク読み取りが行われる場合に最もよく発生します。最近使用されたデータで再度使用される可能性があるものはキャッシュから押し出され、再度読み取る必要があるときに、既存の読み取りフローと競合する必要があります。
大量のディスク I/O を実行するプロセスがないか確認します。たとえば、updatedb
何らかのバックアップ スクリプトなどです。自作ツールであることが判明した場合は、ディスク キャッシュをバイパスするように変更すると、他のものをキャッシュから強制的に削除しなくて済む場合があります。これにより、ionice
時間に敏感な読み取りにそれほど影響が及ばなくなる可能性があります。