子プロセスの代わりに親プロセスを終了するようにLinux OOM Killerを設定する方法はありますか?

子プロセスの代わりに親プロセスを終了するようにLinux OOM Killerを設定する方法はありますか?

子プロセスの代わりに親プロセスを終了するようにLinux OOM Killerを設定する方法はありますか?子プロセスが終了すると、親プロセスは引き続き無効な状態で実行されます。子プロセスが終了したかどうかを検出して終了できますが、OOMキラーに子プロセスを犠牲にするのではなく、親プロセスを終了するように指示する方法があるかどうか疑問に思います。

ベストアンサー1

ダミーファイルの値を変更して、特定のプロセスがOOM Killerの被害者として選択される確率を調整できます/proc/<pid>/oom_score_adj。値が 1000 に近いほど、OOM Killer がプロセスを選択する可能性が高くなります。

被害者を選択するためにOOM Killerが使用するロジックは、さまざまなカーネルバージョンで変更されました。最新のカーネルバージョンは、デフォルトで子プロセスを終了することを好みます。一般的なエラーの状況は、Web サーバーがワーカー プロセスを開始し、エラーが発生した場合、単一のワーカー プロセスが制御外でメモリを消費し始めることであるため、最善の修正措置は子プロセスを終了することです。子プロセスと家庭の親プロセスは、子プロセスが終了したことがわかったら、この状況を処理できます。 Apacheの場合、特定のサブプロセスの失敗を記録し、実行を続けます。一方、PostgreSQL(LinuxカーネルのApacheによく似ています!)は、子プロセスが終了したことを確認し、自動的に他のすべての子プロセスを終了し、親プロセスを再起動して、システム全体の状態が完全にわかっていることを確認します。どちらの場合も、唯一の親プロセスを終了しても良い結果は得られません。複数のタブ(各タブが別々のサブプロセスとして実行されている)を持つGoogle Chromeも同様に機能します。 RAMが不足している1つのタブがブラウザ全体のクラッシュを引き起こさない。

問題は、oom_score_adjこれがOOMキラーの選択ロジックの乗数ではなく、プロセスに対して計算されたシステム全体のRAMの追加の1000分の1であることです。たとえば、32 GBのRAMがあり、Chromeタブのoom_score_adj値が300(Google Chromeホストプロセスによって自動的に設定されます)で、タブが実際に105 MBのRAMを消費している場合、そのタブは間違いなくOOMの犠牲者として選択されます。 OOM Killer の起動時に被害者が発生した場合、カーネル OOM Killer の実装は現在、その Chrome サブアイテムの「論理メモリ使用量」を 105MB+300/1000*32GB=9705MB と計算します。明らかに、システムはプロセスを終了して9.7GBのRAMを確保しませんが、大きなプロセスがない場合は選択を続けます。

おすすめ記事