Como rastrear um vazamento de descritor de arquivo?

9

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

java 18510 root 8811u sock 0,4 1576079 can't identify protocol
java 18510 root 8812u sock 0,4 1576111 can't identify protocol
java 18510 root 8813u sock 0,4 1576150 can't identify protocol

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

    
por cclark 26.04.2010 / 07:22

3 respostas

6

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 arquivo handle count, pid, cmndline for process

exemplo de saída

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
    
por 21.06.2013 / 16:58
3

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

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

    
por 21.06.2013 / 19:50
1

O que exatamente você está tentando rastrear? O (s) endereço (s) IP remoto (s) associado (s) com os FDs vazados, o código defeituoso ou alguma outra coisa?

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

    
por 26.04.2010 / 07:45