आप कभी भी MaxKeepAliveRequests को कुछ भी लेकिन असीमित क्यों सेट करेंगे?


11

KeepAliveTimeoutयदि किसी नए अनुरोध को किसी निश्चित अवधि के भीतर जारी नहीं किया जाता है, तो अपाचे एक जीवित कनेक्शन को बंद करने के लिए मौजूद है। बशर्ते उपयोगकर्ता अपने ब्राउज़र / टैब को बंद न करे, यह टाइमआउट (आमतौर पर 5-15 सेकंड) वह होता है जो अंततः सबसे अधिक जीवित कनेक्शन को बंद कर देता है, और सर्वर संसाधनों को अनिश्चित काल तक कनेक्शन पर रोककर बर्बाद होने से बचाता है।

अब MaxKeepAliveRequestsनिर्देश HTTP अनुरोधों की संख्या पर एक सीमा रखता है जो एकल टीसीपी कनेक्शन (इसके कारण खुला छोड़ दिया गया KeepAlive) की सेवा करेगा। 0इसका मतलब यह है कि असीमित संख्या में अनुरोधों की अनुमति है।

आप इसे कभी भी "अनलिमिटेड" कुछ भी क्यों सेट करेंगे? बशर्ते एक ग्राहक अभी भी सक्रिय रूप से अनुरोध कर रहा है, उन्हें समान रखने वाले कनेक्शन पर होने में क्या नुकसान है? सीमा पूरी हो जाने के बाद, अनुरोध अभी भी आते हैं, बस एक नए कनेक्शन पर।

जिस तरह से मैं इसे देखता हूं, इसका कोई मतलब नहीं है। मैं क्या खो रहा हूँ?

जवाबों:


4

असल में, क्योंकि अपाचे इसके लिए नहीं बनाया गया था। समस्या सर्वर मेमोरी उपयोग है। कई विन्यासों में, सामग्री निर्माण सामग्री वितरण के रूप में एक ही प्रक्रिया में किया जाता है, इसलिए प्रत्येक प्रक्रिया उस सबसे बड़ी चीज़ के आकार तक बढ़ेगी जिसे वह संभालती है। एक भारी php स्क्रिप्ट की वजह से 64mb तक विस्तारित होने वाली एक प्रक्रिया के चित्र, फिर उस फूला हुआ प्रक्रिया बैठे और स्थिर फ़ाइलों की सेवा। अब इसे 100 से गुणा करें। इसके अलावा, अगर कहीं भी मेमोरी लीक हैं, तो प्रक्रिया बिना सीमा के बढ़ेगी।

आपकी सामग्री और आपके ट्रैफ़िक के प्रकार के आधार पर रखने की सेटिंग्स संतुलित होनी चाहिए। आम तौर पर, इष्टतम कॉन्फ़िगरेशन में मैक्सकिपएलाइवRestsests उच्च (100-500), और KeepAliveTimeout कम (2-5) उन्हें जल्दी से मुक्त करने के लिए होता है।


2

मुझे पता है कि यह एक पुराना सवाल है, लेकिन मैं कुछ डिबगिंग कर रहा हूं, और ऐसा लगता है (और यह अपाचे के लिए न केवल सच है) MaxKeepAliveRequestsस्वतंत्र रूप से काम करता है KeepAliveTimeout

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

यह लंबे समय से चल रहे टीसीपी कनेक्शनों को बेतरतीब ढंग से मारे जाने सहित कुछ कारणों से अच्छा नहीं हो सकता है? किसी भी मामले में, http क्लाइंट उस बेवकूफ नहीं हैं और एक "कम" MaxKeepAliveRequestsसेटिंग को बहुत अच्छी तरह से संभाल सकते हैं , उदाहरण के लिए, प्रोग्रामिंग भाषा में यह पता लगाना अपेक्षाकृत आसान है कि क्या सर्वर द्वारा tcp कनेक्शन बंद कर दिया गया है और इस तरह इसे फिर से कनेक्ट करना है। इसके अतिरिक्त, अधिकांश http-क्लाइंट अपने स्थान पर सीमाएँ रखने जा रहे हैं (उदाहरण के लिए ब्राउज़र 300 सेकंड या उसके बाद एक रखना-जीवित कनेक्शन बंद कर देगा)।


1

