आधुनिक युग में http रखना-जीवित रहना


92

तो हाइप्रोफाइल लेखक के अनुसार, जो एक या दो http के बारे में जानता है:

सीपीयू को 100 गुना धीमा होने पर सर्वर पर सीपीयू के उपयोग को कम करने के लिए जिंदा रखा गया था। लेकिन जो नहीं कहा गया है वह यह है कि लगातार कनेक्शन ग्राहक को छोड़कर किसी के द्वारा उपयोग नहीं किए जाने के दौरान बहुत अधिक मेमोरी का उपभोग करते हैं। आज 2009 में, CPU बहुत सस्ते हैं और मेमोरी अभी भी आर्किटेक्चर या कीमत के हिसाब से कुछ गीगाबाइट तक सीमित है। यदि किसी साइट को सुरक्षित रखने की आवश्यकता है, तो वास्तविक समस्या है। अत्यधिक लोड की गई साइटें एक साथ ग्राहकों की अधिकतम संख्या का समर्थन करने के लिए अक्सर रख-रखाव को अक्षम कर देती हैं। रख-रखाव न करने का वास्तविक पहलू वस्तुओं को लाने के लिए थोड़ा बढ़ा हुआ विलंब है। इसकी भरपाई करने के लिए ब्राउजर गैर-रखने योग्य साइटों पर समवर्ती कनेक्शन की संख्या को दोगुना कर देते हैं।

( http://haproxy.1wt.eu/ से )

क्या यह अन्य लोगों के अनुभव के अनुरूप है? अर्थात् बिना जिंदा रहना - क्या अब बमुश्किल ध्यान देने योग्य परिणाम है? (इसकी शायद यह ध्यान देने योग्य बात है कि वेबसोकेट्स के साथ - एक कनेक्शन को "खुला" रखा जाता है, चाहे वह किसी भी तरह की प्रतिक्रियाशील स्थिति के लिए हो - बहुत ही उत्तरदायी ऐप्स के लिए)। क्या उन लोगों के लिए प्रभाव अधिक है जो सर्वर से दूरस्थ हैं - या यदि पृष्ठ लोड करते समय एक ही मेजबान से लोड करने के लिए कई कलाकृतियां हैं? (मुझे लगता है कि CSS, images और JS जैसी चीजें कैश फ्रेंडली CDN से बढ़ रही हैं)।

विचार?

(अगर यह एक serverfault.com बात है यकीन नहीं है, लेकिन मैं पोस्ट को पार नहीं करूंगा जब तक कि कोई मुझे इसे वहां स्थानांतरित करने के लिए नहीं कहता)।


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

"एक बेहतर डिज़ाइन किया गया वेब / एप्लिकेशन-सर्वर प्राप्त करें"? :-) निरंतरता (जैसे) के साथ नए डिजाइन (जैसे जेटी) कनेक्शन अनिवार्य रूप से मेमोरी / थ्रेड मुद्दों को कम करता है। इसके अलावा, "कुछ जीबी" 2008-2009 सर्वर शब्द की तरह लगता है ;-)

3
ऐसा लगता है कि मेरे लिए दुविधा है। एक नया सॉकेट स्थापित करने में शामिल अतिरिक्त RTT एक कठिन शारीरिक सीमा है जो अक्सर एक इंसान के लिए पता लगाने योग्य है और भौतिकी के ज्ञात कानूनों के भीतर कम नहीं किया जा सकता है। इसके विपरीत, रैम सस्ती है, सस्ती हो रही है, और इसके कुछ ही kB से अधिक उपयोग करने के लिए एक बेकार सॉकेट का कोई कारण नहीं है।
विल डीन

2
लेकिन जो दिलचस्प है वह यह सिर्फ सिद्धांत नहीं है - यह हाइप्रोइक का लेखक है। बाकी सब मैं सुनता हूं कि सिद्धांत और धारणाएं हैं।
माइकल निएले

जवाबों:


141

अरे जब से मैं इस प्रशस्ति पत्र के लेखक हूँ, मैं जवाब दूँगा :-)

