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.

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.
