Come rintracciare una perdita del descrittore di file?


11

Ho un processo Java (Glassfish) che perde descrittori di file. Lo so perché ottengo l' java.io.IOException: Too many open fileseccezione utile . Posso guardare /proc/PID#/fde vedere tutti i descrittori di file aperti. Quando uso lsof ottengo un numero molto elevato di voci come questa:

calza java 18510 root 8811u 0,4 1576079 impossibile identificare il protocollo
calza java 18510 root 8812u 0,4 1576111 impossibile identificare il protocollo
calza java 18510 root 8813u 0,4 1576150 impossibile identificare il protocollo

Vedo 12 nuovi creati al minuto. Quali opzioni posso usare su lsof o quali altri strumenti sono disponibili per aiutarmi a rintracciare i descrittori di file socket dove non è possibile identificare il protocollo?


// Molte risposte a questa domanda sono solo una query del motore di ricerca ... duckduckgo.com/?q=How+to+track+down+a+file+descriptor+leak
Nathan Basanese

Risposte:


7

per vedere i 20 principali gestori di file usando i processi:

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

l'output è nel formato file handle count, pid, cmndline per process

esempio di output

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

Acquisire familiarità con il comando strace. Monitora le chiamate di sistema. L'ho usato di recente per rintracciare le perdite del descrittore di file che causavano il crash del demone snmpd ripetutamente. Ci vuole un po 'per abituarsi, ma è uno strumento potente.

Puoi usare strace per collegarti a un processo in esecuzione (non dimenticare il flag -f per seguire i processi figlio).


1

Cosa stai esattamente cercando di rintracciare? Gli indirizzi IP remoti associati agli FD trapelati, il codice difettoso o qualcos'altro?

Dato che hai già identificato la presenza di una perdita, contattare gli ingegneri responsabili di questo processo Java sembra un ragionevole passo successivo.


Sto cercando di rintracciare qualsiasi informazione possibile su quei descrittori di file. can't identify protocolnon dà agli ingegneri molto con cui correre. Ci sono strumenti o opzioni in lsof che non vedo quale dovrei usare? Il problema non si verifica nell'ambiente di test e si avvia in questo ambiente solo dopo una migrazione del cabinet. Lo stesso codice non ha avuto problemi prima della migrazione e quando l'app non è implementato, Glassfish perde ancora da solo. La mia ipotesi migliore è qualcosa di rotto dal punto di vista della rete e i socket stanno cercando di inizializzare ma non possono e quindi si bloccano e vengono lasciati in giro.
cclark,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.