बड़ी साइटों पर दो बड़े मुद्दे हैं: समवर्ती कनेक्शन और विलंबता। समवर्ती कनेक्शन धीमे ग्राहकों के कारण होता है जो सामग्री डाउनलोड करने के लिए उम्र लेते हैं, और निष्क्रिय कनेक्शन राज्यों द्वारा। उन निष्क्रिय कनेक्शन राज्यों को कई वस्तुओं को लाने के लिए पुन: उपयोग के कारण होता है, जिन्हें रखने के रूप में जाना जाता है, जिसे आगे विलंबता द्वारा बढ़ाया जाता है। जब क्लाइंट सर्वर के बहुत करीब होता है, तो यह कनेक्शन का गहन उपयोग कर सकता है और यह सुनिश्चित कर सकता है कि यह लगभग कभी बेकार न हो। हालाँकि जब यह क्रम समाप्त हो जाता है, तो कोई भी जल्दी से चैनल को बंद करने की परवाह नहीं करता है और कनेक्शन लंबे समय तक खुला और अप्रयुक्त रहता है। यही कारण है कि बहुत से लोग बहुत कम रख-रखाव के समय का उपयोग करने का सुझाव देते हैं। अपाचे जैसे कुछ सर्वरों पर, आपके द्वारा सेट किया जाने वाला सबसे कम समय एक सेकंड है, और यह अक्सर उच्च भार को बनाए रखने के लिए बहुत अधिक है: यदि आपके सामने 20000 ग्राहक हैं और वे हर सेकंड औसतन एक वस्तु प्राप्त करते हैं, तो आपके पास 20000 कनेक्शन स्थायी रूप से स्थापित होंगे। अपाचे जैसे सामान्य प्रयोजन सर्वर पर 20000 समवर्ती कनेक्शन के लिए 32 और 64 जीबी रैम की आवश्यकता होती है, जो मॉड्यूल लोड किए जाने के आधार पर होता है, और आप रैम को जोड़कर भी बहुत अधिक जाने की उम्मीद नहीं कर सकते। व्यवहार में, 20000 ग्राहकों के लिए आप सर्वर पर 40000 से 60000 समवर्ती कनेक्शन भी देख सकते हैं क्योंकि ब्राउज़र 2 से 3 कनेक्शन स्थापित करने का प्रयास करेंगे यदि उनके पास कई ऑब्जेक्ट लाने हैं। और आप शायद रैम को जोड़कर बहुत अधिक जाने की उम्मीद नहीं कर सकते। व्यवहार में, 20000 ग्राहकों के लिए आप सर्वर पर 40000 से 60000 समवर्ती कनेक्शन भी देख सकते हैं क्योंकि ब्राउज़र 2 से 3 कनेक्शन स्थापित करने का प्रयास करेंगे यदि उनके पास कई ऑब्जेक्ट लाने हैं। और आप शायद रैम को जोड़कर बहुत अधिक जाने की उम्मीद नहीं कर सकते। व्यवहार में, 20000 ग्राहकों के लिए आप सर्वर पर 40000 से 60000 समवर्ती कनेक्शन भी देख सकते हैं क्योंकि ब्राउज़र 2 से 3 कनेक्शन स्थापित करने का प्रयास करेंगे यदि उनके पास कई ऑब्जेक्ट लाने हैं।

यदि आप प्रत्येक ऑब्जेक्ट के बाद कनेक्शन बंद करते हैं, तो समवर्ती कनेक्शन की संख्या नाटकीय रूप से घट जाएगी। वास्तव में, यह वस्तुओं के बीच किसी वस्तु को डाउनलोड करने के लिए औसत समय के अनुसार एक कारक द्वारा छोड़ देगा। यदि आपको एक ऑब्जेक्ट (एक लघु फोटो, एक बटन, आदि ...) डाउनलोड करने के लिए 50 एमएस की आवश्यकता है, और आप ऊपर दिए गए अनुसार प्रति सेकंड औसत 1 ऑब्जेक्ट डाउनलोड करते हैं, तो आपके पास प्रति ग्राहक केवल 0.05 कनेक्शन होंगे, जो केवल 1000 है 20000 ग्राहकों के लिए समवर्ती कनेक्शन।

