この回答は、sysctl vm.overcommit_memory
の値に基づいて、OOM状況が発生したときにカーネルが実行するアクションを説明しています。 。
overcommit_memory
の場合 0または1に設定されているovercommit
が有効になり、プログラムは実際に使用可能なメモリよりも多くのメモリを割り当てることができます。
この状況でメモリが不足するとどうなりますか? OOMキラーはどうですか 最初に殺すプロセスを決定しますか?
承認された回答:
システムの安定性を脅かす可能性のある範囲で、メモリがプロセスによって完全に使い果たされた場合、OOMキラーが登場します。
注: カーネルが実行しようとしている残りのプロセスがスムーズに機能するために十分なメモリが解放されるまで、プロセスを強制終了し続けるのはOOMKillerのタスクです。
OOMKillerは最高のを選択する必要があります 殺すプロセス。 最高 ここでは、強制終了時に最大のメモリを解放し、システムにとって最も重要でないプロセスを指します。
主な目標は、被害を最小限に抑え、同時に解放されるメモリの量を最大化するプロセスを最小限に抑えることです。
これを容易にするために、カーネルはoom_score
を維持します プロセスごとに。 oom_score
を見ることができます /proc
内の各プロセスの pid
の下のファイルシステム ディレクトリ。
$ cat /proc/10292/oom_score
oom_score
の値が高いほど どのプロセスでも、 OOM Killerによって殺される可能性が高くなります。 メモリ不足の状況で。
OOM_Score
はどうですか 計算されましたか?
Davidのパッチセットでは、古いbadness()ヒューリスティックはほぼ完全に
なくなっています。代わりに、計算は、使用可能なメモリの何パーセントがプロセスによって使用されているかという単純な質問に変わります。
システム全体のメモリが不足している場合、「使用可能なメモリ」は
システムで使用可能なすべてのRAMとスワップスペースの合計です。代わりに、OOM状況が、特定のcpuset /コントロールグループに許可された
メモリを使い果たしたことが原因である場合、「使用可能なメモリ」は、そのコントロールグループに割り当てられた
合計量です。
メモリポリシーによって課せられた制限を超えた場合も、同様の計算が行われます。いずれの場合も、
プロセスのメモリ使用量は、その常駐セット(使用しているRAMページの数)とそのスワップ使用量の合計と見なされます。この計算により、結果として10パーセント倍の数値が生成されます。使用可能なメモリのすべてのバイトを使用している
プロセスのスコアは
1000になりますが、メモリをまったく使用していないプロセスのスコアは
ゼロになります。このスコアに対するヒューリスティックな調整はほとんどありませんが、
コードは、ルートが所有するプロセスのスコアから、わずかに多いという概念で
わずかな量(30)を差し引きます。
ユーザー所有のプロセスよりも価値があります。適用されるもう1つの微調整は、各プロセスのoom_score_adj変数に格納されている値を追加することです。これは/procを介して調整できます。
このノブを使用すると、各プロセスの魅力をOOMに調整できます。
ユーザースペースのキラー。 -1000に設定すると、OOM
キルが完全に無効になりますが、+ 1000に設定すると、関連するプロセスに
大きなターゲットをペイントするのと同じです。
参考資料
関連:ハイパフォーマンスコンピューティングでchrootを使用する場合の欠点は?http://www.queryhome.com/15491/whats-happening-kernel-starting-killer-choose-which-process https://serverfault.com/a/571326