web-dev-qa-db-ja.com

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

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

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

この状況でメモリが不足するとどうなりますか? OOM killerはどのプロセスを最初に強制終了するかをどのように決定しますか?

100
Ramesh

プロセスがメモリを使い果たし、システムの安定性を脅かす可能性がある場合は、OOMキラーが問題になります。

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

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

主な目的は、実行するダメージを最小限に抑え、同時に解放されるメモリの量を最大化する、最小限の数のプロセスを強制終了することです。

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

$ cat /proc/10292/oom_score

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

OOM_Scoreはどのように計算されますか?

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

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

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

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

参照

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

119
Ramesh