Como Evitar OOM Killer no Linux: Guia Completo para Servidores Estáveis

1️⃣ Entendendo o OOM Killer

  • evitar OOM Killer
  • OOM Killer (Out Of Memory Killer) é um mecanismo do kernel Linux que mata processos automaticamente quando o sistema fica sem memória RAM e swap.
  • Ele prioriza matar processos “menos importantes”, mas pode afetar serviços críticos se a memória estiver muito baixa.
  • Sintomas comuns:
    • Processos misteriosamente mortos.
    • Logs com mensagens tipo: Out of memory: Kill process 1234 (mysqld) score 987 or sacrifice child
    • Swap completamente usada e alta carga de I/O.

2️⃣ Monitorar memória e swap

Antes de evitar OOM, você precisa saber como e quando ele dispara:

free -h      # mostra memória e swap
vmstat 1 5   # uso de memória e CPU em tempo real
top / htop   # identificar processos que consomem mais RAM
  • Swap cheia + RAM cheia = situação clássica que dispara OOM.
  • Load alto sem CPU geralmente indica waiting por memória (IOWait).

3️⃣ Estratégias para evitar OOM

A) Aumentar RAM e Swap

  1. Adicionar RAM física se possível.
  2. Configurar swap corretamente:
# Criar swap de 4GB, por exemplo
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
  • Ajuste o swappiness para controlar quando o Linux começa a usar swap:
sudo sysctl vm.swappiness=10
  • Valores baixos (~10) usam swap só em caso extremo.
  • Valores altos (~60) começam a usar swap mais cedo.

B) Limitar memória de processos

  • Para serviços críticos (MySQL, PHP-FPM, Docker, etc.), defina limites de memória.

MySQL / MariaDB:

[mysqld]
innodb_buffer_pool_size=2G
max_connections=100

PHP-FPM:

pm.max_children = 20
memory_limit = 256M

Docker:

docker run --memory="512m" ...
  • Limites ajudam a evitar que um único processo consuma toda a memória.

C) Controlar OOM Killer com oom_score_adj

Você pode proteger processos críticos:

# MySQL, por exemplo
echo -1000 > /proc/$(pidof mysqld)/oom_score_adj
  • Valor de -1000 = protegido ao máximo
  • Valor de +1000 = mais provável de ser morto

D) Monitoramento e alertas

  • Use alertas antes que a memória acabe:
    • Prometheus + Node Exporter
    • Zabbix ou Netdata
    • Scripts simples em cron que verificam memória livre

Exemplo simples:

#!/bin/bash
free_mem=$(free -m | awk '/Mem:/ {print $7}')
if [ "$free_mem" -lt 500 ]; then
  echo "ATENÇÃO: Memória livre abaixo de 500MB"
fi

E) Ajustar comportamento do kernel

  • Você pode fazer o kernel priorizar swap vs OOM:
sudo sysctl -w vm.overcommit_memory=2
sudo sysctl -w vm.overcommit_ratio=80
  • vm.overcommit_memory=2 → Linux só aloca memória se houver certeza de que RAM+Swap é suficiente.
  • vm.overcommit_ratio=80 → máximo de 80% da memória total pode ser comprometida.

F) Evitar vazamentos de memória

  • Serviços mal configurados ou bugs podem consumir RAM progressivamente:
    • Monitore logs e processos.
    • Reinicie serviços críticos em horários de baixa carga, se necessário.
    • Use cgroups para limitar consumo de memória de processos específicos.

4️⃣ Checklist rápido para prevenir OOM

  1. RAM suficiente para workload + swap configurada.
  2. Limites de memória em MySQL, PHP, Docker, etc.
  3. Processos críticos com oom_score_adj=-1000.
  4. Monitoramento ativo e alertas.
  5. Kernel configurado para overcommit seguro.
  6. Revisão periódica de logs para detectar leaks.