अब नए कनेक्शन स्थापित करने का समय गिनने जा रहा है। सुदूरवर्ती ग्राहक एक अप्रिय विलंबता का अनुभव करेंगे। अतीत में, ब्राउजर बड़ी मात्रा में समवर्ती कनेक्शन का उपयोग करता था, जब कीप-जिंदा अक्षम था। मुझे MSIE पर 4 और नेटस्केप पर 8 के आंकड़े याद हैं। यह वास्तव में औसत प्रति-वस्तु विलंबता को उस से विभाजित करेगा। अब जब यह जीवित है, हर जगह मौजूद है, तो हम अब उस उच्च संख्या को नहीं देख रहे हैं, क्योंकि ऐसा करने से दूरस्थ सर्वर पर लोड बढ़ जाता है, और ब्राउज़र इंटरनेट के बुनियादी ढांचे की सुरक्षा का ख्याल रखते हैं।

इसका मतलब यह है कि आज के ब्राउज़रों के साथ, गैर-रखने वाली जिंदा सेवाओं को रखना उतना ही कठिन है, जितना कि जिंदा लोगों को रखना। इसके अलावा, कुछ ब्राउज़र (जैसे: ओपेरा) पाइपलाइनिंग का उपयोग करने की कोशिश करने के लिए उत्तराधिकार का उपयोग करते हैं। पिपेलिनिंग, जीवित रखने का उपयोग करने का एक कुशल तरीका है, क्योंकि यह लगभग किसी प्रतिक्रिया के लिए प्रतीक्षा किए बिना कई अनुरोध भेजकर विलंबता को समाप्त करता है। मैंने इसे 100 छोटे फ़ोटो वाले पृष्ठ पर आज़माया है, और पहली पहुंच बिना रखे-रखे ही लगभग दोगुनी है, लेकिन अगली पहुँच लगभग 8 गुना तेज़ है, क्योंकि प्रतिक्रियाएँ इतनी कम हैं कि केवल विलंबता मायने रखती है (केवल "304" प्रतिक्रियाएं)।

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

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

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

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


1
पूर्ण और व्यापक उत्तर के लिए धन्यवाद! मुझे जीवित रखने के बारे में पृष्ठ पर विभिन्न टिप्पणियों से थोड़ा उलझन में था - लेकिन यह सब समझ में आता है।
माइकल निले

दिलचस्प बात है - मैंने क्रोम को लिनक्स पर देखा है, जो कुछ सेकंड से अधिक समय तक एक जीवित कनेक्शन का उपयोग करता है - यानी समय के साथ एक और टैब खोलने के लिए - यह अन्य टैब एक अलग होस्ट नाम पर था, लेकिन DNS वाइल्डकार्ड के माध्यम से एक ही सर्वर (मास) में हल किया गया आभासी होस्टिंग) - और इस तरह एक ही कनेक्शन का पुन: उपयोग! (इससे मुझे कुछ आश्चर्य हुआ, अच्छा प्रकार नहीं - जाहिर है अगर जीवित रहना केवल ग्राहक पक्ष है तो यह ठीक है)।
माइकल निएले

मैंने सुना है कि "अपाचे के अलावा कुछ भी उपयोग करें और यह कोई बड़ी बात नहीं है"। मैंने जो एक्सट्रपलेशन किया था, वह "mod_php और पैसेंजर को डिसेबल कर दिया और फिर अपाचे में फाइटिंग का मौका भी हो सकता है"।
कूलजोरी

@ CoolAJ86: बिंदु अपाचे को कोसने के लिए बिल्कुल नहीं है, और मैं व्यक्तिगत रूप से इसका उपयोग करता हूं। मुद्दा यह है कि सर्वर जितना अधिक जेनेरिक होगा, आपको उतने ही कम विकल्प चुनने पड़ेंगे। कुछ मॉड्यूल को पूर्व-कांटा मॉडल की आवश्यकता होती है, फिर आप बड़ी संख्या में कनेक्शनों को स्केल नहीं कर सकते। लेकिन जैसा कि समझाया गया है कि यह कोई बड़ी बात नहीं है क्योंकि आप इसे एक और फ्री कंपोनेंट जैसे हैप्रोक्सी के साथ जोड़ सकते हैं। कोई भी इस मामले में सब कुछ क्यों बदल देगा? किसी अन्य सर्वर का उपयोग करके अपने एप्लिकेशन को फिर से लागू करने की परेशानी से गुजरने की तुलना में बेहतर हाइपर प्रॉक्सी स्थापित करें!
विली तरारेउ

