Como proteger um processo do OOM
A proteção contra o OOM Killer deve ser feita processo por processo, pois é necessário conhecer o PID do processo que esta rodando para assim protegê-lo. Como isso pode se tornar impraticável, para processos que mudam frequentemente de PID, temos que criar um script para tal serviço.
Como esta documentado em Link externo do OOM Killer: Qualquer processo pode ser “imunizado” contra o oom killer se o valor da sua própria propriedade /proc/$PID/oom_adj for configurada para a constante OOM_DISABLE (definida normalmente como -17).
Então, isso significa, que para desabilitar o OOM Killer para um processo, se o seu PID é conhecido, basta usar a seguinte linha de comando:
# OOM_DISABLE on $PID echo -17 > /proc/$PID/oom_adj
Usando o pgrep, podemos fazer o mesmo sabendo somente o nome do processo que se quer imunizar. Por exemplo, aqui no caso do proxmox, vamos garantir que o kvm, processo que roda as máquinas virtuais, não seja eliminado, através da seguinte linha de comando:
pgrep -f "/usr/bin/kvm" | while read PID; do echo -17 > /proc/$PID/oom_adj; done
Para automatizar o processo, vamos usar uma tarefa no crontab, para verificar periodicamente os processos kvm e assim garantir que estes sejam excluídos do processo do OOM Killer, mesmo quando novas máquinas virtuais são criadas ou reinicializadas.
Para isso vamos criar um aquivo dentro do seguinte diretório /etc/cron.d/oom_disable_kvm com o seguinte conteúdo:
* * * * * root pgrep -f "/usr/bin/kvm" | while read PID; do echo -17 > /proc/$PID/oom_adj; done
Assim garantimos que sempre os processos kvm que executam as máquina virtuais sejam excluídos do processo do OOM Killer.