จะติดตามไฟล์ descriptor รั่วได้อย่างไร?


11

ฉันมีกระบวนการจาวา (Glassfish) ซึ่งเป็นตัวอธิบายไฟล์ที่รั่ว ฉันรู้สิ่งนี้เพราะฉันได้รับjava.io.IOException: Too many open filesข้อยกเว้นที่เป็นประโยชน์ ฉันสามารถดู/proc/PID#/fdและดูไฟล์อธิบายทั้งหมดที่เปิดอยู่ เมื่อฉันใช้ lsof ฉันได้รับรายการจำนวนมากเช่นนี้:

java 18510 root 8811u ถุงเท้า 0,4 1576079 ไม่สามารถระบุโปรโตคอล
java 18510 root 8812u ถุงเท้า 0,4 1576111 ไม่สามารถระบุโปรโตคอล
java 18510 root 8813u ถุงเท้า 0,4 1576150 ไม่สามารถระบุโปรโตคอล

ฉันเห็น 12 รายการใหม่ที่สร้างขึ้นต่อนาที ฉันสามารถใช้ตัวเลือกใดใน lsof หรือมีเครื่องมืออื่นใดบ้างที่จะช่วยติดตามตัวอธิบายไฟล์ซ็อกเก็ตที่โปรโตคอลไม่สามารถระบุได้


//, คำตอบที่ยอดเยี่ยมสำหรับคำถามนี้เป็นเพียงคำตอบของเครื่องมือค้นหา ... duckduckgo.com/?q=How+to+track+down+a+file+descriptor+leak
Nathan Basanese

คำตอบ:


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 daemon ของเราที่จะผิดพลาดซ้ำ ๆ ต้องใช้ความคุ้นเคยบ้าง แต่มันเป็นเครื่องมือที่ทรงพลัง

คุณสามารถใช้ strace เพื่อแนบกับกระบวนการที่กำลังทำงานอยู่ (อย่าลืมแฟล็ก -f เพื่อติดตามกระบวนการลูก)


1

คุณพยายามติดตามอะไรจริงๆ ที่อยู่ IP ระยะไกลที่เกี่ยวข้องกับ FD ที่รั่วไหลออกมา, รหัสที่ชำรุดหรืออย่างอื่น?

ตามที่คุณระบุแล้วว่ามีการรั่วไหลการติดต่อวิศวกรที่รับผิดชอบกระบวนการ Java นี้ดูเหมือนจะเป็นขั้นตอนต่อไปที่สมเหตุสมผล


ฉันพยายามติดตามข้อมูลใด ๆ ที่ฉันสามารถทำได้เกี่ยวกับตัวอธิบายไฟล์เหล่านั้น can't identify protocolไม่ได้ให้วิศวกรทำงานกับมันมากนัก มีเครื่องมือหรือตัวเลือกในสิ่งที่ฉันไม่เห็นซึ่งฉันควรใช้หรือไม่? ปัญหาไม่ได้เกิดขึ้นในการทดสอบ env และเริ่มต้นเฉพาะใน env นี้หลังจากการย้ายตู้ รหัสเดียวกันไม่มีปัญหาก่อนการโยกย้ายและเมื่อไม่มีการใช้งาน appl, Glassfish ยังคงรั่วไหลด้วยตัวเอง การคาดเดาที่ดีที่สุดของฉันคือสิ่งที่แตกออกจากมุมมองเครือข่ายและซ็อกเก็ตพยายามที่จะเริ่มต้น แต่ไม่สามารถทำได้
cclark
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.