22

जब से यह लिखा गया था (और स्टैकओवरफ्लो पर यहां पोस्ट किया गया था) में अब हमारे पास नंगेक्स जैसे सर्वर हैं जो लोकप्रियता में बढ़ रहे हैं।

उदाहरण के लिए नगीनेक्स केवल 2.5 एमबी (मेगाबाइट) रैम के साथ एक ही प्रक्रिया में 10,000 रख-रखाव के कनेक्शन खोल सकता है। वास्तव में बहुत कम रैम के साथ कई हजारों कनेक्शन खोलना आसान होता है, और आपके द्वारा हिट की जाने वाली एकमात्र सीमा अन्य सीमाएं होंगी जैसे कि ओपन फाइल हैंडल या टीसीपी कनेक्शन की संख्या।

खुद को जीवित रखना एक समस्या थी क्योंकि किसी भी समस्या के कारण जीवित-कल्पना नहीं की जाती थी, लेकिन अपाचे की प्रक्रिया-आधारित स्केलिंग मॉडल और सर्वर को रखने के कारण सर्वर में हैक किया गया था, जिसकी वास्तुकला को इसे समायोजित करने के लिए डिज़ाइन नहीं किया गया था।

विशेष रूप से समस्याग्रस्त है Apache Prefork + mod_php + Keep-alives। यह एक ऐसा मॉडल है जहां हर एक कनेक्शन सभी RAM पर कब्जा करना जारी रखेगा जो कि एक PHP प्रक्रिया होती है, भले ही यह पूरी तरह से निष्क्रिय हो और केवल एक जीवित के रूप में खुला रहता है। यह स्केलेबल नहीं है। लेकिन सर्वर को इस तरह से डिज़ाइन करने की आवश्यकता नहीं है - कोई विशेष कारण नहीं है कि एक सर्वर को हर अलग-अलग कनेक्शन में एक अलग प्रक्रिया में रखने की आवश्यकता होती है (विशेषकर तब जब हर ऐसी प्रक्रिया में एक पूर्ण PHP दुभाषिया हो)। PHP-FPM और एक इवेंट-आधारित सर्वर प्रोसेसिंग मॉडल जैसे कि nginx में समस्या को सुरुचिपूर्ण ढंग से हल करना।

अद्यतन २०१५:

SPDY और HTTP / 2, HTTP की जीवंत-जीवित कार्यक्षमता को कुछ बेहतर तरीके से प्रतिस्थापित करते हैं: न केवल जीवित रखने के लिए एक कनेक्शन और उस पर कई अनुरोध और प्रतिक्रियाएं करने की क्षमता, बल्कि उनके लिए बहुसंकेतन किया जा सकता है, इसलिए किसी भी क्रम में प्रतिक्रियाएं भेजी जा सकती हैं , और समानांतर में, केवल उस क्रम में जो वे अनुरोध किए गए थे। यह धीमी प्रतिक्रियाओं को तेजी से अवरुद्ध करने से रोकता है और ब्राउज़रों के लिए एक एकल सर्वर पर कई समानांतर कनेक्शन रखने के प्रलोभन को हटाता है। ये प्रौद्योगिकियां mod_php दृष्टिकोण की अपर्याप्तता और घटना-आधारित (या बहुत कम से कम, बहु-थ्रेडेड) वेब सर्वर जैसे PHP-FPM जैसी किसी चीज़ से अलग होने के लाभों को उजागर करती हैं।


2