लोड संतुलन के लिए एक कारण होगा। एक बार जब एक जीवित या http 1.1 लगातार कनेक्शन बना दिया जाता है, तो लोड बैलेंसर इसे बंद होने तक एक नए होस्ट में नहीं ले जाएगा। यदि आपके पास अपने एक कनेक्शन पर एक बड़ी संख्या में अनुरोध करने वाले ग्राहक हैं, तो आपको सर्वर के बीच अच्छा संतुलन नहीं मिल सकता है।


लेकिन वह बात क्यों होगी? मेरे लिए, किसी भी उपयोगकर्ता के कनेक्शन को कई सर्वरों पर फैलाना अवांछनीय है। लोड संतुलन उपयोगकर्ताओं की एक उच्च संख्या को संभालने के लिए है, एक उपयोगकर्ता से कनेक्शन नहीं। वास्तव में - यदि कोई एकल उपयोगकर्ता किसी सेवा को संचालित कर रहा है, तो आप इसे केवल एक सर्वर तक सीमित रखेंगे (जहाँ वे प्रभावी रूप से दर-सीमा सीमित करेंगे)।
1930 में जोनाथन रेनहार्ट

1
अच्छे अंक। कुछ विचार: 1. उस सर्वर पर किसी और को भी अंकित किया जाएगा। 2. लोड बैलेंसरों के लिए जो HTTP स्तर से नीचे काम करते हैं: जब आप किसी सर्वर को लोड बैलेंसर पूल से बाहर निकालते हैं तो यह मौजूदा HTTP कनेक्शन को बंद नहीं करता है। यह सिर्फ लोड बैलेंसर के साथ लोगों को एक अलग सर्वर पर ले जाने के लिए थोड़ा कठिन बनाता है। कारण 2 यह है कि मुझे इस पृष्ठ पर यह देखने के लिए मिला कि लोगों को इस पैरामीटर के बारे में क्या कहना है।
22

1
एक तीसरा कारण: यदि आपका सर्वर / ऐप खराब स्थिति में है और यह पिनिंग कर रहा है तो स्थिति ठीक होने तक सभी अनुरोधों को समाप्त कर सकता है, जबकि यदि आप यह सीमित करते हैं कि उनके पास एक नए सर्वर के लिए संतुलित होने की कितनी संभावना है ।
22:39 पर डटौजेल

मैं इस तरह से काम करने वाले एक लोड बैलेंसर पर नहीं आया हूं। एक लोड बैलेंसर में आमतौर पर एक "चिपचिपाहट" पैरामीटर होता है जो परिभाषित करता है कि क्या मौजूदा सत्र के भीतर क्लाइंट के सभी अनुरोध (उदाहरण के लिए आईपी द्वारा निर्धारित किए गए हैं) को एक ही अपस्ट्रीम में रूट किया जाना चाहिए, या अपस्ट्रीम में फैला होना चाहिए। कौन सा विकल्प उपयोगी है, यह ऐप पर निर्भर करता है। ऊपर की ओर चल रहा है।
मैनुअल

1

आंशिक रूप से, सभी कनेक्शन स्लॉट को हॉगिंग करने से एकल उपयोगकर्ता रखने के लिए। एक सीमा के बिना, एक दुर्भावनापूर्ण या खराब-लिखित ग्राहक उपलब्ध हर एक कनेक्शन पर कब्जा कर सकता है और उन पर हमेशा के लिए पकड़ बना सकता है। यह उस के लिए एक महान शमन नहीं है, हालांकि, प्रति-आईपी कनेक्शन सीमा की तरह कुछ की तुलना में।

ज्यादातर संतुलन को संतुलित करते हैं, लेकिन विशेष रूप से रखरखाव के संबंध में। यदि आप किसी सर्वर को ऑफ़लाइन लेना चाहते हैं, तो आप इसे 0 कनेक्शन पर छोड़ देते हैं, लेकिन मौजूदा कनेक्शन को कुछ समय के लिए समाप्त करने की अनुमति देते हैं। रखने के अनुरोधों की संख्या पर एक सीमा लगाने का अर्थ है कि अंततः उपयोगकर्ता एक नया कनेक्शन बनाएंगे और नए बैक-एंड सर्वर में चले जाएंगे। संभवत: सर्वर को संकेत देने का कोई तरीका है कि यह नाले की प्रक्रिया के दौरान पूरी तरह से रखवाले को स्वीकार करना बंद कर दे, यह बेहतर होगा, लेकिन अभी तक मुझे पता है कि ऐसी कोई सुविधा मौजूद नहीं है।

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