Apache और PHP के साथ मेमोरी लीक की जांच कैसे करें?


16

हम एक भारी Drupal वेबसाइट चला रहे हैं जो वित्तीय मॉडलिंग करती है। हमें लगता है कि किसी तरह की मेमोरी लीक हो रही है, इस तथ्य को देखते हुए कि अपाचे द्वारा उपयोग की जाने वाली मेमोरी बढ़ती है जबकि अपाचे प्रक्रियाओं की संख्या स्थिर होती है:

यहाँ छवि विवरण दर्ज करें

यहाँ छवि विवरण दर्ज करें

हम जानते हैं कि मेमोरी की समस्या अपाचे / PHP से आ रही है क्योंकि जब भी हम /etc/init.d/httpd reloadमेमोरी यूज़ ड्रॉप (स्क्रीनशॉट देखें और CLI आउटपुट के नीचे देखें) जारी करते हैं:

Httpd से पहले पुनः लोड करें

$ मुक्त
             कुल उपयोग मुक्त साझा बफ़र्स कैश्ड
मेम: 49447692 45926468 3521224 0 191100 22609728
- / + बफ़र्स / कैश: 23125640 26322052
स्वैप: 2097144 536552 1560592

Httpd के बाद पुनः लोड करें

$ मुक्त
             कुल उपयोग मुक्त साझा बफ़र्स कैश्ड
मेम: 49447692 28905752 20541940 0 191360 22598428
- / + बफ़र्स / कैश: 6115964 43331728
स्वैप: 2097144 536552 1560592

प्रत्येक अपाचे थ्रेड को memory_limit512MB का एक PHP सौंपा गया है जो उच्च मेमोरी उपयोग को अनुरोधों की कम मात्रा को चित्रित करता है, और max_execution_time120 सेकंड की एक थ्रेड को समाप्त करना चाहिए जो निष्पादन में अधिक समय ले रहा है, और इसलिए हमें मेमोरी उपयोग में निरंतर वृद्धि को रोकना चाहिए। देख के।

प्रश्न: हम कैसे जांच कर सकते हैं कि इस स्मृति रिसाव के कारण क्या है?

आदर्श रूप से मैं समस्या निवारण चरणों की तलाश कर रहा हूं जो कि देव टीम को परेशान किए बिना मैं सिस्टम पर प्रदर्शन कर सकता हूं।

अतिरिक्त जानकारी:

OS: RHEL 5.6
PHP: 5.3
Drupal: 6.x
MySQL: 5.6

FYI करें हम स्वैपिंग समस्या के बारे में जानते हैं, जिसकी हम अलग से जाँच कर रहे हैं और स्मृति रिसाव से कोई लेना-देना नहीं है जिसे हमने स्वैप करने से पहले देखा है।


पिछली बार मैंने LAMP + Drupal के साथ एक गंभीर मेमोरी उपयोग की समस्या को मारा था जब मेरे पास उपयोग में PHP मेमस्कैल्ड लाइब्रेरी थी। के बाद मैं इसे दूर ले स्मृति उपयोग बहुत नाटकीय रूप से गिरा दिया। सिर्फ एक अनुमान। थोड़ी देर बाद आप के लिए एक उचित उत्तर टाइप कर सकते हैं।
२६ बजे जने पिक्कारेंन

@JannePikkarainen: हम PHP memcachedलाइब्रेरी का उपयोग कर रहे हैं । मेम्चेचे व्यवस्थापक पृष्ठ के आधार पर memcache.php, हम सभी देख सकते हैं कि हमने 5GBमेमेचे को आवंटित किया है, जिसका 3.3GBउपयोग किया जा रहा है। बहुत अच्छा होगा यदि आप हमें यहाँ और सहायता कर सकते हैं।
मैक्स

हाँ, memcachedडेमॉन ही शायद ठीक है। यह पीएचपी मेकचे लाइब्रेरी है जो मेमोरी को लीक नहीं कर सकती है (और इस तरह एपाचे प्रोसेस मेमोरी उपयोग को बढ़ाती है)। मेरी समस्या लगभग 1-2 साल पहले थी, इसलिए उसके बाद चीजें तय हो सकती थीं। वैसे भी, यदि मेमकेच आपके लिए अनिवार्य नहीं है, तो इसे थोड़ी देर के लिए अक्षम करने का प्रयास करें और देखें कि क्या अपाचे मेमोरी का उपयोग अभी भी बढ़ता है।
जने पिक्कारनेन

वास्तविक समस्या क्या है? प्रदर्शन खराब है? आप हमें बताए बिना लक्षण बता रहे हैं कि हम आपको किस समस्या को हल करने में मदद करने वाले हैं। (और यह क्या स्वैपिंग मुद्दा है जिसके बारे में आप बात कर रहे हैं? क्या आप इसे इतना प्रभावित कर रहे हैं कि यह प्रदर्शन को प्रभावित कर रहा है?)
डेविड श्वार्ट्ज

@DavidSchwartz: समस्या यह है कि यदि हम पुनः आरंभ नहीं करते हैं httpd, तो मेमोरी उपयोग बढ़ता रहता है और बॉक्स अंततः मेमोरी कर्नेल संदेशों में से कुछ के साथ क्रैश हो जाता है। प्रदर्शन अच्छे हैं (जब तक कि मेमोरी उपयोग मेमोरी सीमा के करीब नहीं है)। कृपया स्वैपिंग समस्या पर ध्यान न दें।
मैक्स

जवाबों:


11

