Watch at EaseHistorias. Respuestas. Perspectiva.

Tecnología · GUÍA PRÁCTICA

Linux dice “fork: Cannot allocate memory”: demuestra el límite antes de reiniciar

La RAM libre no es un diagnóstico. Conserva el contexto del fork fallido, demuestra que el PID namespace vive, compara eventos y límites de cgroup y lee el registro de commit del host antes de añadir swap o reiniciar.

Diagrama que separa límites de memoria de proceso, carga y host
Ilustración original: trata ENOMEM como señal de límite y conserva tres registros. Watch at Ease

La RAM libre no es un diagnóstico. Conserva el contexto del fork fallido, demuestra que el PID namespace vive, compara eventos y límites de cgroup y lee el registro de commit del host antes de añadir swap o reiniciar.

fork puede devolver ENOMEM por memoria del kernel ajustada o porque terminó el init del PID namespace objetivo. Un cgroup puede alcanzar memory.max aunque el host aún muestre memoria disponible.

1. Congela el fallo fork y su contexto de ejecución

Antes de reiniciar registra hora, PID padre, servicio o contenedor, comando, errno, primera línea de journal o trace y rutas de cgroup y namespace. El mensaje del shell no identifica el límite.

No empieces con drop_caches, OOM global, límites infinitos o reboot. Borran el estado, dañan cargas ajenas e impiden atribuir una recuperación.

2. Demuestra que el PID namespace aún crea hijos

El manual de fork documenta ENOMEM cuando murió el init del PID namespace objetivo. Compara enlaces de namespace del padre fallido con un proceso sano y verifica un PID 1 vivo.

Si se confirma, repara el ciclo de vida para mantener un init supervisado. Añadir swap, elevar MemoryMax o matar un proceso de RSS alto no revive el namespace.

3. Audita el cgroup del servicio y límites ancestros

Mapea el PID al cgroup y conserva memory.current, max, high, swap.current y memory.events antes y después de un intento controlado; revisa también slices padres.

Si sube max u oom sin presión global, es evidencia local. Algunas asignaciones fallan sin invocar al OOM killer, por lo que oom_kill=0 no descarta el límite.

4. Compara commit del host y presión física

Lee juntos MemAvailable, swap, CommitLimit, Committed_AS, presión y logs. Con overcommit estricto, una asignación puede fallar al llegar al registro permitido aunque la instantánea libre parezca cómoda.

Separa ENOMEM de límites de tareas. RLIMIT_NPROC, threads-max, pid_max o pids.max suelen dar EAGAIN; conserva el errno antes de ajustar tareas.

5. Corrige un límite y repite el mismo arranque

Restaura el init supervisado, corrige la fuga o el límite estrecho del cgroup, o trata el consumidor/capacidad del host según la rama probada.

Repite el mismo start dos veces observando el mismo namespace, cgroup y commit ledger. Exige hijo activo, supervisor esperado, ningún delta inexplicado, ningún OOM oculto y restart normal exitoso.

Diagrama de evidencia, reparación y aceptación por repetición
Ilustración original: cambia una causa probada y verifica el mismo arranque. Watch at Ease