Jak wyśledzić wyciek deskryptora pliku?

11

Mam proces Java (Glassfish), który przecieka deskryptory plików. Wiem to, ponieważ otrzymuję pomocny java.io.IOException: Too many open fileswyjątek. Mogę zajrzeć /proc/PID#/fdi zobaczyć wszystkie otwarte deskryptory plików. Kiedy używam lsof, otrzymuję bardzo dużą liczbę wpisów takich jak to:

java 18510 root 8811u skarpeta 0,4 1576079 nie może zidentyfikować protokołu
java 18510 root 8812u skarpeta 0,4 1576111 nie może zidentyfikować protokołu
java 18510 root 8813u skarpeta 0,4 1576150 nie może zidentyfikować protokołu

Widzę 12 nowych tworzonych na minutę. Jakich opcji mogę użyć na lsof lub jakie inne narzędzia są dla mnie dostępne, aby pomóc wyśledzić deskryptory plików gniazd, w których nie można zidentyfikować protokołu?

Cclark
źródło
// Wiele interesujących odpowiedzi na to pytanie są tylko zapytania wyszukiwarka od ... duckduckgo.com/?q=How+to+track+down+a+file+descriptor+leak
Nathan Basanese

Odpowiedzi:

7

aby zobaczyć 20 najlepszych uchwytów plików za pomocą procesów:

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

dane wyjściowe są w formacie uchwyt pliku format, pid, cmndline dla procesu

przykładowe wyjście

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
źródło
4

Zapoznaj się z poleceniem strace. Monitoruje wywołania systemowe. Ostatnio użyłem go do śledzenia wycieków deskryptora pliku, które powodowały wielokrotne awarie naszego demona snmpd. Trzeba się przyzwyczaić, ale jest to potężne narzędzie.

Możesz użyć strace, aby dołączyć do działającego procesu (nie zapomnij o opcji -f, aby śledzić procesy potomne).

yoonix
źródło
1

Co dokładnie próbujesz wyśledzić? Zdalne adresy IP powiązane z wyciekającymi FD, wadliwym kodem lub czymś innym?

Jak już zauważyłeś, że nastąpił wyciek, skontaktowanie się z inżynierami odpowiedzialnymi za ten proces Java wydaje się rozsądnym następnym krokiem.

Andrzej
źródło
Próbuję wyśledzić wszelkie informacje na temat tych deskryptorów plików. can't identify protocolnie daje inżynierom wiele do roboty. Czy w lsof są narzędzia lub opcje, których nie widzę, których powinienem używać? Problem nie występuje w środowisku testowym i zaczął się w tym środowisku dopiero po migracji szafki. Ten sam kod nie miał problemów przed migracją, a gdy aplikacja nie została wdrożona, Glassfish wciąż przecieka. Moje najlepsze przypuszczenie to coś zepsutego z perspektywy sieci, a gniazda próbują się zainicjować, ale nie mogą, a następnie zawieszają się i zostają.
cclark