Apache MaxClients तक पहुँचती है और सर्वर को लॉक करती है


9

मेरे पास वर्तमान में एक Apache2 सर्वर है जो 512M वास्तविक / 1024M बर्स्टेबल रैम (कोई स्वेप्ट) के साथ OpenVZ VPS पर mpm-preforkऔर साथ नहीं चल रहा है mod_php। कुछ परीक्षणों को चलाने के बाद, मैंने पाया कि अधिकतम प्रक्रिया का आकार अपाचे 23M है, इसलिए मैंने MaxClients25 (23M x 25 = 575 एमबी, मेरे लिए ठीक है) पर सेट किया है। मैंने अपने सर्वर पर कुछ लोड परीक्षण चलाने का फैसला किया, और परिणामों ने मुझे हैरान कर दिया।

मैं abअपने डेस्कटॉप मशीन पर एक वर्डप्रेस ब्लॉग से मुख्य पृष्ठ का अनुरोध कर रहा हूं ।

जब मैं ab24 समवर्ती कनेक्शनों के साथ चलता हूं , तो सब कुछ ठीक लगता है। निश्चित रूप से, सीपीयू ऊपर जाता है, मुफ्त रैम नीचे जाता है, और परिणाम प्रति अनुरोध 2-3 बार प्रतिक्रिया समय होता है।

लेकिन अगर मैं ab25 समवर्ती कनेक्शन (मेरी सर्वर सीमा) के साथ चलता हूं, तो अपाचे बस कुछ सेकंड के बाद लटका देता है। यह अनुरोधों को संसाधित करना शुरू कर देता है, फिर यह जवाब देना बंद कर देता है, सीपीयू 100% बेकार और abसमय से बाहर चला जाता है। अपाचे लॉग का कहना है कि यह पहुंच गया MaxClients

जब ऐसा होता है, तो Apache अपने आप को 25 चालू प्रक्रियाओं के साथ बंद रखता है (यदि वे सर्वर स्थिति की जांच करते हैं तो सभी में "W" हैं) और TimeOutसेटिंग के बाद ही प्रक्रियाएं मरने लगती हैं और सर्वर फिर से जवाब देना शुरू कर देता है (मेरे मामले में यह सेट है से ४५)।

मेरा प्रश्न: क्या वह अपेक्षित व्यवहार है? क्यों अपाचे मर जाता है जब यह पहुंच जाता है MaxClients? यदि यह 24 कनेक्शनों के साथ काम करता है, तो क्या यह 25 के साथ काम नहीं करना चाहिए, बस प्रत्येक अनुरोध का जवाब देने और शेष को कतारबद्ध करने में अधिक समय लग सकता है?

यह मुझे बहुत अजीब लगता है कि कोई भी बच्चा abअकेले सर्वर के समवर्ती कनेक्शन को सेट करके वेबसर्वर को मार सकता है MaxClients

जवाबों:


17

हा! मैंने आखिरकार खुद ही समस्या का पता लगा लिया। यह सर्वर व्यवस्थापक की तुलना में प्रोग्रामिंग से अधिक संबंधित है, लेकिन मैंने इसका जवाब वैसे भी यहां रखने का फैसला किया क्योंकि Google को खोजकर मैंने पाया कि मैं उस तरह की समस्या वाला एकमात्र नहीं हूं (और जब से अपाचे लटका हुआ है, पहला अनुमान यह है कि समस्या है सर्वर के साथ)।

मुद्दा अपाचे के साथ नहीं है, लेकिन मेरे वर्डप्रेस के साथ है। अधिक विशेष रूप से मेरे विषय के साथ। मैं लाइटवर्ल्ड नामक एक विषय का उपयोग कर रहा हूं और यह ब्लॉग हेडर में एक छवि जोड़ने का समर्थन करता है। यह अनुमति देने के लिए, यह PHP के फ़ंक्शन का उपयोग करके छवि आकार की जांच करता है getimagesize()। चूंकि यह फ़ंक्शन छवि प्राप्त करने के लिए सर्वर से एक और http कनेक्शन खोल रहा था, इसलिए प्रत्येक अनुरोध abPHP से आंतरिक रूप से एक और अनुरोध बना रहा था। जैसा कि मैं अपने सभी सर्वर उपलब्ध स्लॉट्स का उपयोग कर रहा था, इन PHP अनुरोधों को कतार में रखा गया था, लेकिन अपाचे उन्हें कभी नहीं मिल सकता था क्योंकि यह सभी प्रक्रियाएं मूल अनुरोध के साथ बंद थीं जो PHP आंतरिक अनुरोध को पूरा करने के लिए स्लॉट की प्रतीक्षा कर रही थीं।

मूल रूप से, PHP मेरे सर्वर को एक डेडलॉक स्थिति में डाल रहा था, और अपाचे केवल सामान्य रूप से काम करना शुरू कर देंगे, क्योंकि ये कनेक्शन उनके "बच्चे" के अनुरोध के इंतजार में समाप्त हो जाएंगे।

