2008-10-06 18 views
10

का उपयोग करता है हम एक मध्यम आकार की साइट चलाते हैं जो दिन में कुछ सौ हजार पृष्ठदृश्य प्राप्त करता है। पिछले सप्ताहांत तक हम वर्चुअल मशीन पर आमतौर पर 0.2 से नीचे लोड के साथ भाग गए। ओएस उबंटू है।अपाचे अत्यधिक CPU

हमारे आवेदन के नवीनतम संस्करण को तैनात करते समय, हमने तैनाती से पहले एक अपतटीय डिस्ट-अपग्रेड भी किया। हमने तैनात किए जाने के बाद हमने देखा कि सीपीयू पर लोड नाटकीय रूप से बढ़ गया था (कभी-कभी 10 तक पहुंचता है और पृष्ठ अनुरोधों का जवाब देने के लिए रोकता है)।

हमने PHP से Xdebug प्रोफाइलिंग डेटा के पूर्ण मिनट को डंप करने का प्रयास किया, लेकिन इसके माध्यम से देखकर कुछ हद तक धीमे हिस्सों को पता चला, लेकिन भारी कूद को समझाने के लिए कुछ भी नहीं।

अब हम निश्चित हैं कि हमारी वेबसाइट के नए संस्करण में कुछ भी समस्या को ट्रिगर नहीं कर रहा है, लेकिन हमारे पास यह सुनिश्चित करने का कोई तरीका नहीं है। हमने बहुत सारे बदलावों को वापस ले लिया है, लेकिन समस्या अभी भी बनी हुई है।

प्रक्रियाओं को देखते समय, हम देखते हैं कि एकल अपाचे प्रक्रियाएं सख्ती से आवश्यक समय की तुलना में काफी समय तक CPU का उपयोग करती हैं। हालांकि, जब प्रभावित प्रक्रिया पर strace का उपयोग कर, हम कुछ भी लेकिन

accept(3, 

कभी नहीं है और यह एक नया कनेक्शन प्राप्त करने से पहले कुछ समय के लिए लटका हुआ है, इसलिए हम वास्तव में क्या समस्या का कारण है नहीं देख सकता।

ढेर PHP 5, अपाचे 2 (prefork), MySQL 5.1 है। अधिकांश चीजें Memcached के माध्यम से चलाते हैं। हमने एपीसी और ई एक्सेलेरेटर की कोशिश की है।

तो, हमारा अगला कदम क्या होना चाहिए? क्या कोई प्रोफाइलिंग विधियां हैं जिन्हें हमने अनदेखा/नहीं किया है?

+0

किस संस्करण से आपने सिस्टम को अपग्रेड किया था? मेरा मतलब है ए) PHP, बी) अपाचे और सी) memcached। – Georgi

+0

मेरे पास इसका लॉग इन नहीं है, दुर्भाग्य से। जहां तक ​​मुझे पता है कि कोई उपयुक्त/योग्यता लॉग नहीं है। –

उत्तर

11

उत्तर अप-अपाचे से संबंधित नहीं हुआ। जैसा कि बताया गया है, हम वर्चुअल मशीन पर थे। हमारे उपयोगकर्ता सत्र बहुत बड़े हैं (प्रति सक्रिय उपयोगकर्ता 500kB सोचें), इसलिए हमारे पास बहुत सी डिस्क आईओ थी। डिस्क लगभग पूरी थी, जिसका अर्थ है कि उबंटू ने चीजों को चारों ओर स्थानांतरित करने में बहुत समय बिताया (या तो हम सोचते हैं)। डिस्क का विस्तार करने का कोई आसान तरीका नहीं था (क्योंकि यह VMWare के लिए ठीक से स्थापित नहीं किया गया था)। यह पूरी तरह से प्रदर्शन को मार डाला, और अपाचे और माईएसक्यूएल कभी-कभी 100% सीपीयू (बहुत ही कम समय के लिए) का उपयोग करेगा, और सीपीयू उपयोग मीटर को अपडेट करने के लिए सिस्टम इतना धीमा होगा कि यह वहां अटक गया था।

