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

11

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

cclark
источник
//, много хороших
Натан Басанезе

Ответы:

7

чтобы увидеть топ-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
johnjamesmiller
источник
4

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

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

yoonix
источник
1

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

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

Эндрю
источник
Я пытаюсь отследить любую информацию об этих файловых дескрипторах. can't identify protocolне дает инженерам много работы. Есть ли в lsof инструменты или опции, которые я не вижу, которые мне следует использовать? Проблема не возникает в тестовой среде и запускается в этой среде только после миграции кабинета. В том же коде проблем не было до миграции, и когда приложение не было развернуто, Glassfish все еще сам по себе. Мое лучшее предположение - что-то сломалось с точки зрения сети, и сокеты пытаются инициализироваться, но не могут, а затем они зависают и остаются.
cclark