हा प्रॉक्सी प्रॉक्सी में आप किस मापदंड से टाइमआउट करते हैं?


37

हा प्रॉक्सी को कॉन्फ़िगर करते समय, आप कैसे तय करते हैं कि टाइमआउट को क्या मानें? मैंने विभिन्न ब्लॉगों में आधा दर्जन नमूने पढ़े हैं, और हर कोई अलग-अलग टाइमआउट का उपयोग करता है और कोई भी इसकी चर्चा नहीं करता है।

HAProxy विशेष रूप से क्लाइंट, कनेक्ट और सर्वर के बारे में चिंतित है, जिसे HAPRoxy एक चेतावनी फेंकता है कि क्या आप पूरी तरह से बेकार छोड़ देते हैं:

While not properly invalid, you will certainly encounter various problems
with such a configuration. To fix this, please ensure that all following
timeouts are set to a non-zero value: 'client', 'connect', 'server'.

प्रलेखन इस संबंध में बेकार है: यह "3 सेकंड के थोड़ा ऊपर गुणकों" पता चलता है, लेकिन नहीं आप बनाम 100 या 42 1 की एक बहु क्यों निर्णय लेना होगा।

मैं जिस RPM का उपयोग कर रहा हूं (Amazon Linux रिपॉजिटरी) इन डिफॉल्ट्स को सेट करता है:

timeout connect         10s
timeout client          1m
timeout server          1m

जिनमें से दो 3 सेकंड के सटीक गुणक हैं , एकमात्र आधिकारिक सलाह का उल्लंघन करते हुए मैंने देखा है।

यदि आपके पास विशिष्ट ट्यूनिंग सलाह नहीं है, तो शायद एक आसान सवाल यह है: मुझे वास्तव में कम या वास्तव में लंबे समय के साथ गलत होने की क्या उम्मीद करनी चाहिए?

जवाबों:


40

टीसीपी आरटीओ (टाइमआउट प्राप्त करें) तीन सेकंड से शुरू होता है। ( RFC 1122 ) यदि उस समय में प्रेषित पैकेट में कोई पावती नहीं थी, तो उसे खो दिया जाना और वापस ले लिया जाना माना जाता है। यह लगभग निश्चित रूप से लेखक का जिक्र है। (ध्यान दें कि आरटीओ इस प्रश्न के दायरे से बाहर, विभिन्न एल्गोरिदम द्वारा गतिशील या नीचे ट्यून हो जाता है ।)

ध्यान रखें कि यह वास्तव में केवल आपके फ्रंटेंड सर्वर और क्लाइंट (यानी वेब उपयोगकर्ताओं) के बीच कनेक्शन पर लागू होता है। सामान्य परिदृश्यों में, HAProxy और आपके बैकएंड सर्वर के बीच संबंध एक LAN पर होना चाहिए और आपको बहुत कम टाइमआउट का उपयोग करना चाहिए, ताकि बैकएंड में खराबी जल्द ही सेवा से बाहर हो जाए।

आपके वेब उपयोगकर्ताओं के लिए, उनमें से कुछ उपग्रह जैसे बहुत अधिक विलंबता कनेक्शन पर हो सकते हैं, और इसके कारण सामान्य रिट्रांसमिट की तुलना में अधिक अनुभव हो सकता है। एक कनेक्शन पर आरटीटी जहां एक उपग्रह उपयोग में है, भले ही सब ठीक हो, 2000 एमएस से अधिक हो सकता है।

यह सब ध्यान में रखते हुए, आप आम तौर पर बहुत कम समय के लिए timeout connectऔर बहुत लंबे लोगों के लिए चाहते हैं timeout client

इसके लिए timeout server, यह आपके वेब एप्लिकेशन पर निर्भर करता है। टाइमआउट सेट करते समय, वेब एप्लिकेशन की जटिलता पर विचार करें, और जटिल अनुरोध को संसाधित करने में सबसे खराब स्थिति में कितना समय लग सकता है। यदि संदेह है, तो मूल्य बढ़ाएं।


7
गंभीरता से सबसे erudite और विनम्र प्रतिक्रिया मुझे StackExchange पर कहीं भी मिली है। धन्यवाद।
जेरेमी वध्म्स

5
मैं क्या कह सकता हूं, सर्वर फाल्ट केवल घुंघराले घुंघरुओं का एक समूह है।
माइकल हैम्पटन

33

प्रस्तावना

मैं कुछ समय के लिए HAProxy को ट्यून कर रहा हूं और इस पर बहुत सारे प्रदर्शन परीक्षण किए हैं। 100 HTTP अनुरोध / s से 50 000 HTTP अनुरोध / s तक।

पहली सलाह है कि HAProxy पर आँकड़े पृष्ठ को सक्षम करें । आप निगरानी की जरूरत है, कोई अपवाद नहीं है। यदि आपको पिछले 10,000 अनुरोधों को पूरा करने का इरादा है, तो आपको ठीक ट्यूनिंग की भी आवश्यकता होगी।

टाइमआउट एक भ्रामक जानवर हैं क्योंकि उनके पास संभावित मूल्यों की एक विशाल श्रृंखला है, उनमें से अधिकांश में कोई अवलोकन अंतर नहीं है। मुझे अभी तक 5% कम या 5% अधिक संख्या के कारण कुछ विफल दिखाई दे रहा है। 10000 बनाम 11000 मिलीसेकंड, कौन परवाह करता है? शायद आपका सिस्टम नहीं।

विन्यास

मैं अच्छे विवेक में 'सभी के लिए सर्वश्रेष्ठ टाइमआउट' के रूप में कुछ संख्या दे सकता हूं।

