web-dev-qa-db-ja.com

OOM-Killerのフォレンジック分析

UbuntuのOut-Of-MemoryKillerは私のサーバーに大混乱をもたらし、私のアプリケーション、sendmail、Apacheなどを静かに暗殺しました。

私はなんとかOOMKillerとは何か、そしてその「悪さ」のルールについて学ぶことができました。私のマシンは小さいですが、アプリケーションはさらに小さく、通常、スワップスペースは言うまでもなく、物理メモリの半分しか使用されていないので、驚きました。犯人を突き止めようとしていますが、OOM-Killerログの読み方がわかりません。

ログのデータを読み取る方法(vefreegenとは何ですか?)に関するチュートリアルを教えてもらえますか、またはこれらのログの解析を手伝ってもらえますか?

Apr 20 20:03:27 EL135 kernel: kill_signal(13516.0): selecting to kill, queued 0, seq 1, exc 2326 0 goal 2326 0...
Apr 20 20:03:27 EL135 kernel: kill_signal(13516.0): task ebb0c6f0, thg d33a1b00, sig 1
Apr 20 20:03:27 EL135 kernel: kill_signal(13516.0): selected 1, signalled 1, queued 1, seq 1, exc 2326 0 red 61795 745
Apr 20 20:03:27 EL135 kernel: kill_signal(13516.0): selecting to kill, queued 0, seq 2, exc 122 0 goal 383 0...
Apr 20 20:03:27 EL135 kernel: kill_signal(13516.0): task ebb0c6f0, thg d33a1b00, sig 1
Apr 20 20:03:27 EL135 kernel: kill_signal(13516.0): selected 1, signalled 1, queued 1, seq 2, exc 383 0 red 61795 745
Apr 20 20:03:27 EL135 kernel: kill_signal(13516.0): task ebb0c6f0, thg d33a1b00, sig 2
Apr 20 20:03:27 EL135 kernel: OOM killed process watchdog (pid=14490, ve=13516) exited, free=43104 gen=24501.
Apr 20 20:03:27 EL135 kernel: OOM killed process tail (pid=4457, ve=13516) exited, free=43104 gen=24502.
Apr 20 20:03:27 EL135 kernel: OOM killed process ntpd (pid=10816, ve=13516) exited, free=43104 gen=24503.
Apr 20 20:03:27 EL135 kernel: OOM killed process tail (pid=27401, ve=13516) exited, free=43104 gen=24504.
Apr 20 20:03:27 EL135 kernel: OOM killed process tail (pid=29009, ve=13516) exited, free=43104 gen=24505.
Apr 20 20:03:27 EL135 kernel: OOM killed process Apache2 (pid=10557, ve=13516) exited, free=49552 gen=24506.
Apr 20 20:03:27 EL135 kernel: OOM killed process Apache2 (pid=24983, ve=13516) exited, free=53117 gen=24507.
Apr 20 20:03:27 EL135 kernel: OOM killed process Apache2 (pid=29129, ve=13516) exited, free=68493 gen=24508.
Apr 20 20:03:27 EL135 kernel: OOM killed process sendmail-mta (pid=941, ve=13516) exited, free=68803 gen=24509.
Apr 20 20:03:27 EL135 kernel: OOM killed process tail (pid=12418, ve=13516) exited, free=69330 gen=24510.
Apr 20 20:03:27 EL135 kernel: OOM killed process python (pid=22953, ve=13516) exited, free=72275 gen=24511.
Apr 20 20:03:27 EL135 kernel: OOM killed process Apache2 (pid=6624, ve=13516) exited, free=76398 gen=24512.
Apr 20 20:03:27 EL135 kernel: OOM killed process python (pid=23317, ve=13516) exited, free=94285 gen=24513.
Apr 20 20:03:27 EL135 kernel: OOM killed process tail (pid=29030, ve=13516) exited, free=95339 gen=24514.
Apr 20 20:03:28 EL135 kernel: OOM killed process Apache2 (pid=20583, ve=13516) exited, free=101663 gen=24515.
Apr 20 20:03:28 EL135 kernel: OOM killed process logger (pid=12894, ve=13516) exited, free=101694 gen=24516.
Apr 20 20:03:28 EL135 kernel: OOM killed process bash (pid=21119, ve=13516) exited, free=101849 gen=24517.
Apr 20 20:03:28 EL135 kernel: OOM killed process atd (pid=991, ve=13516) exited, free=101880 gen=24518.
Apr 20 20:03:28 EL135 kernel: OOM killed process Apache2 (pid=14649, ve=13516) exited, free=102748 gen=24519.
Apr 20 20:03:28 EL135 kernel: OOM killed process grep (pid=21375, ve=13516) exited, free=132167 gen=24520.
Apr 20 20:03:57 EL135 kernel: kill_signal(13516.0): selecting to kill, queued 0, seq 4, exc 4215 0 goal 4826 0...
Apr 20 20:03:57 EL135 kernel: kill_signal(13516.0): task ede29370, thg df98b880, sig 1
Apr 20 20:03:57 EL135 kernel: kill_signal(13516.0): selected 1, signalled 1, queued 1, seq 4, exc 4826 0 red 189481 331
Apr 20 20:03:57 EL135 kernel: kill_signal(13516.0): task ede29370, thg df98b880, sig 2
Apr 20 20:04:53 EL135 kernel: kill_signal(13516.0): selecting to kill, queued 0, seq 5, exc 3564 0 goal 3564 0...
Apr 20 20:04:53 EL135 kernel: kill_signal(13516.0): task c6c90110, thg cdb1a100, sig 1
Apr 20 20:04:53 EL135 kernel: kill_signal(13516.0): selected 1, signalled 1, queued 1, seq 5, exc 3564 0 red 189481 331
Apr 20 20:04:53 EL135 kernel: kill_signal(13516.0): task c6c90110, thg cdb1a100, sig 2
Apr 20 20:07:14 EL135 kernel: kill_signal(13516.0): selecting to kill, queued 0, seq 6, exc 8071 0 goal 8071 0...
Apr 20 20:07:14 EL135 kernel: kill_signal(13516.0): task d7294050, thg c03f42c0, sig 1
Apr 20 20:07:14 EL135 kernel: kill_signal(13516.0): selected 1, signalled 1, queued 1, seq 6, exc 8071 0 red 189481 331
Apr 20 20:07:14 EL135 kernel: kill_signal(13516.0): task d7294050, thg c03f42c0, sig 2