जब मैंने इस थीम को अपनी थीम से हटा दिया, तो अब मैं abअपने सर्वर को जितने चाहे समवर्ती कनेक्शन के साथ रख सकता हूं, और अपाचे उन्हें उम्मीद के मुताबिक कतार में खड़ा कर रहा है।


इसे यहाँ पोस्ट करने के लिए धन्यवाद, मैं अभी कुछ दिनों के लिए समान लक्षणों के साथ एक समस्या का पता लगाने की कोशिश कर रहा हूँ - लगता है कि हमारे पास गतिरोध भी है!
जेम्स येल

आपने यह कैसे निर्धारित किया है, प्राथमिक रूप से लॉग आउट और आपके द्वारा माध्यमिक आउटबाउंड अनुरोध को निर्धारित करने के लिए उपयोग किए जाने वाले उपकरणों में दिलचस्पी है।
अनिरुद्ध गोयल

2

यहां क्या हो रहा है कि आपके पास 25 धागे हैं जो कनेक्शन स्वीकार करने में सक्षम हैं, और आप 26 समवर्ती अनुरोध भेज रहे हैं। वह अंतिम अनुरोध आपके बैकलॉग के आकार पर निर्भर सॉकेट कतार में बैठता है।

दूसरी समस्या यह है कि आप जो कुछ भी चला रहे हैं, जिसमें 2-3 सेकंड लगते हैं, यह प्रतिक्रिया देने में काफी समय ले रहा है कि 25 समवर्ती कनेक्शन इसे धीमा कर रहे हैं। नींद (1) काम कर सकती है, लेकिन, कुछ ऐसा है जहाँ आप फ़ाइल लॉकिंग या टेबल लॉकिंग mysql से कर रहे हैं, प्रत्येक समानांतर अनुरोध 45 सेकंड के समय आउट होने तक पूरा होने से पहले इंतजार करना पड़ सकता है।

23mb mod_php के साथ एक अपाचे प्रक्रिया के लिए छोटा लगता है और किसी भी मॉड्यूल को लोड किया जाता है, इसलिए, मुझे संदेह है कि आप उन अपाचे प्रक्रियाओं को थोड़ा और राम ले रहे होंगे जैसा कि आपका एप्लिकेशन चल रहा है। आप वास्तव में MaxClients और स्मृति के साथ गणित नहीं कर सकते हैं ... यह कुछ हद तक करीब होगा, लेकिन, आप कभी नहीं जानते।

www-data  1495  0.1  0.9  56288 19996 ?        S    15:48   0:01 /usr/sbin/apache2 -k start
www-data  1500  0.0  0.5  49684 12436 ?        D    15:48   0:00 /usr/sbin/apache2 -k start

एक मशीन, 56M और 49M प्रक्रिया है।

एक और मशीन:

www-data  7767  0.1  0.1 213732 14840 ?        S    14:55   0:08 /usr/sbin/apache2 -k start
www-data  8020  0.2  0.1 212424 13660 ?        S    14:57   0:08 /usr/sbin/apache2 -k start

एक और मशीन:

www-data 28509  0.8  0.1 161720 10068 ?        S    14:39   0:43 /usr/sbin/apache2 -k start
www-data 28511  0.8  0.1 161932 10344 ?        S    14:39   0:43 /usr/sbin/apache2 -k start

इसलिए, मेमोरी का उपयोग कार्य पर बहुत निर्भर है, जो मॉड्यूल लोड किए गए हैं आदि। पिछले दो पर, मेरा मानना ​​है कि हमने pdo & pdo_mysql को अक्षम कर दिया है क्योंकि एप्लिकेशन उनका उपयोग नहीं करता है।

असली सवाल यह है कि आप क्या कर रहे हैं जो 3 सेकंड ले रहा है? आज की दुनिया में, यह एक अनंत काल है और एक 'अवरुद्ध' अनुप्रयोग माना जाता है। अपाचे आम तौर पर नहीं मरेंगे, लेकिन, उन थ्रेड्स को बैकलॉग कतार में छोड़ देंगे, जब तक कि यह उन्हें सेवा नहीं दे सकता है या प्रतीक्षा समय समाप्त हो सकता है। मुझे विश्वास है कि आपका आवेदन संभवतः समय के लिए अपाचे का कारण बन रहा है। इसे पृष्ठ पर आज़माएँ जिसमें सिर्फ phpinfo () हो; और देखें कि क्या परिणाम समान हैं।


सभी सुझावों के लिए धन्यवाद! मुझे पता है कि मुझे अभी भी बहुत सी चीजों को अनुकूलित करने की आवश्यकता है (मैंने अभी कुछ दिन पहले सर्वर को कॉन्फ़िगर करना शुरू किया था और यह एक वीपीएस के साथ मेरा पहला अनुभव है), लेकिन समस्या इससे कहीं अधिक गहरी थी ... मैंने इसका जवाब पोस्ट किया प्रश्न यह बताना कि मेरे विशिष्ट मामले में क्या समस्या थी।
रॉड्रिगो सिएरो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.