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 files
exception utile . Je peux regarder /proc/PID#/fd
et 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é?
la source
Réponses:
pour voir le top 20 des descripteurs de fichiers utilisant des processus:
la sortie est au format nombre de descripteurs de fichiers, pid, cmndline pour le processus
exemple de sortie
la source
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).
la source
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.
la source
can't identify protocol
ne 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.