मेरी समझ यह थी कि इसका सीपीयू के साथ बहुत कम लेना-देना था, लेकिन दुनिया के दूसरे हिस्से में बार-बार सॉकेट खोलने में विलंबता थी। यहां तक ​​कि अगर आपके पास अनंत बैंडविड्थ है, तो कनेक्ट करें विलंबता पूरी प्रक्रिया को धीमा कर देगी। यदि आपके पृष्ठ में दर्जनों ऑब्जेक्ट हैं, तो प्रवर्धित। यहां तक ​​कि एक निरंतर कनेक्शन में एक अनुरोध / प्रतिक्रिया विलंबता है लेकिन इसकी कमी तब होती है जब आपके पास औसतन 2 सॉकेट होते हैं, एक को डेटा स्ट्रीमिंग करना चाहिए जबकि दूसरा अवरुद्ध हो सकता है। इसके अलावा, एक राउटर कभी ऐसा नहीं मानने वाला कि आप इसे लिखने से पहले एक सॉकेट कनेक्ट करते हैं। इसे फुल राउंड ट्रिप हैंडशेक की जरूरत है। फिर, मैं एक विशेषज्ञ होने का दावा नहीं करता, लेकिन यह है कि मैंने हमेशा इसे कैसे देखा। क्या वास्तव में अच्छा होगा एक पूरी तरह से ASYNC प्रोटोकॉल (नहीं, पूरी तरह से बीमार प्रोटोकॉल नहीं है)।


हाँ - यह मेरी धारणा होगी। शायद यह एक ट्रेडऑफ़ है - एक बिंदु है जहां विलंबता (दूरी के कारण) का मतलब है कि यह एक वास्तविक समस्या है
माइकल नेले

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

@ मिचेल नीली, टीसीपी धीमी-शुरुआत जैसी चीजों के कारण भी, वास्तविक विलंबता जुर्माना आप की अपेक्षा बहुत खराब है।
मार्टिनोडएफ

हो सकता है कि व्यापार बंद होने की अवधि बहुत कम हो। यदि आपके पास अनुरोध हैं, तो सॉकेट बंद क्यों करें और फिर से शुरू करें? यहां तक ​​कि 1 सेकंड के लिए एक पृष्ठ को पूरी दृढ़ता के साथ लोड करने की अनुमति होगी और उसके तुरंत बाद सॉकेट बंद कर देंगे।
पकड़

2

यदि आप किसी "ओरिजिनल पुल" CDN जैसे CloudFront या CloudFlare का उपयोग कर रहे हैं तो बहुत लंबे समय तक कीप-अलाइव उपयोगी हो सकते हैं। वास्तव में, यह बिना CDN की तुलना में तेजी से काम कर सकता है, भले ही आप पूरी तरह से गतिशील सामग्री परोस रहे हों।

यदि आपके पास लंबे समय से अलाइव हैं जैसे कि प्रत्येक PoP का मूल रूप से आपके सर्वर से एक स्थायी संबंध है, तो पहली बार जब उपयोगकर्ता आपकी साइट पर आते हैं, तो वे आपके साथ धीमे हैंडशेक के बजाय अपने स्थानीय PoP के साथ एक तेज़ TCP हैंडशेक कर सकते हैं। (प्रकाश फाइबर के माध्यम से दुनिया भर में आधे रास्ते जाने के लिए खुद को लगभग 100ms लेता है, और टीसीपी कनेक्शन स्थापित करने के लिए तीन पैकेटों को आगे और पीछे पारित करने की आवश्यकता होती हैएसएसएल को तीन राउंड-ट्रिप की आवश्यकता होती है ।)


1
मुझे +1 के लिए लुभाया गया था, लेकिन तब आपके दूसरे पैराग्राफ में प्रकाश की यह गलत टिप्पणी थी कि दुनिया भर में आधे रास्ते की यात्रा करने के लिए केवल 10 एमएस ले रहा है। वैक्यूम में 10 एमएस लाइटस्पेड 3000 किमी और फाइबर में 10 एमबी लाइटस्पीड 2000 किमी से अधिक नहीं है; दुनिया भर में आधी सतह (सतह के साथ) 20,000 किमी। तो यह 100 एमएस होगा --- यदि केवल आपका फाइबर समुद्र के द्वारा अफ्रीका से सिडनी तक सीधे जाने की बजाय हवाई मार्ग से अफ्रीका का चक्कर लगा रहा हो या हवाई मार्ग से लंबा रास्ता तय कर रहा हो ...
पिरामिड

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