OOM Killer valor sempre um a menos que o definido

3

Eu estou tentando definir o valor oom_adj para o out of memory killer, e cada vez que eu faço (independentemente do processo) eu recebo exatamente um menos do que eu configurei (pelo menos para inteiros positivos. I haven ' Tentei números inteiros negativos, pois eu quero que esses processos sejam mortos pelo OOM Killer primeiro.

[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 ~]# 

Esse comportamento é esperado? Se não, por que isso está acontecendo?

    
por Freedom_Ben 05.05.2014 / 21:56

1 resposta

5

oom_adj está obsoleto e é fornecido somente para fins herdados. Internamente, o Linux usa oom_score_adj , que tem um intervalo maior: oom_adj sobe para 15, enquanto oom_score_adj sobe para 1.000.

Sempre que você escreve em oom_adj (digamos 9), o kernel faz isso:

oom_adj = (oom_adj * OOM_SCORE_ADJ_MAX) / -OOM_DISABLE;

e armazena isso em oom_score_adj . OOM_SCORE_ADJ_MAX é 1000 e OOM_DISABLE é -17.

Então, para 9, você receberá oom_adj=(9 * 1000) / 17 ~= 529.411 e, como esses valores são inteiros, oom_score_adj conterá 529.

Agora, quando você ler oom_adj , o kernel fará isso:

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

Portanto, para 529, você obterá: oom_adj = (529 * 17) / 1000 = 8.993 e, como o kernel está usando números inteiros e aritmética inteira, isso se tornará 8.

Então, lá ... você escreve 9 e obtém 8 por causa da aritmética de ponto fixo / inteiro.

    
por 06.05.2014 / 02:14