Watch at EaseHistorias. Respuestas. Perspectiva.

Tecnología · GUÍA PRÁCTICA

EMFILE en Node.js: identifica quién controla el límite antes de subir ulimit

Conserva el proceso que falla, su límite heredado y el crecimiento de descriptores; separa techo bajo, fuga, pico de concurrencia y presión de vigilancia.

Ilustración editorial original que compara shell, servicio, proceso y uso vivo.
Ilustración editorial original: identifica al propietario antes de cambiar el límite. Watch at Ease

EMFILE es un problema de propiedad antes que de ajuste. Un shell, un servicio systemd y un proceso reiniciado pueden tener pruebas distintas; conserva el PID antes de reiniciar.

Fija el proceso antes de reiniciar

Registra comando o servicio exacto, lanzador padre, PID, hora y primera línea EMFILE. No empieces reiniciando o reinstalando dependencias: borran la tabla y ocultan si el conteo era estable, creciente o un pico.

Lee el límite que realmente heredó

En Linux lee Max open files en /proc/PID/limits y compáralo con ulimit -Sn y -Hn del shell interactivo. Un hijo hereda límites del padre; cambiar el shell después de que systemd arrancó el servicio no cambia ese servicio.

Mide descriptores vivos y crecimiento

Cuenta /proc/PID/fd varias veces y agrupa destinos en archivos, sockets, tuberías y descriptores anónimos. Un conteo estable junto al techo apoya la rama de límite; crecimiento continuo, fuga; un pico con trabajo paralelo, concurrencia.

Separa presión de vigilancia de archivos normales

Una pila que termina en fs.watch o FSEvent marca la superficie de vigilancia, no una solución universal. Compara alcance vigilado, directorios ignorados y descriptores; en Linux distingue además la contabilidad separada de inotify.

Cambia una vez al propietario correcto

Si el servicio heredó un límite blando demasiado bajo, cámbialo en su lanzador o unidad y reinicia ese servicio. Si el conteo no baja, cierra la fuga; si el pico viene de trabajo paralelo, limita concurrencia. No llames reparación a cambiar otro shell.

Prueba el cierre con el lanzador original

Repite la misma carga desde el mismo shell, supervisor, CI o unidad. Guarda límite del nuevo PID, máximo y base posterior. Terminar significa que EMFILE desaparece y el conteo vuelve a un estado estable explicado, no solo que un reinicio pasó una vez.

Ilustración editorial original que separa techo bajo, fuga, pico y vigilancia.
Ilustración editorial original: una captura separa cuatro remedios. Watch at Ease