この回答は、の値に基づいてOOM状況に遭遇したときにカーネルが実行するアクションを説明していますsysctl vm.overcommit_memory
。
overcommit_memory
が0または1に設定されている場合、overcommit
有効になり、プログラムは実際に使用可能なメモリよりも多くのメモリを割り当てることができます。
この状況でメモリが不足するとどうなりますか?OOMキラーはどのプロセスを最初に殺すかをどのように決定しますか?
この回答は、の値に基づいてOOM状況に遭遇したときにカーネルが実行するアクションを説明していますsysctl vm.overcommit_memory
。
overcommit_memory
が0または1に設定されている場合、overcommit
有効になり、プログラムは実際に使用可能なメモリよりも多くのメモリを割り当てることができます。
この状況でメモリが不足するとどうなりますか?OOMキラーはどのプロセスを最初に殺すかをどのように決定しますか?
回答:
システムの安定性を脅かす可能性のある範囲で、メモリがプロセスによって徹底的に使い果たされると、OOMキラーが姿を現します。
注:カーネルが実行しようとしているプロセスの残りの機能がスムーズに機能するために十分なメモリが解放されるまで、プロセスを強制終了し続けることがOOM Killerのタスクです。
OOM Killerは、最適なプロセスを選択して削除する必要があります。ここで最良とは、強制終了時に最大メモリを解放するプロセスを指し、システムにとって最も重要ではありません。
主な目標は、行われる損傷を最小限に抑えると同時に、解放されるメモリの量を最大化するプロセスの最小数を殺すことです。
これを容易にするために、カーネルoom_score
はプロセスごとにを維持します。ディレクトリの下のファイルシステムoom_score
内の各プロセスを確認できます。/proc
pid
$ 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