Як відстежити витік дескриптора файлу?


11

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

Java 18510 кореня 8811u носок 0,4 1576079 не може визначити для протоколу
Java 18510 кореня 8812u носок 0,4 1576111 не може визначити для протоколу
Java 18510 кореня 8813u носок 0,4 1576150 не може ідентифікувати протокол

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


// Багато чудових відповідей на це питання - це лише запит пошукової системи ... duckduckgo.com/?q=How+to+track+down+a+file+descriptor+leak
Натан Басанес

Відповіді:


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

4

Ознайомтеся з командою strace. Він контролює системні виклики. Нещодавно я використовував його для пошуку витоків дескриптора файлів, які спричиняли неодноразовий збій демона snmpd. До цього потрібно звикнути, але це потужний інструмент.

Ви можете використовувати strace для приєднання до запущеного процесу (не забувайте прапор -f, щоб слідкувати за дочірніми процесами).


1

Що саме ви намагаєтесь відстежити? Віддалену IP-адресу, пов’язану з витікаючими FD, несправним кодом чи ще чимось?

Оскільки ви вже виявили, що є витік, наступний крок представляється розумним наступним кроком.


Я намагаюся знайти будь-яку інформацію, яку я можу про ці дескриптори файлів. can't identify protocolне дає інженерам багато працювати. Чи є в lsof інструменти чи варіанти, які я не бачу, якими мені слід користуватися? Проблема не виникає в тестовій програмі env, а розпочалася в цій програмі лише після міграції кабінету. Цей же код не мав проблем перед міграцією, і коли додаток не використовується, Glassfish все ще просочується самостійно. Моя найкраща здогадка - це щось зламане з точки зору мережі, і розетки намагаються ініціалізуватися, але не можуть, а потім вони звисають і залишаються навколо.
cclark
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.