web-dev-qa-db-ja.com

カーネルoomスコアはどのように計算されますか?

Googleを調べたところ、proc/<pid>/oom_scoreのスコアの計算方法を説明するものは見つかりませんでした。使用された合計メモリを使用するのではなく、なぜこのスコアを使用するのですか?

12
James Kingsbery

当時の実装については、Goldwyn Rodriguesの 2009の記事 を参照してください。現在の動作はJonathan Corbetの 2010の記事 であり、Jonathan Corbetの 2013の記事 を参照してください。 =将来の変更についてのアイデア。

2010年の記事から:

Davidのパッチセットでは、古いbadness()ヒューリスティックがほぼ完全になくなりました。代わりに、計算は、利用可能なメモリの何パーセントがプロセスによって使用されているかという単純な質問に変わります。システム全体のメモリが不足している場合、「使用可能なメモリ」は、すべてのRAMとシステムで使用可能なスワップ領域の合計です。代わりに、OOMの状況が特定のcpuset /コントロールグループに許可されたメモリ、「利用可能なメモリ」はそのコントロールグループに割り当てられた合計量です。メモリポリシーによって課された制限を超えた場合も同様の計算が行われます。いずれの場合も、プロセスは、常駐セット(RAM使用しているページの数))とスワップ使用量の合計と見なされます。

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

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

18
sciurus