अपाचे टाइमआउट डिबग कैसे करें?


14

मैं एक 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 का उपयोग नहीं कर रही है।

मैंने स्पाइक्स के ग्राफ में एक ज़ूम किया है: जूम रिक्वेस्ट रिस्पॉन्स टाइम

मेरे लिए यह कुछ सेकंड के लिए अपाचे हाल्ट की तरह दिखता है और फिर पड़ाव के दौरान आए अनुरोधों को संसाधित करने के लिए कड़ी मेहनत करता है। ऐसे पड़ाव का क्या कारण हो सकता है, या क्या मैं इसका गलत अर्थ निकाल रहा हूं?


1
मैं अनुरोधों पर कुछ रेखांकन के साथ पोस्ट करना चाहता था, लेकिन मेरा प्रतिनिधि बहुत कम है।
लियोन

जवाबों:


4

पहली बात जो मैंने नोट की है, आपके पहले ग्राफ को देखते हुए, एक घंटे की मंदी (घंटे के लगभग 40 मिनट पहले होने वाली) प्रतीत होती है जो समस्या में योगदान दे सकती है। आपको OS / डेटाबेस पर कार्य शेड्यूलर पर एक नज़र रखना चाहिए।

आपके द्वारा प्रदत्त डेटा के आधार पर, मेरा अगला कदम यह है कि प्रतिक्रिया समय की आवृत्ति (X पर Y अक्ष बनाम अवधि पर प्रतिक्रियाओं की संख्या) को देखें, लेकिन केवल उन URL को शामिल करें जो टाइमआउट प्रदर्शित करते हैं (या अधिमानतः एक समय में एक URL )। एक विशिष्ट प्रणाली पर यह एक सामान्य या पॉइसन वितरण का पालन करना चाहिए - जो अनुरोध समय-समय पर हो रहे हैं वे केवल पूंछ का हिस्सा हो सकते हैं - जिस स्थिति में आपको सामान्य ट्यूनिंग पर अपने प्रयासों पर ध्यान देने की आवश्यकता है। OTOH यदि वितरण द्वि-मोडल है, तो आपको अपने कोड में कहीं भी विवाद देखने की आवश्यकता है।


आपके प्रतिक्रिया के लिए धन्येवाद। मैं देख रहा हूँ कि प्रति घंटा की मंदी के कारण क्या हो सकता है। इस समय के दौरान, मेरे पास पहले से मौजूद डेटा का एक आवृत्ति प्लॉट बना। यह केवल उन URL में से एक है जिसमें टाइमआउट की समस्या है (लेकिन अन्य बहुत समान दिखते हैं ): leela.kikora.no/apache_hist_show.png 10 सेकंड से अधिक समय लेने वालों की तुलना में टाइमआउट की मात्रा बहुत कम है, लेकिन यह दिखता है जैसे यह पूंछ का हिस्सा नहीं हो सकता है। लेकिन दूसरी ओर यह सिर्फ इतना हो सकता है कि चूंकि वे 50+ सेकंड के लिए किसी भी चीज़ का प्रतिनिधित्व करते हैं, यह इस तरह दिखना चाहिए।
लियोन

3

मैंने इस पर एक और विचार किया है, इस तथ्य के आधार पर कि आपको प्रति दिन बड़ी संख्या में अनुरोध मिलते हैं, और लगता है कि केवल पीक आवर्स (आपके द्वारा पोस्ट की गई तस्वीरों से) के दौरान ही समय समाप्त होगा।

सर्वर फॉल्ट ब्लॉग पर एक पोस्ट है,Per Second Measurements Don't Cut It ... क्या यह संभव है कि इनमें से कुछ अनुरोध उसी समस्या में चल रहे हैं जो सर्वरफॉल्ट टीम में भाग गया?

हमने पाया कि हम केवल 10-30 MBit / s की दरों पर 1 Gbit / s इंटरफेस पर पैकेट को बहुत बार छोड़ रहे थे जो हमारे प्रदर्शन को नुकसान पहुंचाता है। ऐसा इसलिए है क्योंकि 10-30 MBit / s दर वास्तव में बिट्स की संख्या प्रति 5 मिनट में एक दूसरी दर में परिवर्तित हो जाती है। जब हमने विंडशार्क के साथ करीब में खुदाई की और एक मिलीसेकंड आईओ ग्राफिंग का इस्तेमाल किया, तो हमने देखा कि हम अक्सर तथाकथित 1 Gbit / s इंटरफेस के 1 मिली प्रति सेकंड की दर से फट जाएगा।


दिलचस्प है, मैं इसे देख लूंगा। मैंने mod_reqtimeout सक्षम किया है और इसे RequestReadTimeout शीर्षलेख = 20-40, मिनरेट = 500 और RequestReadTimeout body = 10, minrate = 500 पर सेट किया है और लगभग सभी टाइमआउट अब 10 सेकंड में होते हैं। मुझे लगता है कि अनुरोध करने के लिए शरीर को बहुत लंबा समय लगता है (शरीर को कभी भी कुछ सौ बाइट्स से अधिक नहीं होना चाहिए) इसलिए या तो मेरे कुछ उपयोगकर्ताओं के खराब कनेक्शन हैं या जैसा कि आप कहते हैं कि मेरे सर्वर पर कुछ भीड़ है।
लियोन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.