receber sinal antes que o processo seja morto pelo killer / cgroups do OOM

11

Em nosso cluster, estamos restringindo os recursos de nossos processos, por exemplo, memory ( memory.limit_in_bytes).

Eu acho que, no final, isso também é tratado através do killer OOM no kernel do Linux (parece com isso lendo o código-fonte ).

Existe alguma maneira de obter um sinal antes que meu processo seja finalizado? (Assim como a -notifyopção para SGEsqsub , que serão enviadas SIGUSR1antes do término do processo.)

Eu li sobre /dev/mem_notify aqui, mas não tenho - há algo mais hoje em dia? Eu também li isso que parece um pouco relevante.

Quero ser capaz de, pelo menos, despejar um pequeno rastreamento de pilha e talvez outras informações úteis sobre depuração - mas talvez eu possa me recuperar liberando alguma memória.

Uma solução alternativa que estou usando atualmente é esse pequeno script que verifica frequentemente se estou próximo (95%) do limite e, se estiver, envia o processo a SIGUSR1. No Bash, estou iniciando esse script em background ( cgroup-mem-limit-watcher.py &) para que ele procure por outros procs no mesmo cgroup e saia automaticamente quando o processo do Bash pai morre.

Albert
fonte
Não consegui encontrar nenhuma fonte de autoridade, nem encontrei uma maneira de chamar o OOM killer para um processo específico manualmente (para testar a idéia) , mas, pelo que descobri, parece que o OOM killer simplesmente envia SIGTERM, então você deve definir um manipulador para esse sinal.
Hi-Angel
5
@ Hi-Angel: A partir do código fonte do Linux , parece que ele envia o SIGKILL.
Albert
@ Albert Depois de ler o código fonte, também acho que o OOM Killer enviará diretamente um sinal SIGKILL.
andy

Respostas:

5

É possível registrar uma notificação para quando o uso de memória de um cgroup estiver acima de um limite. Em princípio, definir o limite em um ponto adequado abaixo do limite real permitiria enviar um sinal ou executar outra ação.

Vejo:

https://www.kernel.org/doc/Documentation/cgroup-v1/memory.txt

Chris Emerson
fonte
5

O OOM killer envia um SIGKILL, pois, caso contrário, seria contraproducente deixar o programa problemático ter a opção de continuar.

Isso significa que não há absolutamente nenhuma maneira de um processo saber quando está prestes a ser morto por ele.

Gerenciar esses problemas geralmente implica fazer correções nos programas ou em suas configurações. Às vezes, dependendo da configuração do sistema, o simples aumento do espaço de troca pode dar ao sistema operacional mais flexibilidade no gerenciamento de memória para evitar medidas drásticas.

Julie Pelletier
fonte