web-dev-qa-db-ja.com

oom-killerによって強制終了されたプロセスのコアダンプ/デバッグを取得する

コアダンプを取得する方法、またはoom-killerによって強制終了されたプロセスをデバッグできる方法はありますか?

または、代わりにABRTを使用してプロセスを強制終了するようにoom-killerを設定しますか?

10
TrapAlice

別のアプローチは、メモリのオーバーコミットを無効にすることです。

健全性の類似性をメモリ管理に復元するには:

  1. OOMキラーを無効にします(/etc/sysctl.confに_vm.oom-kill = 0_を入れます)
  2. メモリのオーバーコミットを無効にする(_vm.overcommit_memory = 2_に_/etc/sysctl.conf_を挿入)

これらの設定により、Linuxは従来の方法で動作します(プロセスが利用可能なメモリよりも多くのメモリを要求する場合、malloc()は失敗し、メモリを要求するプロセスはその失敗に対処することが期待されます)。

これは3値であることに注意してください:
  • 0 =「十分なRAMがある場合の見積もり」
  • 1 =「常にはい」
  • 2 =「記憶がない場合はノーと言う」

これにより、アプリケーションはメモリ自体の不足を処理するように強制され、おそらくそのログ/コアダンプ/などが何か有用なものになる可能性があります。

アップデート#1

注:システムのメモリが不足すると、新しいプロセスを生成できなくなります!システムからロックアウトされている可能性があります。

5
nishantjr
echo 1 > /proc/sys/vm/oom_dump_tasks

これは、メモリ不足エラーでカーネルに表示させることができる最大値のようです。

https://www.kernel.org/doc/Documentation/sysctl/vm.txt

カーネルがOOMキリングを実行するときにシステム全体のタスクダンプ(カーネルスレッドを除く)を生成できるようにし、pid、uid、tgid、vmサイズ、rss、nr_ptes、swapents、oom_score_adjスコア、名前などの情報を含めます。これは、OOMキラーが呼び出された理由を特定し、それを引き起こした不正なタスクを特定し、OOMキラーが殺したタスクを選択した理由を特定するのに役立ちます。

これがゼロに設定されている場合、この情報は抑制されます。何千ものタスクがある非常に大規模なシステムでは、それぞれのメモリ状態情報をダンプすることは現実的ではありません。そのようなシステムは、情報が必要とされない可能性があるOOM条件でパフォーマンスの低下を強いられるべきではありません。

これがゼロ以外に設定されている場合、この情報は、OOMキラーがメモリを消費するタスクを実際に強制終了するたびに表示されます。

4
HBruijn