
シェルに と入力すると、メモリが不足するまで永遠に書き込みを試行するため、x=`yes`
最終的には が表示されます。カーネルの OOM-killer が割り当てるバイトがもうないため、すぐに終了する必要があると通知するため、メッセージが表示されます。cannot allocate 18446744071562067968 bytes (4295032832 bytes allocated)
yes
x
cannot allocate <memory>
xrealloc
しかし、リソースが不足しているために存在しないグラフィック メモリをさらに割り当てるように要求するとgame_engine
、代わりに RAM と CPU が要求されたメモリを割り当てます。
カーネルの OOM キラーは、game_engine
の場合のように、大量のメモリを割り当てようとする試みをなぜ捕捉しないのでしょうかx=`yes`
?
つまり、実行中でありgame_engine
、ユーザーが memory-hog 以降に新しいプロセスを生成していない場合game_engine
、なぜgame_engine
OOM-killer がシステムを強制終了することなく、常にシステムを応答なし、回復不能な状態にすることができるのでしょうか?
ゲーム エンジンを例に挙げるのは、ゲーム エンジンが私の貧弱な統合カードに大量のメモリを割り当てる傾向があるためですが、これは多くのリソースを大量に消費する X プロセスで発生するようです。
OOM キラーが効果がない、またはプロセスのメモリを取り消すことができないケースはありますか?
答え1
実際のところ、OOM キラーに対する最善の解決策は、それを持たないことです。オーバーコミットされたメモリを使用しないようにシステムを構成し、それに依存するアプリケーションやライブラリの使用を拒否します。ディスクが無限にある今日、なぜ無限のスワップを提供しないのでしょうか? メモリが使用されない限り、スワップにコミットする必要はありませんよね?
質問に対する答えは、OOM キラーがあなたが考えているようには動作しないということかもしれません。OOM キラーはヒューリスティックを使用してどのプロセスを強制終了するかを選択しますが、そのルールは必ずしも最後の要求者が終了することを意味しません。Cf.OOMキラーの抑制したがって、これは OOM キラーが「効果がない」という問題ではなく、むしろ、望ましい選択以外の選択を行うという問題です。