EMFILE (errno 24)

errno 24

LINUX

Messaggio ufficiale (come appare sullo schermo): Too many open files

Cercato anche come: Too many open files, errno 24, EMFILE: too many open files

Terminale Linux che esegue strace con la chiamata di sistema non riuscita e l'errno evidenziati
errno di Linux: individua la chiamata di sistema che fallisce prima di modificare qualsiasi cosa.

Che cosa significa

EMFILE, «Too many open files» (errno 24), significa che un processo ha raggiunto il limite di file descriptor aperti. Ogni socket, file e pipe conta. Server molto carichi, file watcher e codice con perdite di risorse lo raggiungono; il limite è per processo (ENFILE è l'equivalente a livello di sistema).

Si applica a: Linux, macOS (errno BSD), WSL, Container Docker

Come risolvere EMFILE (errno 24)

  1. Controlla il limite attuale con 'ulimit -n' e l'uso del processo con 'ls /proc/<pid>/fd | wc -l'
  2. Individua cosa è aperto con 'lsof -p <pid> | awk "{print \$5}" | sort | uniq -c' per riconoscere una perdita (migliaia di socket o sempre lo stesso file)
  3. Aumenta il limite della shell per la sessione con 'ulimit -n 65535' (fino al limite hard)
  4. Per i servizi systemd, imposta 'LimitNOFILE=65535' nella sezione [Service] dell'unità, poi esegui 'systemctl daemon-reload' e riavvia
  5. Per le sessioni di login, imposta i limiti nofile in /etc/security/limits.conf
  6. Correggi le perdite nel codice: chiudi file e socket in blocchi finally/with e riutilizza le connessioni HTTP con un pool
  7. Su macOS, controlla 'launchctl limit maxfiles' e aumenta 'ulimit -n' nella shell

Perché succede

Ogni processo ha un limite soft RLIMIT_NOFILE, spesso 1024 per impostazione predefinita. Alta concorrenza, file watcher su alberi di directory grandi e perdite di descriptor spingono i processi oltre il limite.

Domande frequenti

Qual è la differenza tra EMFILE ed ENFILE?

EMFILE è il limite per processo; ENFILE indica che la tabella dei file dell'intero sistema è piena.

Perché aumentare ulimit non aiuta il mio servizio?

I servizi avviati da systemd ignorano l'ulimit della tua shell. Imposta LimitNOFILE nel file di unità.

Errori correlati

Fonte: Linux kernel errno.h · soluzioni scritte e verificate dalla redazione (vedi la nostra politica editoriale)

Ultimo aggiornamento: