EMFILE (errno 24)

errno 24

LINUX

Message officiel (tel qu'affiché à l'écran) : Too many open files

Aussi recherché sous la forme : Too many open files, errno 24, EMFILE: too many open files

Terminal Linux exécutant strace, avec l'appel système en échec et l'errno mis en évidence
errno Linux : tracez l'appel système exact qui échoue avant de modifier quoi que ce soit.

Ce que cela signifie

EMFILE, « Too many open files » (errno 24), signifie qu’un processus a atteint sa limite de descripteurs de fichiers ouverts. Chaque socket, fichier et tube compte. Les serveurs très sollicités, les surveillants de fichiers et le code qui fuit y sont confrontés ; la limite s’applique par processus (ENFILE en est l’équivalent à l’échelle du système).

S'applique à : Linux, macOS (errno BSD), WSL, Conteneurs Docker

Comment corriger EMFILE (errno 24)

  1. Vérifiez la limite actuelle avec 'ulimit -n' et l’utilisation du processus avec 'ls /proc/<pid>/fd | wc -l'
  2. Identifiez ce qui est ouvert avec 'lsof -p <pid> | awk "{print \$5}" | sort | uniq -c' pour repérer une fuite (des milliers de sockets ou le même fichier)
  3. Augmentez la limite de l’interpréteur de commandes pour la session avec 'ulimit -n 65535' (dans la limite stricte)
  4. Pour les services systemd, définissez 'LimitNOFILE=65535' dans la section [Service] de l’unité, puis exécutez 'systemctl daemon-reload' et redémarrez le service
  5. Pour les sessions de connexion, définissez les limites nofile dans /etc/security/limits.conf
  6. Corrigez les fuites dans le code : fermez fichiers et sockets dans des blocs finally/with, et réutilisez les connexions HTTP avec un pool
  7. Sous macOS, vérifiez 'launchctl limit maxfiles' et augmentez 'ulimit -n' dans le shell

Pourquoi cela se produit

Chaque processus dispose d’une limite souple RLIMIT_NOFILE, souvent de 1024 par défaut. Une forte concurrence, des surveillants de fichiers sur de grandes arborescences et des fuites de descripteurs font dépasser cette limite.

FAQ

Quelle est la différence entre EMFILE et ENFILE ?

EMFILE est la limite par processus ; ENFILE signifie que la table de fichiers de tout le système est pleine.

Pourquoi augmenter ulimit n’aide-t-il pas mon service ?

Les services démarrés par systemd ignorent le ulimit de votre shell. Définissez LimitNOFILE dans le fichier d’unité.

Erreurs liées

Source : Linux kernel errno.h · solutions rédigées et vérifiées par les éditeurs (voir notre politique éditoriale)

Dernière mise à jour :