सप्ताह में एक बार के बारे में, लेकिन कभी-कभी दिन के लिए ठीक चलने के बाद भी दिन में दो बार, मेरे ईसी 2 उदाहरण अनुत्तरदायी बन जाते हैं। मुनिन की स्मृति रेखायें एक बहुत ही सीधी-सादी कहानी कहती हैं: "ऐप्स" को आवंटित की गई मेमोरी बढ़ने लगती है और तब तक नहीं रुकती जब तक कि स्वैप पूरी तरह से उपयोग नहीं हो जाता है और उदाहरण को प्रभावी ढंग से अपने घुटनों तक लाया जाता है। एक और कस्टम ग्राफ दिखाता है कि लगातार बढ़ती प्रक्रिया अपाचे 2 है।
मैं mod_php और कुछ PHP स्क्रिप्ट के साथ एक मानक प्रीफ़ॉर्क Apache सेटअप चलाता हूं। जैसा कि आप नीचे दिए गए ग्राफ़ में देख सकते हैं, कुछ ऐसा होता है जो अधिक से अधिक मेमोरी का उपभोग शुरू करने के लिए अपाचे 2 प्रक्रियाओं को ट्रिगर करता है। पहली हरी स्पाइक जिसे मैंने समय पर पकड़ा और चीजों को हाथ से निकलने से पहले अपाचे को फिर से चालू कर दिया। दूसरा स्पाइक थोड़ा आगे बढ़ गया और उदाहरण के लिए सीधे रिबूट करना पड़ा।
मैं सोच रहा हूँ कि यह कैसे सबसे अच्छा डिबग करने के लिए है। FastCGI के साथ PHP की स्थापना करने और इसे अपनी प्रक्रियाओं में चलाने से कम, यह पता लगाने का एक अच्छा तरीका है कि क्या यह अपाचे या PHP और मेरे कोड का संयोजन है जो अत्यधिक मेमोरी उपयोग का कारण है? आप लोग इस मुद्दे को ट्रैक करने के लिए क्या कदम उठाएंगे?
अद्यतन: मैट नीचे दिए गए सुझाव के अनुसार, मैं स्ट्रीम को शामिल करने के बाद रिसाव को ट्रैक करने में सक्षम था।
एक अपाचे 2 प्रक्रिया को खोजने के बाद, जो धीरे-धीरे और लगातार मेमोरी में बढ़ रही थी, मैंने अपनी PHP स्क्रिप्ट में कुछ और error_log () कॉल जोड़े, जो कि इसके निष्पादन में विभिन्न बिंदुओं पर उपयोग किए गए RSS की कुल राशि (ps के आउटपुट का उपयोग करके) का प्रिंट निकालते हैं। हालांकि यह भ्रामक निकला - जबकि ऐसा प्रतीत हुआ कि मेरी स्क्रिप्ट को निष्पादित करने के बाद ही आरएसएस कूद गया, बाद में डिबगिंग से पता चला कि वास्तव में ऐसा नहीं था। सावधान रहे!
सौभाग्य से, वे सभी error_log () कॉल अंत में उपयोगी साबित हुए। जब मैंने स्ट्रेस ( strace -p <pid> -tt -o trace.log -s 256
) निकाल दिया , तो मैंने देखा कि प्रत्येक अनुरोध के लिए, प्रक्रिया को लगभग 400k मेमोरी ('brk' सिस्टम कॉल के लिए आवंटित किया गया था) और अंतिम कॉल के पहले कॉल के पैरामीटर को घटाएं - कुछ एक में आमतौर पर आते हैं। दूसरे के बाद)। मैंने तब सबसे हाल के 'राइट' सिस्टम कॉल की खोज की जिसमें मेरा error_log () संदेश था, जिसने मुझे बताया था कि किस स्क्रिप्ट में मेमोरी आवंटित की जा रही है। रणनीतिक रूप से रखी गई कुछ और त्रुटि के साथ_लॉग () स्थान को अधिक सटीक रूप से इंगित करने के लिए कॉल करता है, मुझे अंततः अपराधी मिल गया।
जब हम अपने PHP स्क्रिप्ट से curl_exec () कहते हैं तो मेमोरी लीक हो रही थी। SSL कनेक्शन को संभालने से संबंधित कुछ कर्ल कोड कुछ गलत कर रहे हैं - जब मैं HTTP पर स्विच किया गया तो रिसाव दूर हो गया। कर्ल के चैंजगॉग में कुछ एसएसएल मेमोरी लीक हैं जो 7.19.5 में तय किए गए थे (हम 7.18.2 पर थे) इसलिए मैं इसके बाद की कोशिश करूंगा।
इस बीच, मैं बहुत कम MaxRequestsPerChild के साथ चल रहा हूं जो Apache को उचित सीमा के भीतर रख रहा है। सबको धन्यवाद!