Erreurs
❌ Erreur Linux "Too many open files" — Causes et Solutions
🐧 Erreur Linux
Limite de fichiers ouverts atteinte — ulimit trop bas
L'erreur
Too many open files (EMFILE/ENFILE) signifie que le processus ou le système a atteint la limite maximale de descripteurs de fichiers ouverts. Sous Linux, tout est fichier : sockets réseau, pipes, vrais fichiers — tous consomment un descripteur.⚠️ Causes possibles
ulimit trop bas
La limite par défaut (1024) est insuffisante pour les services à fort trafic
Fuite de descripteurs
Le programme ouvre des fichiers/sockets sans les fermer (bug)
Trop de connexions simultanées
Nginx, MySQL, Redis sous forte charge dépassent la limite
Limite système atteinte
fs.file-max du kernel est trop bas pour l'ensemble du système
Logs ouverts en permanence
Services qui gardent tous leurs logs ouverts simultanément
🔧 Solutions étape par étape
1
Diagnostiquer les limites actuelles
# Voir les limites du shell courant ulimit -a ulimit -n # Limite fichiers ouverts (soft) ulimit -Hn # Limite hard # Voir les limites d'un processus en cours cat /proc/$(pgrep nginx | head -1)/limits cat /proc/$(pgrep mysql | head -1)/limits # Voir combien de fichiers sont actuellement ouverts lsof | wc -l lsof -p $(pgrep nginx | head -1) | wc -l # Limite système globale cat /proc/sys/fs/file-max sysctl fs.file-nr
2
Augmenter la limite ulimit
# Augmenter temporairement (session courante) ulimit -n 65536 # Augmenter de façon permanente dans ~/.bashrc echo "ulimit -n 65536" >> ~/.bashrc # Pour tous les utilisateurs — /etc/security/limits.conf # Ajouter ces lignes : * soft nofile 65536 * hard nofile 65536 root soft nofile 65536 root hard nofile 65536 # Vérifier que pam_limits est actif grep pam_limits /etc/pam.d/common-session
3
Configurer pour Nginx
# Dans /etc/nginx/nginx.conf
worker_processes auto;
worker_rlimit_nofile 65536;
events {
worker_connections 4096;
use epoll;
}
# Vérifier la config Nginx
nginx -t
# Dans le service systemd Nginx
# /etc/systemd/system/nginx.service.d/limits.conf
[Service]
LimitNOFILE=65536
systemctl daemon-reload
systemctl restart nginx4
Configurer pour MySQL/MariaDB
# Dans /etc/mysql/mariadb.conf.d/50-server.cnf [mysqld] open_files_limit = 65536 table_open_cache = 4096 # Dans /etc/systemd/system/mariadb.service.d/limits.conf [Service] LimitNOFILE=65536 systemctl daemon-reload systemctl restart mariadb
5
Augmenter la limite système globale
# Voir la limite actuelle cat /proc/sys/fs/file-max # Augmenter temporairement sysctl -w fs.file-max=2097152 # Augmenter de façon permanente dans /etc/sysctl.conf fs.file-max = 2097152 fs.inotify.max_user_watches = 524288 # Appliquer sysctl -p # Vérifier cat /proc/sys/fs/file-max
🛡️ Comment éviter cette erreur
- ✅ Configurer
LimitNOFILE=65536dans l'unité systemd de chaque service critique - ✅ Monitorer le nombre de fichiers ouverts avec Zabbix (
lsof | wc -len métrique custom) - ✅ Utiliser
strace -e trace=open,openat,closepour détecter les fuites de descripteurs - ✅ Dimensionner les limites AVANT la mise en prod selon la charge attendue
Ajouter Les Fibrés à mes sources préférées
Retrouvez plus souvent nos guides dans vos résultats Google