OOMキラーはどのプロセスを最初に殺すかをどのように決定しますか?


92

この回答は、の値に基づいてOOM状況に遭遇したときにカーネルが実行するアクションを説明していますsysctl vm.overcommit_memory

overcommit_memoryが0または1に設定されている場合、overcommit有効になり、プログラムは実際に使用可能なメモリよりも多くのメモリを割り当てることができます。

この状況でメモリが不足するとどうなりますか?OOMキラーはどのプロセスを最初に殺すかをどのように決定しますか?


1
値は1と2であり、0と1ではないことを信じています。
fpmurphy 14

ここからserverfault.com/questions/606185/…、0および1が正しい値です。
ルイFリベイロ


kernel.org/doc/Documentation/vm/overcommit-accountingによると、0、1、および2はすべて有効な値です。
デレク・ルイス

回答:


109

システムの安定性を脅かす可能性のある範囲で、メモリがプロセスによって徹底的に使い果たされると、OOMキラーが姿を現します。

注:カーネルが実行しようとしているプロセスの残りの機能がスムーズに機能するために十分なメモリが解放されるまで、プロセスを強制終了し続けることがOOM Killerのタスクです。

OOM Killerは、最適なプロセスを選択して削除する必要があります。ここで最良とは、強制終了時に最大メモリを解放するプロセスを指し、システムにとって最も重要ではありません。

主な目標は、行われる損傷を最小限に抑えると同時に、解放されるメモリの量を最大化するプロセスの最小数を殺すことです。

これを容易にするために、カーネルoom_scoreはプロセスごとにを維持します。ディレクトリの下のファイルシステムoom_score内の各プロセスを確認できます。/procpid

$ cat /proc/10292/oom_score

oom_scoreプロセスの値が高いほど、メモリ不足の状況でOOM Killerによって殺される可能性が高くなります。

OOM_Score計算方法は?

Davidのパッチセットでは、古いbadness()ヒューリスティックはほぼ完全になくなりました。代わりに、計算は、使用可能なメモリの何パーセントがプロセスによって使用されているかという単純な質問に変わります。システム全体がメモリ不足の場合、「使用可能なメモリ」は、システムで使用可能なすべてのRAMとスワップスペースの合計です。

代わりに、OOM状況が特定のcpuset / controlグループに許可されたメモリを使い果たすことによって引き起こされる場合、「使用可能なメモリ」はそのコントロールグループに割り当てられた合計量です。メモリポリシーによって課せられた制限を超えた場合、同様の計算が行われます。いずれの場合も、プロセスのメモリ使用量は、常駐セット(使用しているRAMページの数)とスワップ使用量の合計と見なされます。

この計算により、結果として10倍の数値が生成されます。使用可能なメモリのすべてのバイトを使用しているプロセスは1000のスコアを持ち、メモリをまったく使用していないプロセスは0のスコアを取得します。このスコアにヒューリスティックな調整はほとんどありませんが、コードはまだ、ユーザー所有プロセスよりもわずかに価値があるという概念で、ルート所有プロセスのスコアから少量(30)を差し引きます。

適用されるもう1つの調整は、各プロセスのoom_score_adj変数に格納されている値を追加することです。これは、/ procを介して調整できます。このノブを使用すると、ユーザー空間のOOMキラーに対する各プロセスの魅力を調整できます。-1000に設定すると、OOMキルが完全に無効になりますが、+ 1000に設定すると、関連するプロセスに大きなターゲットをペイントすることに相当します。

参照資料

http://www.queryhome.com/15491/whats-happening-kernel-starting-killer-choose-which-process https://serverfault.com/a/571326


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