Назад | Перейти на главную страницу

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

У меня есть 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 или какие другие инструменты доступны мне, чтобы помочь отследить дескрипторы файлов сокетов, где протокол не может быть идентифицирован?

чтобы увидеть топ-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-процесс, кажется разумным следующим шагом.