コアダンプを取得する方法、またはoom-killerによって強制終了されたプロセスをデバッグできる方法はありますか?
または、代わりにABRTを使用してプロセスを強制終了するようにoom-killerを設定しますか?
別のアプローチは、メモリのオーバーコミットを無効にすることです。
健全性の類似性をメモリ管理に復元するには:
- OOMキラーを無効にします(/etc/sysctl.confに_
vm.oom-kill = 0
_を入れます)- メモリのオーバーコミットを無効にする(_
vm.overcommit_memory = 2
_に_/etc/sysctl.conf
_を挿入)これらの設定により、Linuxは従来の方法で動作します(プロセスが利用可能なメモリよりも多くのメモリを要求する場合、
これは3値であることに注意してください:malloc()
は失敗し、メモリを要求するプロセスはその失敗に対処することが期待されます)。
- 0 =「十分なRAMがある場合の見積もり」
- 1 =「常にはい」
- 2 =「記憶がない場合はノーと言う」
これにより、アプリケーションはメモリ自体の不足を処理するように強制され、おそらくそのログ/コアダンプ/などが何か有用なものになる可能性があります。
注:システムのメモリが不足すると、新しいプロセスを生成できなくなります!システムからロックアウトされている可能性があります。
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キラーがメモリを消費するタスクを実際に強制終了するたびに表示されます。