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 -notify
opção para SGEsqsub
, que serão enviadas SIGUSR1
antes 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.
fonte
Respostas:
É 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
fonte
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.
fonte