इसके बजाय मैं जो बता सकता हूं वह सबसे आक्रामक टाइमआउट है जो HTTP (एस) लोड संतुलन के लिए हमेशा स्वीकार्य है। यदि आप इन से कम मुठभेड़ करते हैं, तो यह आपके लोड बैलेंसर को फिर से कॉन्फ़िगर करने का समय है।

timeout connect 5000
timeout check 5000
timeout client 30000
timeout server 30000

टाइमआउट क्लाइंट:

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

पढ़ें : यह क्लाइंट से HTTP रिक्वेस्ट हेडर प्राप्त करने का अधिकतम समय है ।

3G / 4G / 56k / उपग्रह कई बार धीमा हो सकता है। फिर भी, उन्हें HTTP हेडर को कुछ सेकंड में भेजने में सक्षम होना चाहिए, न कि 30।

यदि किसी का कनेक्शन इतना खराब है कि उसे एक पेज का अनुरोध करने के लिए 30 से अधिक की आवश्यकता है (तो 10 एम्बेडेड छवियों / सीएसएस / जेएस का अनुरोध करने के लिए 10 * 30 से अधिक), मेरा मानना ​​है कि उसे अस्वीकार करना स्वीकार्य है।

टाइमआउट सर्वर:

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

पढ़ें : यह सर्वर से HTTP प्रतिक्रिया हेडर प्राप्त करने के लिए अधिकतम समय है (इसे पूर्ण ग्राहक अनुरोध प्राप्त होने के बाद)। मूल रूप से, यह आपके सर्वर से प्रोसेसिंग समय है, इससे पहले कि यह प्रतिक्रिया भेजना शुरू कर दे।

यदि आपका सर्वर इतना धीमा है कि उसे जवाब देना शुरू करने के लिए 30 से अधिक की आवश्यकता है, तो मेरा मानना ​​है कि इसे मृत मान लेना स्वीकार्य है।

विशेष मामला : बहुत भारी प्रोसेसिंग करने वाली कुछ दुर्लभ सेवाएं उत्तर देने के लिए पूर्ण या अधिक समय ले सकती हैं। इस विशिष्ट उपयोग के लिए इस समय सीमा को बहुत अधिक बढ़ाने की आवश्यकता हो सकती है। (नोट: यह खराब डिज़ाइन का मामला होने की संभावना है, एक एसिंक्स शैली संचार का उपयोग करें या HTTP का उपयोग बिल्कुल न करें।)

टाइमआउट कनेक्ट:

सफल होने के लिए सर्वर से कनेक्शन के प्रयास के लिए अधिकतम समय निर्धारित करें।

पढ़ें : एक सर्वर के टीसीपी कनेक्शन को स्वीकार करने के लिए अधिकतम समय।

सर्वर HAProxy के समान LAN में हैं, इसलिए इसे तेज़ होना चाहिए। इसे कम से कम 5 सेकंड दें क्योंकि जब कुछ अनपेक्षित होता है तो कितना समय लग सकता है (रिट्रेसिट के लिए एक टीसीपी पैकेट खो जाता है, नया अनुरोध लेने के लिए एक सर्वर, ट्रैफ़िक में स्पाइक)।

विशेष मामला : जब सर्वर एक अलग लैन या एक अविश्वसनीय लिंक पर हैं। इस समयसीमा को बहुत अधिक बढ़ाने की आवश्यकता हो सकती है। (नोट: यह खराब वास्तुकला का मामला होने की संभावना है।)

समयबाह्य जांच:

अतिरिक्त चेक टाइमआउट सेट करें, लेकिन केवल एक कनेक्शन स्थापित होने के बाद ही।

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

पढ़ें : स्वास्थ्य परीक्षण करते समय, सर्वर को timeout connectकनेक्शन स्वीकार करना पड़ता है, फिर timeout checkप्रतिक्रिया देने के लिए।

सभी सर्वरों में एक HTTP (S) स्वास्थ्य जांच विन्यस्त होनी चाहिए। लोड बैलेंसर के लिए यह जानना एकमात्र तरीका है कि सर्वर उपलब्ध है या नहीं। Healthcheck /isaliveहमेशा जवाब देने वाला एक सरल पृष्ठ है OK

इस टाइमआउट को कम से कम 5 सेकंड दें क्योंकि ऐसा होने में कितना समय लग सकता है जब कुछ अनपेक्षित होता है (रिस्ट्रिक्ट करने के लिए एक खोई हुई टीसीपी पैकेट, नया अनुरोध करने के लिए एक नई प्रक्रिया के लिए एक सर्वर, ट्रैफ़िक में स्पाइक)।

युद्ध की कहानी : बहुत सारे लोग गलत तरीके से मानते हैं कि सर्वर हमेशा 3 एमएस में इस सरल पृष्ठ का जवाब दे सकता है। उन्होंने आक्रामक विफलता (2 विफल चेक = सर्वर डेड) के साथ एक आक्रामक टाइमआउट (<2000ms) सेट किया। मैंने इसकी वजह से पूरी वेबसाइटों को नीचे जाते देखा है। आमतौर पर ट्रैफ़िक में थोड़ी बहुत स्पाइक होती है, बैकएंड सर्वर धीमा हो जाता है, हेल्थचेक में देरी हो जाती है ... अचानक जब तक वे एक साथ सभी समय समाप्त हो जाते हैं, HAProxy को लगता है कि सभी सर्वर एक ही बार में मर गए और पूरी साइट डाउन हो गई।

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