मैं एक Apache 2.2 सर्वर (Ubuntu Server 10.04, 8x2GHz, 12Gb RAM) का उपयोग करके PHP वेब एप्लिकेशन चलाता हूं prefork
। प्रत्येक दिन अपाचे को लगभग 100k-200k अनुरोध प्राप्त होते हैं, इनमें से लगभग 100-200 समयबाह्य सीमा (इसलिए प्रत्येक हजार में एक) को हिट करते हैं, बहुत अधिक अन्य सभी अनुरोधों को टाइमआउट के नीचे अच्छी तरह से परोसा जाता है।
मैं यह पता लगाने के लिए क्या कर सकता हूं कि ऐसा क्यों होता है? या क्या सभी अनुरोधों के कुछ छोटे भागों का समय समाप्त होना सामान्य है?
यह वही है जो मैंने अब तक किया है:
जैसा कि देखा जा सकता है कि टाइमआउट सीमा और अधिक उचित अनुरोध के बीच बहुत कम अनुरोध हैं। वर्तमान में टाइमआउट की सीमा 50 सेकंड के लिए सेट है, पहले यह 300 पर सेट था और अभी भी कुछ टाइमआउट के साथ यही स्थिति थी और फिर अन्य अनुरोधों के लिए एक बड़ा अंतर है।
सभी अनुरोध जो समय के लिए AJAX
अनुरोध हैं, लेकिन फिर उनमें से अधिकांश हैं, इसलिए शायद यह एक संयोग से अधिक है। अपाचे रिटर्न कोड है 200
, लेकिन टाइमआउट सीमा स्पष्ट रूप से पहुंच गई है। वे विभिन्न आईपी की एक विस्तृत श्रृंखला से हैं।
मैंने उन अनुरोधों पर ध्यान दिया है जो समय से बाहर हैं और उनके बारे में कुछ खास नहीं है, अगर मैं वही अनुरोध करता हूं जो वे एक सेकंड से भी कम समय में करते हैं।
मैंने यह देखने के लिए विभिन्न संसाधनों को देखने की कोशिश की है कि क्या मुझे इसका कारण मिल सकता है लेकिन भाग्य नहीं। हमेशा बहुत सारी मुफ्त मेमोरी होती है (न्यूनतम लगभग 3 जीबी मुफ्त होती है), लोड कभी-कभी 1.4 और सीपीयू उपयोग 40% तक बढ़ जाता है, लेकिन लोड और सीपीयू का उपयोग कम होने पर कई बार होते हैं। दिन के दौरान डिस्क लिखना / पढ़ना बहुत अधिक स्थिर होता है। MySQL स्लो क्वेरी लॉग (1 सेकंड से ऊपर कुछ भी लॉग करने के लिए सेट) में कोई एंट्री नहीं है, कोई भी अनुरोध कई डेटाबेस लिखते / पढ़ता है।
ब्लू सीपीयू उपयोग है, जो 40% की चोटियों पर है, मरून 1.4 पर चोटी के साथ लोड होता है। इसलिए हम देख सकते हैं कि हमें कम CPU उपयोग / लोड (यहां तक कि दस दूसरे स्पाइक्स CPU उपयोग के अनुरूप हैं, लेकिन यह एक और मुद्दा है, मुझे यह पता लगाने की उच्च उम्मीद है कि वे क्या कारण हो सकते हैं)।
अपाचे त्रुटि लॉग में कोई त्रुटि नहीं है और मैंने इसे 200 से अधिक सक्रिय अपाचे प्रक्रियाओं तक पहुंचते नहीं देखा है।
सर्वर सेटिंग्स:
Timeout 50
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 2
<IfModule mpm_prefork_module>
ServerLimit 350
StartServers 20
MinSpareServers 75
MaxSpareServers 150
MaxClients 320
MaxRequestsPerChild 5000
</IfModule>
अपडेट करें:
मैंने Ubuntu 12.04.1 में अपडेट किया, बस मामले में, कोई बदलाव नहीं। मैंने सेटिंग्स के साथ mod_reqtimeout जोड़ा:
RequestReadTimeout header=20-40,minrate=500
RequestReadTimeout body=10,minrate=500
अब लगभग सभी टाइमआउट 10 सेकंड, एक या दो 20 सेकंड पर होते हैं। मुझे लगता है कि इसका मतलब यह है कि ज्यादातर समय यह अनुरोध निकाय प्राप्त करने के लिए समस्याग्रस्त है? अनुरोध निकाय को कभी भी कुछ सौ बाइट्स से बड़ा नहीं होना चाहिए। मैंने प्रति 1 सेकंड के आधार पर नेटवर्क ट्रैफ़िक की निगरानी की है और यह कभी भी 1Mbit / s से अधिक नहीं होता है और मुझे कोई भी rxerrs या rxdorps दिखाई नहीं देता है, यह देखते हुए कि सर्वर 1Gbit / s लाइन पर है, यह ध्वनि की तरह नहीं है HopelessN00b के बारे में पोस्ट किया गया। क्या यह केवल कुछ खराब उपयोगकर्ता कनेक्शनों का मामला हो सकता है?
हर घंटे में स्पाइक्स के लिए (वे थोड़ी देर के आसपास बहाव करने लगते हैं, ऊपर के ग्राफ़ में वे घंटे के 33 मिनट पर हैं, अब वे 12 मिनट अतीत पर हैं), मैंने यह देखने की कोशिश की है कि क्या समय-समय पर कुछ भी चल रहा है ( crons आदि) लेकिन कुछ भी नहीं मिला। PHP कचरा संग्रह हर घंटे में दो बार चलता है, लेकिन स्पाइक्स के समय नहीं, फिर भी मैंने इसे अक्षम करने की कोशिश की है लेकिन इससे कोई फर्क नहीं पड़ता।
मैंने स्पस्ट के समय प्रक्रियाओं को देखने के लिए --टॉप-सीपीयू और टॉप के साथ dstat का उपयोग किया है और जो कुछ दिखाता है वह अपाचे कुछ सेकंड के लिए कड़ी मेहनत कर रहा है लेकिन कोई अन्य प्रक्रिया महत्वपूर्ण cpu का उपयोग नहीं कर रही है।
मैंने स्पाइक्स के ग्राफ में एक ज़ूम किया है:
मेरे लिए यह कुछ सेकंड के लिए अपाचे हाल्ट की तरह दिखता है और फिर पड़ाव के दौरान आए अनुरोधों को संसाधित करने के लिए कड़ी मेहनत करता है। ऐसे पड़ाव का क्या कारण हो सकता है, या क्या मैं इसका गलत अर्थ निकाल रहा हूं?