OOM Killer値は常に設定値より1小さいです。

OOM Killer値は常に設定値より1小さいです。

oom_adjメモリ不足キラーの値を設定しようとしますが、これを行うたびに (プロセスに関係なく) 私が設定した値より 1 小さい値が返されます (少なくとも正の整数の場合)。開始してから負の数で試してみませんでした。これらのプロセスが最初にOOM Killerによって終了されることを願っています。

[root@server ~]# echo 10 > /proc/12581/oom_adj
[root@server ~]# cat /proc/12581/oom_adj
9
[root@server ~]# echo 9 > /proc/12581/oom_adj
[root@server ~]# cat /proc/12581/oom_adj
8
[root@server ~]# echo 8 > /proc/12581/oom_adj
[root@server ~]# cat /proc/12581/oom_adj
7
[root@server ~]# echo 7 > /proc/12581/oom_adj
[root@server ~]# cat /proc/12581/oom_adj
6
[root@server ~]# 

これが予想される動作ですか?そうでない場合、なぜこれが起こるのですか?

答え1

oom_adj廃止され、従来の目的にのみ使用されます。 Linuxは内部的にoom_score_adj大きな範囲(oom_adj最大15、oom_score_adj最大1000)を使用します。

作成するたびにoom_adj(9と仮定)、カーネルは次のことを行います。

oom_adj = (oom_adj * OOM_SCORE_ADJ_MAX) / -OOM_DISABLE;

oom_score_adjに保存するとOOM_SCORE_ADJ_MAX1000、OOM_DISABLE-17です。

oom_adj=(9 * 1000) / 17 ~= 529.411したがって、9の場合、この値は整数であるため、529が得られます。oom_score_adj

oom_adjカーネルを読むと、次のようなことが行われます。

oom_adj = (task->signal->oom_score_adj * -OOM_DISABLE) / OOM_SCORE_ADJ_MAX;

したがって、529の場合、次のような結果が得られます。oom_adj = (529 * 17) / 1000 = 8.993カーネルは整数と整数の算術を使用するので、これは8になります。

したがって、9を書き、固定小数点/整数演算のため8を取得します。

関連情報