Linux の OOM キラーの死から逃れる

Linux の OOM キラーの死から逃れる

少し調べてみると、/proc/pid/oom_adj に値を入力すると、特定のプロセスを調整したり、OOM キラーに対して耐性を持たせたりできることがわかりました。もちろん、pidof や pgrep などを使用してプロセスの pid を見つけ、すべてのプロセスが起動して実行されたら実行するスクリプトを作成する必要があります。

OOM キラーの問題は、他のキラーと同じです。表面上は正気で合理的に見えますが、心の奥底では深刻な精神障害を抱えており、非常に正気を失っており、正しい判断ができないことがよくあります。

個人的には、何が起こっているかわかっていて、被害者をある程度制御できる限り、多少の強制終了は気にしません (皆さん、落ち着いてください。私はコンピューター関連のことを言っているのです)。そのため、すべてのプログラムが実行されるたび、または新しいプログラムを開始するたびにスクリプトを実行する必要がないように、恐ろしい OOM キラーから特定のプロセスを保護するためのより良い方法を探しています。これを簡単に実現する方法について何かアイデアはありますか?

答え1

プロセスの管理に OOM キラーに頼るべきではありません。OOM キラーは、システム クラッシュ以外の選択肢がない場合の最後の手段です。たとえば、すべてのキャッシュとディスク バッファ メモリがフラッシュされてコミットされ、スワップ アウト/破棄できるものはすべて処理されても、まだメモリが足りない場合などです。当然、実行中のシステムがこのような状態になることは望ましくありません。

OOMキラーは厳しい制約の下で動作する(メモリを追加割り当てできない、他のプロセスにスワップできないなど)ため、意思メモリの負荷を軽減するために、終了したくないプロセスを終了します。

システムに十分なメモリがない場合は、物理メモリが不足しているか、仮想メモリの合計が不足しているかに応じて、メモリまたはスワップ領域を追加する必要があると思います。

一方、メモリ リークやその他のバグが原因で、時々メモリを大量に消費する暴走プロセスがいくつかある場合は、他の方法でそれを制御できます。

  1. 問題のあるプロセスを開始する前に設定しulimit -m、そのプロセスが割り当てることができるメモリの量を制限します。

  2. メモリ リークが発生しており、それがかなり予測可能な場合は、cron を介してスケジュールに従って問題のあるプロセスを正常に再起動します。

いずれにせよ、OOM キラーはあなたの味方ではなく、暴走する大砲です :-/

関連情報