web-dev-qa-db-ja.com

LinuxでOOMキラーの死を免れる

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

OOMキラーの問題は、他のキラーと同じです。表面的には正気で合理的に見えるかもしれませんが、実際には深刻な混乱を招き、非常に狂気であり、正しい判断を下すことができないことがよくあります。

今、私は何が起こっているのかを知っていて、犠牲者を一定に制御している限り(人々を落ち着かせ、私はコンピューターのことについて話している)、個人的に少し殺しても構わないので、保護するためのより良い方法を探しています恐ろしいOOMキラーに対する特定のプロセス。これにより、すべてのプログラムが実行されるたびに、または新しいプログラムを開始するたびにスクリプトを実行する必要がなくなります。これを簡単に達成する方法についてのアイデアはありますか?

6
Waxhead

プロセスの管理をOOMキラーに頼るべきではありません。 OOM killerは、他の唯一の選択肢がシステムクラッシュである場合の、最後の手段です。例えば。すべてのキャッシュとディスクバッファのメモリがフラッシュされてコミットされ、スワップアウト/破棄できるものはすべて処理されますが、まだ十分なメモリがありません...明らかに、実行中のシステムがこの状態に達することは望ましくありません。

OOMキラーが動作する厳格な制約(より多くのメモリを割り当てることができない、他のプロセスでスワップできないなど)のため、それはあなたがしないプロセスを殺します記憶のプレッシャーを和らげるために殺されたくない。

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

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

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

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

いずれにせよ、OOMキラーはあなたの友達ではありません、それは緩い大砲です:-/

6
haimg