Trop de fichiers ouverts - comment trouver le coupable

69

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 diagnostiquer ce qui est responsable de tous les fichiers ouverts? J'ai une liste de processus suspects, mais s'ils ne sont pas les coupables, les instructions qui ne se basent pas sur le processus à vérifier seraient utiles.

Andrew Grimm
la source
1
Avez-vous augmenté le nombre de descripteurs de fichiers disponibles via ulimit?
Ignacio Vazquez-Abrams
2
@ IgnacioVazquez-Abrams Cela peut être utile pour les autres utilisateurs, mais pour moi, cela donnerait l'impression de traiter le symptôme plutôt que la maladie.
Andrew Grimm
Bien que vous ne vous trompiez pas, les applications ont parfois des raisons légitimes d’avoir beaucoup de fichiers ouverts.
Ignacio Vazquez-Abrams

Réponses:

72

Vous pouvez utiliser lsof pour comprendre qui ouvre autant de fichiers. Habituellement, c’est un serveur (Web) qui ouvre autant de fichiers, mais lsof vous aidera sûrement à en identifier la cause.

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

Si la sortie de lsof est assez énorme, essayez de la rediriger vers un fichier puis ouvrez le fichier.

Exemple (vous devrez peut-être Ctrl+ Cla 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
Andrea Olivato
la source
37
Pour les paresseux:lsof | awk '{ print $2; }' | uniq -c | sort -rn | head
itsadok
1
J'ai la même erreur et utiliser ulimit ne fonctionne pas. La commande tail -F renvoie toujours l'erreur. J'ai augmenté la limite de 1024 à 3 000, alors j'imagine que j'ai assez de place à ce moment-là ... Je suppose que je devrais redémarrer!
Alexis Wilke
15
J'ai trouvé la ligne de itsadok utile, mais je pense que vous devriez d'abord trier (parce uniqque ne fonctionne qu'avec des lignes adjacentes), lancer uniq, puis trier à nouveau. Donc lsof | awk '{ print $2; }' | sort -rn | uniq -c | sort -rn | head.
Tyler Collier
19
Trier et compter le plus grand nombre de fichiers ouverts est certainement la meilleure chose à faire. Afficher le nom du processus ainsi que le pid: '' 'lsof | awk '{print $ 2 "" $ 1; } '| trier -rn | uniq -c | trier -rn | head -20 '' '
gaoithe
2
@goithe si vous mettez cela dans une réponse, je serai ravi de la relire:)
Matt Ball
23

Si quelqu'un d'autre en a besoin ...

ulimit -a

Affiche toutes les limites actuelles. Spécifiquement ulimit -n 70000définira la limite de descripteur de fichier.

Aussi...

cat /proc/sys/fs/file-max

Affiche / définit 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?

Kervin
la source
3
ulimits sont là pour vous permettre de garder un contrôle strict sur l’utilisation des ressources dans votre système. Il est préférable de les augmenter individuellement pour les processus dont vous savez qu’ils devront utiliser plusieurs descripteurs de fichier. En les gardant serrés lors des tests, vous découvrirez des processus susceptibles de laisser échapper des descripteurs de fichiers au fil du temps. Notez également que les descripteurs de fichiers sont utilisés pour tout accès à un périphérique sous unix / linux. Par exemple, chaque socket réseau ouvert par un processus utilise un descripteur de fichier. Cela explique pourquoi vous pouvez utiliser "trop ​​de fichiers ouverts" dans le cas de fichiers de système de fichiers normaux ainsi que de fichiers de périphérique tels que les connexions réseau.
gaoithe