tl; डॉ: एक पर्ल httpd प्रक्रिया स्मृति से बाहर होने पर एक पर्ल स्टैक ट्रेस कैसे डंप करें।पर्ल से "स्मृति से बाहर" त्रुटि
हमारे पास एक mod_perl 2 सर्वर, पर्ल 5.8.8, आरएचईएल 5.6, लिनक्स 2.6.18 है।
बहुत ही कभी और अप्रत्याशित रूप से, एक बच्चा httpd प्रक्रिया सभी उपलब्ध स्मृति को खतरनाक दर पर उपयोग करना शुरू कर देती है। हमने कम से कम बीएसडी :: संसाधन :: setrlimit (RLIMIT_VMEM, ...) का उपयोग किया है, ताकि सर्वर को नीचे लाने से पहले प्रक्रिया "स्मृति से बाहर" हो जाए।
हम नहीं जानते कि यह कोड कहां हो रहा है, और लोड परीक्षण के घंटों के बिना पुन: पेश करना मुश्किल है।
क्या हम वास्तव में चाहते हैं एक तरह से एक पर्ल स्टैक ट्रेस बस से पहले प्रक्रिया स्मृति से बाहर चलाता है पाने के लिए है, इसलिए हम जानते हैं कि कोड इस खड़ी कर रहा है। दुर्भाग्य से, "स्मृति से बाहर" एक untrappable error है।
1) $^M emergency memory pool का उपयोग करें:
विकल्प यहां मैं विचार कर रहा हूँ, उनकी कमियां के साथ प्रत्येक रहे हैं। हमें PERD को पुन: संकलित करने की आवश्यकता है -DPERL_EMERGENCY_SBRK और -Dusemymalloc।
2) लॉग बयान में डाल दें, फिर यह देखने के लिए लॉग का विश्लेषण करें कि प्रक्रिया कहां बंद हो रही है।
3) एक बाहरी स्क्रिप्ट लिखें जो लगातार httpd प्रक्रियाओं के पूल को स्कैन करती है, और यदि यह बहुत सारी मेमोरी का उपयोग करके देखती है, तो इसे एक यूएसआर 2 सिग्नल भेजता है (जिसे हमने स्टैक ट्रेस डंप करने की व्यवस्था की है)।
4) किसी भी तरह की प्रक्रिया पर नजर रखने के लिए अपने स्वयं के स्मृति लगातार, और एक स्टैक ट्रेस डंप जब स्मृति उच्च लेकिन "मेमोरी से बाहर" त्रुटि से पहले हो जाता है की है।
धन्यवाद!
जॉन
क्या [Devel :: NYTProf] (http://search.cpan.org/perldoc?Devel::NYTProf) के तहत प्रक्रिया को चलाने के लिए संभव है? –
जैसा कि मैंने कहा था, समस्या बहुत ही कम होती है - चलो एक घंटे के लोड परीक्षण के बाद कहें - इसलिए अगर हम प्रोफाइलिंग के तहत या भारी लॉगिंग के तहत भाग गए तो हमें बड़ी मात्रा में डेटा एकत्र करना होगा। साथ ही यह अच्छा होगा समाधान जो उत्पादन में काम करेगा, जहां स्पष्ट रूप से हम डेवेल :: NYTProf के तहत नहीं चल सकते हैं। –