Erreurs

❌ Erreur Linux "Too many open files" — Causes et Solutions

🐧 Erreur Linux

Limite de fichiers ouverts atteinte — ulimit trop bas

🐧 Linux 📋 5 causes 🔧 5 solutions
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

terminal
# 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

terminal
# 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

terminal
# 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 nginx
4

Configurer pour MySQL/MariaDB

terminal
# 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

terminal
# 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=65536 dans l'unité systemd de chaque service critique
  • ✅ Monitorer le nombre de fichiers ouverts avec Zabbix (lsof | wc -l en métrique custom)
  • ✅ Utiliser strace -e trace=open,openat,close pour 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