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.