EMFILE (errno 24)

errno 24

LINUX

Mensaje oficial (tal como aparece en pantalla): Too many open files

También se busca como: Too many open files, errno 24, EMFILE: too many open files

Terminal de Linux ejecutando strace con la llamada al sistema fallida y el errno resaltados
errno de Linux: rastrea la llamada al sistema que falla antes de cambiar nada.

Qué significa

EMFILE, 'Too many open files' (errno 24), significa que un proceso ha alcanzado su límite de descriptores de archivo abiertos. Cuentan todos los sockets, archivos y tuberías. Lo sufren los servidores con mucha carga, los observadores de archivos y el código con fugas; el límite es por proceso (ENFILE es el equivalente a nivel de todo el sistema).

Se aplica a: Linux, macOS (BSD errno), WSL, Contenedores Docker

Cómo solucionar EMFILE (errno 24)

  1. Comprueba el límite actual con 'ulimit -n' y el uso del proceso con 'ls /proc/<pid>/fd | wc -l'
  2. Averigua qué hay abierto con 'lsof -p <pid> | awk "{print \$5}" | sort | uniq -c' para detectar una fuga (miles de sockets o el mismo archivo)
  3. Aumenta el límite de la shell durante la sesión con 'ulimit -n 65535' (hasta el límite duro)
  4. En servicios de systemd, define 'LimitNOFILE=65535' en la sección [Service] de la unidad, y luego ejecuta 'systemctl daemon-reload' y reinicia
  5. Para sesiones de inicio de sesión, define los límites nofile en /etc/security/limits.conf
  6. Corrige las fugas en el código: cierra archivos y sockets en bloques finally/with y reutiliza las conexiones HTTP con un pool
  7. En macOS, revisa 'launchctl limit maxfiles' y aumenta 'ulimit -n' en la shell

Por qué ocurre

Cada proceso tiene un límite blando RLIMIT_NOFILE, a menudo de 1024 por defecto. La alta concurrencia, los observadores de archivos en árboles grandes y las fugas de descriptores hacen que los procesos lo superen.

Preguntas frecuentes

¿Cuál es la diferencia entre EMFILE y ENFILE?

EMFILE es el límite por proceso; ENFILE significa que la tabla de archivos de todo el sistema está llena.

¿Por qué aumentar ulimit no ayuda a mi servicio?

Los servicios iniciados por systemd ignoran el ulimit de tu shell. Define LimitNOFILE en el archivo de unidad.

Errores relacionados

Fuente: Linux kernel errno.h · soluciones redactadas y revisadas por los editores (consulta nuestra política editorial)

Última actualización: