84 votes

Trop de fichiers ouverts : comment trouver le coupable ?

En cours d'exécution tail -f filename j'ai reçu le message suivant :

tail: inotify cannot be used, reverting to polling: Too many open files

Est-ce un problème potentiel ?

Comment puis-je diagnostiquer ce qui est responsable de tous les dossiers ouverts ? J'ai une liste de processus suspects, mais s'ils ne s'avèrent pas être les coupables, des instructions qui ne reposent pas sur la connaissance du processus à vérifier seraient utiles.

81voto

Andrea Olivato Points 1253

Vous pouvez utiliser lsof pour comprendre qui ouvre tant de fichiers. En général, c'est un serveur (web) qui ouvre tant de fichiers, mais lsof vous aidera sûrement à identifier la cause.

Une fois que vous avez compris qui est le méchant, vous pouvez

  • tuer le processus/arrêter le programme
  • augmenter l'ulimit

Si la sortie de lsof est assez importante, essayez de la rediriger vers un fichier, puis ouvrez ce fichier.

Exemple (vous devrez peut-être Ctrl + C la première commande)

lsof > ~/Desktop/lsof.log
cat ~/Desktop/lsof.log | awk '{ print $2 " " $1; }' | sort -rn | uniq -c | sort -rn | head -20
vim ~/Desktop/lsof.log

32voto

kervin Points 1391

Au cas où quelqu'un d'autre en aurait besoin...

ulimit -a

Affiche toutes les limites actuelles. Plus précisément ulimit -n 70000 définira la limite du descripteur de fichier.

Aussi...

cat /proc/sys/fs/file-max

Affiche/réglera la limite du noyau si elle est modifiée.

sudo echo 200000 > /proc/sys/fs/file-max

Une explication beaucoup plus détaillée peut être trouvée à...

Comment augmenter la limite de fichiers ouverts pour un utilisateur non root ?

3voto

bbodenmiller Points 169

Alors que ulimit peut être utilisé pour déterminer combien de fichiers sont autorisés à être ouverts par processus vous pourriez vouloir trouver le coupable.

@itsadok @Tyler Collier @gaoithe dans les commentaires aux autres réponses soulignent que trier et compter quel processus a le plus de fichiers ouverts est la meilleure chose à faire ici :

sudo lsof | head -1 | awk '{ print "COUNT " $2 " " $1; }' && sudo lsof +c 0 | awk '{ print $2 " " $1; }' | sort -rn | uniq -c | sort -rn | head -20

Commande supérieure :

  • Donne un en-tête à la sortie
  • lsof donne la liste des fichiers ouverts
  • +c 0 L'option indique lsof pour imprimer la commande complète
  • awk '{ print $2 " " $1; }' imprime les colonnes PID et COMMAND dans les résultats
  • sort -rn trie les résultats de manière à ce que les entrées identiques soient les unes à côté des autres (nécessaire pour les uniq -c pour fonctionner correctement)
  • uniq -c compte les fichiers ouverts par PID/commande
  • sort -rn trie les résultats par nombre
  • head -20 montre les 20 premiers fichiers ouverts par PID/commande

Note : Cela inclut les "fichiers" qui ne sont pas pris en compte dans les limites.

Vous pouvez aller plus loin en examinant les limites pour un NID, le nombre de fichiers ouverts pour un NID spécifique, et la limite lsof pour ne compter que les fichiers qui comptent dans la limite - voir https://serverfault.com/a/964752/152562 .

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X