हम जानते हैं कि मेमोरी की समस्या अपाचे / पीएचपी से आ रही है क्योंकि जब भी हम /etc/init.d/httpd जारी करते हैं तो मेमोरी उपयोग ड्रॉप लोड हो जाता है

नहीं - इसका मतलब है कि यह वेब ट्रैफ़िक से संबंधित है। आप यह उल्लेख करने के लिए गए हैं कि आप बॉक्स पर mysql चला रहे हैं - संभवतः वेबसर्वर के लिए डेटा प्रबंधित करना - यह आसानी से यहाँ अपराधी हो सकता है। अन्य सेवाओं के रूप में आपका वेबस्टैक उपयोग करता है जिनका आपने उल्लेख नहीं किया है।

प्रत्येक अपाचे धागा को 512MB का एक PHP memory_limit सौंपा गया है जो बताते हैं

नहीं, यह नहीं है। आप औसतन 7 और अधिकतम 25 व्यस्त सर्वरों की रिपोर्टिंग कर रहे हैं - फिर भी आपकी मेमोरी ग्राफ 25Gb के डेल्टा को दर्शाता है।

वास्तव में आपको बुनियादी HTTP ट्यूनिंग के साथ फिर से शुरू करना चाहिए - आपको लगातार 256 http चल रहा है, फिर भी आपकी चोटी का उपयोग 25 है - यह सिर्फ सादा गूंगा है।

और 120 सेकंड की एक max_execution_time जो थ्रेड को समाप्त करना चाहिए जो निष्पादन में अधिक समय ले रहा है

नहीं - केवल अगर निष्पादन का धागा PHP दुभाषिया के भीतर है - नहीं अगर PHP अवरुद्ध है।

जो वित्तीय मॉडलिंग करता है

(आह)

यदि आप अपाचे, थ्रेडेड या प्रीफ़ॉर्क, किस संस्करण को कॉन्फ़िगर किया है, PHP कैसे लागू किया जाता है (मॉड्यूल, cgi, fastcgi), चाहे आप लगातार कनेक्शन का उपयोग कर रहे हों, चाहे आप संग्रहीत प्रक्रियाओं का उपयोग कर रहे हों, इसका विवरण उपलब्ध कराने पर यह उपयोगी होगा।

मेरा सुझाव है कि आप एक अलग मशीन पर mysql ले जाकर शुरू करें और लगातार कनेक्शन का उपयोग करना बंद करें (यदि आप वर्तमान में उनका उपयोग कर रहे हैं)। स्मृति सीमा को बहुत कम सेट करें और इसे प्रति-स्क्रिप्ट के आधार पर ओवरराइड करें। सुनिश्चित करें कि आपको परिपत्र संदर्भ कचरा कलेक्टर स्थापित और कॉन्फ़िगर किया गया है।


2

आपने शायद अपनी समस्या अब तक हल कर ली है। सर्वर को स्वैपिंग / थ्रैशिंग से रखने के लिए एक अंतरिम के रूप में मैं क्रोन से हर घंटे निम्नलिखित कमांड चलाता हूं:

#!/bin/sh 
sync; echo 3 > /proc/sys/vm/drop_caches

मैं यह नहीं कह रहा हूं कि यह एक समाधान है, बस चीजों को चालू रखने और डाउनटाइम को कम करने का एक तरीका है क्योंकि आप स्मृति रिसाव के वास्तविक कारण का निवेश करते हैं।

अधिक विवरण यहां मिल सकता है।

http://www.tecmint.com/clear-ram-memory-cache-buffer-and-swap-space-on-linux/


1

जाहिर तौर पर यह PHP के काम करने का तरीका है - और यदि आप लंबे छोरों पर काम कर रहे हैं जहां आप वस्तुओं का आवंटन कर रहे हैं और कौन जानता है कि क्या आप उन्हें संदर्भ के माध्यम से भी पारित कर रहे हैं, तो इससे निपटने का एकमात्र तरीका है, प्रत्येक PHP प्रक्रिया के लिए एन अनुरोधों के बाद इसे रोकने के लिए। यदि आप PHP को CGI के रूप में चलाते हैं, तो प्रत्येक अनुरोध यह प्रतिक्रिया देता है - इसलिए कोई मेमोरी लीक नहीं है, और प्रदर्शन ड्रॉप इतना बड़ा नहीं हो सकता है। आप फास्ट-सीजीआई भी चला सकते हैं, जहां उदाहरण के लिए प्रत्येक 1000 php-fcgi प्रक्रिया को मार दिया जाता है और यह जारी की गई मेमोरी है - फिर से दूसरा मेमोरी लीक। यदि आप PHP को मॉड्यूल mod_php के रूप में चलाते हैं, तो आप यह देखने के लिए httpd.conf में maxrequests को सेटअप करने का प्रयास कर सकते हैं कि क्या यह मदद करता है। मैं उदाहरण के लिए सेटअप करने की कोशिश करूँगा 10 - अगर यह काम करने जा रहा है, तो प्रदर्शन ड्रॉप अधिक नहीं होगा, लेकिन मेमोरी लीक नहीं होनी चाहिए,


-1

वैश्विक php.ini फ़ाइल पर मेमोरी की जाँच करें। बस 1 जी आदि की तरह वैधता न करें ... मैं अत्यधिक अनुशंसा करता हूं कि एक स्थानीय php.ini को उस खाते में लाया जाए ताकि पूरे सर्वर को प्रभावित न किया जाए। मैं वैश्विक php.ini सीमा को 64M के आसपास स्थापित करने की सलाह दूंगा क्योंकि यह आमतौर पर अधिकांश खातों के लिए पर्याप्त है

अपनी अपाचे सेटिंग्स भी जांचें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.