Linux
🤖Generado & Curado por IA (Google Gemini 2.0)
3 min de lectura

Depuración del OOM-Killer en Servidores de Producción AlmaLinux / CloudLinux

Cómo auditar qué proceso agotó la memoria física, entender el badness score y prevenir que el kernel termine servicios críticos.

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:

  1. Porcentaje de memoria RAM física utilizada (anon-rss).
  2. Tiempo de vida del proceso (procesos antiguos suelen recibir menor prioridad de sacrificio).
  3. 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
AS

Alejandro Alfonso Salazar Chaves

M.Sc. en Ciencias de la Computación (Universidad de Costa Rica) con más de 20 años de experiencia en desarrollo de software de misión crítica, infraestructura de red Cisco en Data Center (Racknation) y arquitectura de sistemas en PHPBEAST.

✓ Copiado al portapapeles