Como uso oom_score_adj?

24

No 11.04, /proc/[pid]contém oom_score_adj, mas man procdescreve o antigo oom_adj. Pesquisei, sem êxito, qualquer informação sobre como usar isso.

O que eu preciso organizar é que os processos iniciados por 'pbs' ou 'gridengine' sejam mortos antes que qualquer outra coisa seja morta. Como eu posso fazer isso?

bmargulies
fonte
Para que essa alteração permaneça permanentemente nos serviços gerenciados pelo Upstart: Como definir permanentemente os ajustes do OOM killer para daemons? .
precisa saber é o seguinte
Já é uma resposta. Liga-se a ele. :)
gertvdijk
Mas não neste site :-)
bmargulies 31/01

Respostas:

13

Baseado em minhas próprias perguntas e respostas sobre Unix e Linux em uma pergunta semelhante.

Como Stuart apontou muito bem em sua resposta , valores válidos são números inteiros no intervalo de -1000 a 1000 para oom_score_adj. Quanto menor o valor, menor a chance de ser morto.

É muito inconveniente ter que alterar esse valor repetidamente depois de reiniciar o aplicativo. As informações são simplesmente perdidas após o término do processo. Upstart (o daemon init no Ubuntu), tem uma boa opção para isso configurar para daemons para garantir que seja definido sempre que for (re) iniciado:

oom score

[...] recorte [...]

Exemplo:

# this application is a "resource hog"
oom score 1000

expect daemon
respawn
exec /usr/bin/leaky-app

Então, basicamente, você pode editar o /etc/init/myservice.confarquivo de configuração dos serviços que você deseja alterar, para incluir uma linha oom score -1000. Suponho que os serviços 'pbs' ou 'gridengine' de que você está falando na sua pergunta sejam ativados pelo Upstart, caso contrário, você precisará de outra maneira de mudar isso permanentemente.

gertvdijk
fonte
7

Se você pode modificar o script de inicialização que gera o processo que deseja priorizar para oom-killer, adicione o seguinte ao script de inicialização:

echo 1000 > /proc/self/oom_score_adj

O valor é herdado para processos filho.

user1338062
fonte
6

Se você definir um valor alto (ish) para oom_adj ou oom_score_adj, eles serão eliminados primeiro. por exemplo

echo 15 > /proc/[pid]/oom_adj

oom_adj vai de -16 a 15 e, como mencionado acima, oom_score_adj aceita -1000 a 1000

Stuart
fonte
Você precisa ser root para fazer isso. sudo sh -c "echo -1000 > /proc/[PID]/oom_score_adj"
Adil
2
Na verdade, você pode aumentar a pontuação dos seus processos sem raiz ("sim, isso pode ser morto"). Diminuir (abaixo de 0) precisa de raiz.
Piskvor 27/01
5

Examinar o código é sempre uma boa ideia. Normalmente eu uso a função de pesquisa do kernel.org, mas atualmente está inativa. O Github também faz um bom trabalho. Eu achei isto:

Em vez disso, é adicionado um novo ajuste, / proc / pid / oom_score_adj, que varia de -1000 a +1000. Pode ser usado para polarizar a heurística, de modo que certas tarefas nunca sejam consideradas para matar, enquanto outras sempre podem ser consideradas. O valor é adicionado diretamente na pontuação badness (), portanto, um valor de -500 significa, por exemplo, descontar 50% de seu consumo de memória em comparação com outras tarefas no sistema, vinculadas à mempolicy, na cpuset ou compartilhando o mesmo controlador de memória.

Em https://github.com/mirrors/linux-2.6/commit/a63d83f427fbce97a6cea0db2e64b0eb8435cd10#include/linux/oom.h

falsidade
fonte
Obrigado pelo ponteiro, mas espero que alguém passe por aqui e faça uma receita para todo o problema, que parece estar organizando esse valor para o daemon exec do pbs antes que ele garanta qualquer trabalho.
precisa saber é o seguinte