Eu tenho um processo java (Glassfish) que está vazando descritores de arquivo. Eu sei disso porque recebo a java.io.IOException: Too many open files
exceção útil . Eu posso olhar /proc/PID#/fd
e 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?
lsof
max-file-descriptors
cclark
fonte
fonte
Respostas:
para ver os 20 principais identificadores de arquivos usando processos:
a saída está no formato de identificador de arquivo count, pid, cmndline for process
saída de exemplo
fonte
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).
fonte
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.
fonte
can't identify protocol
nã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.