ウォッチドッグはウォッチドッグタスクであり、アイドル状態でした。ログには、何日も何もしていないことを示すものは何もありません。その仕事は、アプリケーションの1つが死んだ場合に再起動することです。少し皮肉なことに、最初に殺されるのは皮肉なことです。

Tailはいくつかのログファイルを監視していました。狂ったようにメモリを消費する可能性は低いです。

Apache Webサーバーは、次のページのみを提供します 日曜日に教会に行くためだけにそれを使う小さなおばあさん ベッドで眠っていて、数週間サイトのページにアクセスしていなかった開発者のカップル。それが持っていたかもしれない唯一のトラフィックは、ポートスキャナーからのものです。すべてのコンテンツはパスワードで保護されており、どこからもリンクされていないため、スパイダーは関心がありません。

Pythonは2つの別々のカスタムアプリケーションを実行しています。ログには、通常どおりにハミングしていなかったことを示すものはありません。それらの1つは比較的最近の実装であり、疑わしい#1になります。重要なデータ構造はなく、通常、物理RAW全体の約8%しか使用しません。それ以来、誤動作はありません。

Grepは容疑者#2であり、1回限りのコマンドだったので、私が有罪になりたいと思っています。コマンド(grep -rの出力を別のgrepにパイプする)は少なくとも30分前に開始されており、まだ実行されているという事実は疑わしいものです。ただし、grepが大量のメモリを使用することはないと思いました。 OOMキラーがそれに到達するのにしばらく時間がかかりました。これは、それが狂っていなかったことを示唆していますが、OOMキラーは殺されると停止し、最終的にOOMキラーの血の欲望を満足させたのは記憶を奪ったものだった可能性があります。 。

7
Oddthinking

私はServerFaultを初めて使用し、この投稿を見たばかりです。古いものの、列の先頭近くに再浮上したようです。この怖いものを寝かせましょう。

まず、限られたRAMでシステムを最適化して、多くのユーザープロセスを安全な方法で実行するため、このトピックに関心があります。

このログのエラーメッセージはOpenVZLinuxコンテナを参照していると思います。

「ve」は仮想環境であり、OpenVZではコンテナーとも呼ばれます。各コンテナにはIDが割り当てられており、表示されている番号はそのIDです。これについての詳細はこちら:

https://openvz.org/Container

「空き」という用語は、その時点でのバイト単位の空きメモリを指します。プロセスが強制終了されると、空きメモリが徐々に増加することがわかります。

「gen」という用語は少しわかりません。これは世代のことだと思います。つまり、1から始まり、コンテナ内のプロセスが生成されるたびに1ずつ増加します。したがって、お使いのシステムでは、起動後に24K以上のプロセスが実行されたようです。私が間違っている場合は私を訂正してください。それは簡単にテストできるはずです。

プロセスが強制終了された理由については、OOMキラー構成が原因です。空きメモリを予想される量(128 Kbのように見えます)に戻そうとしています。オラクルには、これをより良いものに構成する方法についての優れた記述があります。

http://www.Oracle.com/technetwork/articles/servers-storage-dev/oom-killer-1911807.html

さらに、各コンテナのメモリ構成を確認したい場合は、以下を確認してください。

https://openvz.org/Setting_UBC_parameters

1
Zahnon