हमने एक नया वीएम स्थापित करने का अंत किया (जिसने हमें सर्वर पर सब कुछ पूरी तरह से दस्तावेज करने का मौका दिया)। नए वीएम पर हमने डिस्क की बहुत सारी जगह आवंटित की, और सत्रों को मेमोरी में ले जाया (memcached का उपयोग कर)। हमारा भार ऑफ-पीक उपयोग पर 0.2 तक गिर गया और लगभग 1 निकटतम उपयोग (2-सीपीयू वीएम पर)। सत्रों को मेमकैच में ले जाने से बहुत सी डिस्क आईओ दूर हो गई (हम लगातार डिस्क के बारे में 2 एमबी/एस का उपयोग कर रहे थे, जो बहुत खराब है)।

निष्कर्ष; कभी-कभी आपको बस शुरू करना होगा ... :)

1

शायद आप पहले कार्यकर्ता एमपीएम का उपयोग कर रहे हैं और अब आप नहीं हैं?

मुझे पता है कि PHP5 वर्कर एमपीएम के साथ काम नहीं करता है। मेरे उबंटू सर्वर पर, PHP5 केवल प्रीफ़ोर एमपीएम के साथ स्थापित किया जा सकता है। ऐसा लगता है कि PHP5 मॉड्यूल अपाचे के मल्टीथ्रेडिंग संस्करण के साथ संगत नहीं है।

मैं एक लिंक यहाँ है कि आप कैसे mod_fcgid

के साथ बेहतर प्रदर्शन प्राप्त करने के लिए क्या कार्यकर्ता एम पी एम here देखना है यह देखने के लिए दिखाई देगा पाया।

+0

अपाचे अभी भी prefork का उपयोग कर चल रहा है। PHP ठीक काम कर रहा है। –

+0

विचारों में से मुझे डर है कि मैंने सोचा था कि आप एप्लिकेशन के अपने पुराने संस्करण में php4 का उपयोग कर रहे हैं और अब से php5 apapche को अपडेट करने के लिए prefork मोड में चल रहा है। Php4 का उपयोग कर एप्लिकेशन का आपका पुराना संस्करण था? –

+0

शायद एक महीने पुराना हो सकता है। हम हर तैनाती से पहले उन्नयन करते हैं। हम इस समस्या के बाद ऐसा करना बंद कर सकते हैं, हालांकि ... :) –

1

मैं इस रहस्य को हल करने के लिए डीटीआरई का उपयोग करूंगा ... अगर यह सोलारिस या मैक पर चल रहा था ... लेकिन चूंकि लिनक्स के पास यह नहीं है तो आप अपने Systemtap को आजमा सकते हैं, हालांकि मैं कुछ भी नहीं कह सकता इसकी उपयोगिता के बारे में मैंने इसका उपयोग नहीं किया है।

dTrace साथ आप आसानी से बाहर अपराधियों एक दिन के भीतर सूंघ सकता है, और Systemtap साथ आशा करता हूं कि यह समान होगा

+0

सिस्टमटैप अब जटिल के लिए थोड़ा सा लगता है। –

0

एक अन्य विकल्प है कि मैं आप किसी भी भला होगा आश्वासन नहीं कर सकता है, लेकिन इसके लायक से भी अधिक है प्रयास है। नए संस्करण के लिए विस्तृत चेंजलॉग पढ़ना है, और समीक्षा करें कि क्या बदल सकता है जो आपको दूरस्थ रूप से प्रभावित कर सकता है।

चेंजलॉग के माध्यम से जाने से मुझे एक से अधिक बार बचाया गया है। खासकर जब कुछ कॉन्फ़िगरेशन विकल्प बदल गए हैं और जब कुछ बहिष्कृत हो गया है। सबसे खराब मामला यह है कि यह आपको कुछ संकेत देगा कि अगले

+0

इस मामले के लिए, यह वास्तव में मदद नहीं की है। हमने शुरुआत में ऐसा किया था, और कुछ प्रदर्शन समस्याओं को पाया, लेकिन उन परिवर्तनों को वापस लाने से दुर्भाग्य से समस्या हल नहीं हुई। –

5

