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


10

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

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

回答:


5

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

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

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

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

これは3値です。
  • 0 =「十分なRAMがある場合の見積もり」
  • 1 =「常にはい」
  • 2 =「記憶がない場合はノーと言う」

これにより、アプリケーションはメモリ不足を処理する必要があり、おそらくそのログ/コアダンプ/などが何か役立つものになるでしょう。

アップデート#1

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


これはひどい考えです。システムで実行されているほとんどのソフトウェアは、メモリ割り当てエラーからの戻り値を正しく処理しない可能性があります。これを行うと、コードパスが実行されて実質的に誰にも実行されなくなり、最悪の場合、これらのテストされていない予期しないコードパスが実行されることにより、システムにセキュリティの脆弱性が生じることさえあります。
KJ Tsanaktsidis

4
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キラーがメモリを消費するタスクを実際に強制終了するたびに表示されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.