Как отследить утечку файлового дескриптора?

У меня есть процесс Java (Glassfish), который пропускает файловые дескрипторы. Я знаю это, потому что я получаю полезную java.io.IOException: Too many open files исключение. Я могу заглянуть в /proc/PID#/fd и увидеть все дескрипторы открытых файлов. Когда я использую lsof, я получаю очень большое количество записей вроде этого:

java 18510 root 8811u sock 0,4 1576079 не может идентифицировать протокол
java 18510 root 8812u sock 0,4 1576111 не может идентифицировать протокол
java 18510 root 8813u sock 0,4 1576150 не может идентифицировать протокол

Я вижу 12 новых созданных в минуту. Какие опции я могу использовать в lsof или какие другие инструменты доступны мне, чтобы помочь отследить дескрипторы файлов сокетов, где протокол не может быть идентифицирован?

3 ответа

Чтобы увидеть топ-20 дескриптор файла с помощью процессов:

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

вывод находится в формате дескриптор файла счетчик, pid, cmndline для процесса

пример вывода

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

Ознакомьтесь с командой strace. Он контролирует системные вызовы. Недавно я использовал его для отслеживания утечек файловых дескрипторов, которые вызывали многократный сбой нашего демона snmpd. Требуется некоторое привыкание, но это мощный инструмент.

Вы можете использовать strace для подключения к работающему процессу (не забывайте флаг -f для отслеживания дочерних процессов).

Что именно вы пытаетесь отследить? Удаленный IP-адрес (а), связанный с утечкой FD, неисправным кодом или чем-то еще?

Поскольку вы уже определили, что есть утечка, связаться с инженерами, ответственными за этот процесс Java, кажется разумным следующим шагом.

Другие вопросы по тегам