Bagaimana cara melacak kebocoran file deskriptor?

11

Saya memiliki proses java (GlassFish) yang merupakan penjelas file bocor. Saya tahu ini karena saya mendapatkan java.io.IOException: Too many open filespengecualian yang bermanfaat . Saya dapat melihat /proc/PID#/fddan melihat semua deskriptor file terbuka. Ketika saya menggunakan lsof, saya mendapatkan sejumlah besar entri seperti ini:

java 18510 root 8811u sock 0,4 1576079 tidak dapat mengidentifikasi protokol
java 18510 root 8812u sock 0,4 1576111 tidak dapat mengidentifikasi protokol
java 18510 root 8813u sock 0,4 1576150 tidak dapat mengidentifikasi protokol

Saya melihat 12 yang baru dibuat per menit. Opsi apa yang dapat saya gunakan di lsof atau alat lain apa yang tersedia bagi saya untuk membantu melacak deskriptor file socket di mana protokol tidak dapat diidentifikasi?

cclark
sumber
//, Banyak tanggapan yang bagus untuk pertanyaan ini hanyalah pertanyaan dari mesin pencari ... duckduckgo.com/?q=How+to+track+down+a+file+descriptor+leak
Nathan Basanese

Jawaban:

7

untuk melihat 20 file teratas menangani menggunakan proses:

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

output dalam format file menangani hitungan, pid, cmndline untuk diproses

contoh 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
johnjamesmiller
sumber
4

Biasakan diri dengan perintah strace. Ini memonitor panggilan sistem. Saya baru-baru menggunakannya untuk melacak kebocoran file descriptor yang menyebabkan daemon snmpd kami crash berulang kali. Butuh beberapa waktu untuk membiasakan diri, tetapi ini adalah alat yang ampuh.

Anda dapat menggunakan strace untuk melampirkan ke proses yang sedang berjalan (jangan lupa tanda -f untuk mengikuti proses anak).

Yoonix
sumber
1

Apa sebenarnya yang Anda coba lacak? Alamat IP jarak jauh yang terkait dengan FD yang bocor, kode yang rusak, atau yang lainnya?

Karena Anda telah mengidentifikasi bahwa ada kebocoran, menghubungi teknisi yang bertanggung jawab untuk proses java ini tampaknya merupakan langkah selanjutnya yang masuk akal.

An̲̳̳drew
sumber
Saya mencoba melacak informasi yang saya dapat tentang deskriptor file tersebut. can't identify protocoltidak memberi banyak insinyur untuk dijalankan. Apakah ada alat atau opsi di lsof yang saya tidak melihat yang harus saya gunakan? Masalahnya tidak terjadi dalam tes env dan hanya dimulai dalam env ini setelah migrasi kabinet. Kode yang sama tidak memiliki masalah sebelum migrasi dan ketika aplikasi tidak dipekerjakan, Glassfish masih bocor sendiri. Dugaan terbaik saya adalah sesuatu yang rusak dari perspektif jaringan dan soket mencoba untuk menginisialisasi tetapi tidak bisa dan kemudian mereka menggantung dan ditinggalkan.
cclark