Como rastrear um vazamento de descritor de arquivo?

11

Eu tenho um processo java (Glassfish) que está vazando descritores de arquivo. Eu sei disso porque recebo a java.io.IOException: Too many open filesexceção útil . Eu posso olhar /proc/PID#/fde ver todos os descritores de arquivos abertos. Quando uso lsof, recebo um número muito grande de entradas como esta:

java 18510 raiz 8811u meia 0,4 1576079 não consegue identificar protocolo
java 18510 raiz 8812u meia 0,4 1576111 não consegue identificar protocolo
java 18510 raiz 8811u meia 0,4 1576150 não consegue identificar protocolo

Eu vejo 12 novos criados por minuto. Quais opções posso usar no lsof ou que outras ferramentas estão disponíveis para ajudar a rastrear descritores de arquivos de soquete onde o protocolo não pode ser identificado?

cclark
fonte
//, Muitas ótimas respostas a essa pergunta são apenas uma consulta de mecanismo de pesquisa ... duckduckgo.com/?q=How+to+track+down+a+file+descriptor+leak
Nathan Basanese

Respostas:

7

para ver os 20 principais identificadores de arquivos usando processos:

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

a saída está no formato de identificador de arquivo count, pid, cmndline for process

saída de exemplo

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
fonte
4

Familiarize-se com o comando strace. Ele monitora as chamadas do sistema. Recentemente, usei-o para rastrear vazamentos de descritores de arquivos que estavam causando o travamento do nosso daemon snmpd repetidamente. Demora um pouco para se acostumar, mas é uma ferramenta poderosa.

Você pode usar o strace para anexar a um processo em execução (não esqueça o sinalizador -f para seguir os processos filhos).

yoonix
fonte
1

O que exatamente você está tentando rastrear? Os endereços IP remotos associados aos FDs vazados, ao código defeituoso ou a alguma outra coisa?

Como você já identificou que há um vazamento, entrar em contato com os engenheiros responsáveis ​​por esse processo java parece uma próxima etapa razoável.

An̲̳̳drew
fonte
Estou tentando rastrear qualquer informação possível sobre esses descritores de arquivo. can't identify protocolnão dá muito trabalho aos engenheiros. Existem ferramentas ou opções em lsof que não estou vendo qual devo usar? O problema não ocorre no ambiente de teste e só começou nesse ambiente após uma migração do gabinete. O mesmo código não apresentava problemas antes da migração e, quando o aplicativo não está implantado, o Glassfish ainda vaza por si próprio. Meu melhor palpite é que algo quebrou do ponto de vista da rede e os soquetes estão tentando inicializar, mas não podem e, em seguida, ficam suspensos.
Cclark