Comment localiser une fuite de descripteur de fichier?

11

J'ai un processus java (Glassfish) qui fuit des descripteurs de fichiers. Je le sais parce que je reçois l' java.io.IOException: Too many open filesexception utile . Je peux regarder /proc/PID#/fdet voir tous les descripteurs de fichiers ouverts. Lorsque j'utilise lsof, j'obtiens un très grand nombre d'entrées comme celle-ci:

java 18510 racine 8811u chaussette 0,4 1576079 ne peut pas identifier le protocole
java 18510 racine 8812u chaussette 0,4 1576111 ne peut pas identifier le protocole
java 18510 racine 8813u chaussette 0,4 1576150 ne peut pas identifier le protocole

J'en vois 12 nouveaux créés par minute. Quelles options puis-je utiliser sur lsof ou quels autres outils sont à ma disposition pour aider à retrouver les descripteurs de fichiers socket où le protocole ne peut pas être identifié?

cclark
la source
//, Beaucoup de bonnes réponses à cette question ne sont qu'une requête du moteur de recherche ... duckduckgo.com/?q=How+to+track+down+a+file+descriptor+leak
Nathan Basanese

Réponses:

7

pour voir le top 20 des descripteurs de fichiers utilisant des processus:

for x in `ps -eF| awk '{ print $2 }'`;do echo `ls /proc/$x/fd 2> /dev/null | wc -l` $x `cat /proc/$x/cmdline 2> /dev/null`;done | sort -n -r | head -n 20

la sortie est au format nombre de descripteurs de fichiers, pid, cmndline pour le processus

exemple de sortie

701 1216 /sbin/rsyslogd-n-c5
169 11835 postgres: spaceuser spaceschema [local] idle
164 13621 postgres: spaceuser spaceschema [local] idle
161 13622 postgres: spaceuser spaceschema [local] idle
161 13618 postgres: spaceuser spaceschema [local] idle
johnjamesmiller
la source
4

Familiarisez-vous avec la commande strace. Il surveille les appels système. Je l'ai récemment utilisé pour localiser les fuites de descripteurs de fichiers qui provoquaient le crash répété de notre démon snmpd. Il faut un certain temps pour s'y habituer, mais c'est un outil puissant.

Vous pouvez utiliser strace pour vous attacher à un processus en cours (n'oubliez pas l'indicateur -f pour suivre les processus enfants).

yoonix
la source
1

Qu'essayez-vous exactement de retrouver? L'adresse IP distante associée aux FD fuite, le code défectueux ou autre chose?

Comme vous avez déjà identifié une fuite, contacter les ingénieurs responsables de ce processus java semble être une prochaine étape raisonnable.

An̲̳̳drew
la source
J'essaie de retrouver toutes les informations que je peux sur ces descripteurs de fichiers. can't identify protocolne donne pas grand-chose aux ingénieurs. Y a-t-il des outils ou des options dans lsof que je ne vois pas que je devrais utiliser? Le problème ne se produit pas dans l'environnement de test et n'a commencé dans cet environnement qu'après une migration de cabinet. Le même code n'a eu aucun problème avant la migration et lorsque l'application n'est pas déployée, Glassfish fuit toujours de lui-même. Ma meilleure supposition est que quelque chose s'est cassé du point de vue de la mise en réseau et les sockets tentent de s'initialiser mais ne peuvent pas, puis ils se bloquent et sont laissés autour.
cclark