आपकी अपाचे प्रक्रिया से एक स्वीकृति() कॉल को असामान्य नहीं है - यह वेबसेवर एक नए अनुरोध की प्रतीक्षा कर रहा है।

सबसे पहले, आप यह निर्धारित करना चाहते हैं कि लोड के पैरामीटर क्या हैं। कुछ

vmstat 1 

आपको दिखाएगा कि आपका सिस्टम क्या कर रहा है। 'स्वैप' और 'io' कॉलम में देखें। यदि आप 'si' और 'so' कॉलम में '0' के अलावा कुछ भी देखते हैं, तो कम सिस्टम की स्थिति के कारण आपका सिस्टम स्वैपिंग हो रहा है। अपाचे बच्चों को चलाने की संख्या को कम करने या अपने सर्वर में अधिक रैम फेंकने पर विचार करें।

यदि रैम कोई समस्या नहीं है, तो 'cpu' कॉलम देखें। आप 'हमें' और 'sy' कॉलम में रूचि रखते हैं। ये आपको उपयोगकर्ता प्रक्रियाओं या सिस्टम में खर्च किए गए CPU समय का प्रतिशत दिखाते हैं। एक उच्च 'हम' संख्या अपाचे या आपकी स्क्रिप्ट पर उंगली को इंगित करती है - या संभावित रूप से सर्वर पर कुछ और।

रनिंग

top 

तुम्हें दिखाता हूँ जो प्रक्रियाओं सबसे अधिक सक्रिय हैं।

क्या आपने अपना डेटाबेस अस्वीकार कर दिया है? अप्रत्याशित रूप से उच्च लोड का सबसे आम कारण मैंने उत्पादन LAMP ढेर पर देखा है डेटाबेस क्वेरी पर आ गया है। आपने इसमें एक महंगी क्वेरी के साथ नया कोड तैनात किया हो सकता है; या उस बिंदु पर पहुंचे जहां आपके डेटासेट में पर्याप्त पंक्तियां हैं जो पहले सस्ते प्रश्नों को महंगा बनने का कारण बनती हैं।

उच्च लोड की अवधि के दौरान,

echo "show full processlist" | mysql | grep -v Sleep 

करना अगर वहाँ या तो लंबे समय से चल प्रश्नों, या एक ही क्वेरी एक बार में परिचालन की बड़ी संख्या को देखने के लिए। अन्य mysql टूल्स आपको इन्हें अनुकूलित करने में मदद करेंगे।

आप अपाचे के लिए mod_status को कॉन्फ़िगर और उपयोग करने के लिए उपयोगी पा सकते हैं, जो आपको यह देखने की अनुमति देगा कि प्रत्येक अपाचे बच्चे किस सेवा का अनुरोध कर रहा है और यह कितना समय से ऐसा कर रहा है।

अंत में, कुछ दीर्घकालिक सांख्यिकीय निगरानी स्थापित करें। ज़ब्बिक्स की तरह कुछ कॉन्फ़िगर करने के लिए सीधा है, और आपको समय के साथ संसाधन उपयोग की निगरानी करने देगा, जैसे कि यदि चीजें धीमी हो जाती हैं, तो आपके पास तुलना करने के लिए ऐतिहासिक बेसलाइन हैं, और जब समस्याएं शुरू हुईं तो बेहतर इइडा।

+0

समस्या सीपीयू का उपयोग कर अपाचे है। पर्याप्त रैम से अधिक है (हम अपग्रेड से पहले 512 एमबी पर दौड़ चुके थे, अब हमारे पास 2 जीबी है)। कोई स्वैपिंग नहीं हो रहा है। MySQL धीमी क्वेरी लॉग रिपोर्ट असामान्य कुछ भी नहीं है। अब हम भारी उपयोग के दौरान 40 पर लोड स्पाइकिंग देख रहे हैं। –

+0

mod_status यहां से आपकी सबसे अच्छी शर्त है। साथ ही, केवल माता-पिता की बजाय अपनी सभी अपाचे प्रक्रियाओं को स्ट्रेस करने के लिए, प्रयास करें: ps aux | grep एच [टी] टीपीडी | awk '{print "-p" $ 2}' | xargs स्ट्रेस –

संबंधित मुद्दे