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
- Adicionar RAM física se possível.
- 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 ExporterZabbixouNetdata- 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
cgroupspara limitar consumo de memória de processos específicos.
4️⃣ Checklist rápido para prevenir OOM
- RAM suficiente para workload + swap configurada.
- Limites de memória em MySQL, PHP, Docker, etc.
- Processos críticos com
oom_score_adj=-1000. - Monitoramento ativo e alertas.
- Kernel configurado para overcommit seguro.
- Revisão periódica de logs para detectar leaks.

