Cuando un servidor de producción experimenta un reinicio imprevisto de servicios clave como MySQL (mysqld) o PHP-FPM, en el 90% de los casos el responsable no es un crash de la aplicación, sino el Out-Of-Memory Killer (OOM-Killer) del kernel de Linux interviniendo para evitar un kernel panic.
1. Extracción del Evento Forense
Para confirmar si el kernel ejecutó el OOM-Killer y qué proceso fue seleccionado como víctima:
dmesg -T | grep -i -E "oom[-_]killer|killed process" -B 2 -A 5
En la salida verás un volcado de memoria detallado con columnas como total_vm, anon-rss, file-rss y el score de penalización.
2. ¿Cómo decide el Kernel a quién matar?
El kernel calcula un puntaje denominado oom_score (de 0 a 1000) para cada proceso basado en:
- Porcentaje de memoria RAM física utilizada (
anon-rss). - Tiempo de vida del proceso (procesos antiguos suelen recibir menor prioridad de sacrificio).
- Permisos de superusuario (root recibe una ligera deducción del 3%).
Puedes inspeccionar el puntaje actual de cualquier servicio:
cat /proc/$(pgrep mysqld)/oom_score
3. Inmunizar Procesos Críticos
Si tienes un proceso que bajo ninguna circunstancia debe ser terminado por el OOM-killer (por ejemplo, el demonio SSH sshd o la base de datos principal):
echo -1000 > /proc/$(pgrep sshd)/oom_score_adj
Para hacerlo persistente con systemd, añade en el servicio (/etc/systemd/system/mysqld.service.d/override.conf):
[Service]
OOMScoreAdjust=-500