संदर्भ: मैं जावा आधारित नेटवर्क सर्वर पर काम कर रहा हूं जो गलती से पाइप लीक करता है। हर कुछ दिनों में यह 40,000 फाइल डिस्क्रिप्टर की सीमा को हिट करता है और मर जाता है। मृत्यु से पहले सर्वर पर lsof
का उपयोग करके यह दिखाता है कि यह पाइप के साथ दबाया जाता है। पाइप एक और प्रक्रिया के बजाय खुद से जुड़ते हैं।जब एक विशिष्ट सिस्टम कॉल किया जाता है तो जावा स्टैक-ट्रेस रिकॉर्ड करना?
कोडबेस का कोई भी हिस्सा पाइप बनाता है या उपयोग नहीं करता है - जिसे हम देख सकते हैं।
जेवीएम के कुछ पुराने संस्करण ने & सॉकेट बनाने के दौरान एक पाइप लीक की है, हालांकि यह जावा 1.7.0_75 पर प्रदर्शित होता है जो मुझे विश्वास है कि उस बग को पीड़ित नहीं है।
मेरा प्रश्न है: आधुनिक लिनक्स toolchain, (जैसे पर्फ़ के रूप में) का उपयोग करते हुए यह प्रक्रिया स्नैपशॉट करने के लिए संभव है, जब यह pipe(2)
सिस्टम कॉल कहता है - जो मेरा मानना है कि एक ही रास्ता पाइप बनाई गई हैं है। इसके अलावा, क्या उस से जावा स्टैक-ट्रेस पुनर्प्राप्त करना संभव है?
इस जानकारी को देखते हुए सवाल उठाना संभव है कि "कौन पाइप बना रहा है, और क्यों?"
मैं सुझाव है कि आप 'लीक कर रहे हैं Selectors' सहित यह करने के लिए पर विभिन्न अन्य गाइड कर रहे हैं। – EJP
अपने स्वयं के फ़ंक्शन के साथ 'पाइप' को प्रतिस्थापित करने के लिए LD_PRELOAD का उपयोग करने पर विचार करें। – Nykakin
@EJP - एक आकर्षक विचार। आप उससे ठोस निदान कैसे कर सकते हैं? –