वैश्विक मैक्सकोन और सर्वर मैक्सकोन हाइप्रोक्सी के बीच अंतर


91

मेरे पास अपने हाइपोक्सी कॉन्फिग के बारे में एक प्रश्न है:

#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
    log         127.0.0.1 syslog emerg
    maxconn     4000
    quiet
    user        haproxy
    group       haproxy
    daemon
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will 
# use if not designated in their block
#---------------------------------------------------------------------
defaults
    mode        http
    log         global
    option      abortonclose
    option      dontlognull
    option      httpclose
    option      httplog
    option      forwardfor
    option      redispatch
    timeout connect 10000 # default 10 second time out if a backend is not found
    timeout client 300000 # 5 min timeout for client
    timeout server 300000 # 5 min timeout for server
    stats       enable

listen  http_proxy  localhost:81

    balance     roundrobin
    option      httpchk GET /empty.html
    server      server1 myip:80 maxconn 15 check inter 10000
    server      server2 myip:80 maxconn 15 check inter 10000

जैसा कि आप देख सकते हैं कि यह सीधे आगे है, लेकिन मैं थोड़ा उलझन में हूं कि अधिकतम गुण कैसे काम करते हैं।

सुन ब्लॉक में वैश्विक एक और सर्वर पर अधिकतम है। मेरी सोच यह है: वैश्विक एक, एक समय पर, एक सेवा के रूप में कतारबद्ध या प्रक्रिया करेगा, कुल कनेक्शनों का प्रबंधन करता है। यदि संख्या इससे ऊपर हो जाती है, तो यह या तो कनेक्शन को मार देता है, या कुछ लिनक्स सॉकेट में पूल? मुझे नहीं पता कि क्या होता है यदि संख्या 4000 से अधिक हो जाती है।

फिर आपके पास सर्वर मैक्नोन्क संपत्ति 15 पर सेट है। सबसे पहले, मैंने इसे 15 पर सेट किया क्योंकि मेरा php-fpm, यह एक अलग सर्वर पर अग्रेषित कर रहा है, केवल इतनी सारी बाल प्रक्रियाएं हैं जो इसका उपयोग कर सकती हैं, इसलिए मुझे यकीन है कि मैं हूं php-fpm के बजाय यहां अनुरोधों को पूल करना। जो मुझे लगता है कि तेज है।

लेकिन विषय पर वापस, इस संख्या के बारे में मेरा सिद्धांत इस ब्लॉक में प्रत्येक सर्वर को केवल एक बार में 15 कनेक्शन भेजे जाएंगे। और फिर कनेक्शन एक खुले सर्वर की प्रतीक्षा करेगा। यदि मेरे पास कुकीज होती हैं, तो कनेक्शन कोररैक्ट ओपन सर्वर की प्रतीक्षा करेगा। लेकिन मैं नहीं।

तो प्रश्न हैं:

  1. यदि वैश्विक कनेक्शन 4000 से ऊपर मिलता है तो क्या होगा? क्या वे मर जाते हैं? या लिनक्स में किसी तरह पूल?
  2. क्या वैश्विक कनेक्शन सर्वर से जुड़े हैं, इस तथ्य के अलावा कि आपके पास वैश्विक की तुलना में सर्वर कनेक्शन की कुल संख्या नहीं हो सकती है?
  3. जब वैश्विक कनेक्शन का पता लगा रहे हैं, तो क्या यह सर्वर सेक्शन में जोड़े गए कनेक्शन की मात्रा नहीं होना चाहिए, साथ ही पूलिंग के लिए एक निश्चित प्रतिशत? और स्पष्ट रूप से आपके पास कनेक्शन पर अन्य संयम हैं, लेकिन वास्तव में यह है कि आप कितने समीपस्थों को भेजना चाहते हैं?

पहले ही, आपका बहुत धन्यवाद।

जवाबों:


166

विली ने मुझे ईमेल से जवाब दिया। मुझे लगा कि मैं इसे साझा करूंगा। उनके जवाब बोल्ड हैं।

मेरे पास अपने हाइपोक्सी कॉन्फिग के बारे में एक प्रश्न है:

   #---------------------------------------------------------------------
   # Global settings
   #---------------------------------------------------------------------
   global
       log         127.0.0.1 syslog emerg
       maxconn     4000
       quiet
       user        haproxy
       group       haproxy
       daemon
   #---------------------------------------------------------------------
   # common defaults that all the 'listen' and 'backend' sections will 
   # use if not designated in their block
   #---------------------------------------------------------------------
   defaults
       mode        http
       log         global
       option      abortonclose
       option      dontlognull
       option      httpclose
       option      httplog
       option      forwardfor
       option      redispatch
       timeout connect 10000 # default 10 second time out if a backend is not found
       timeout client 300000 # 5 min timeout for client
       timeout server 300000 # 5 min timeout for server
       stats       enable

   listen  http_proxy  localhost:81

       balance     roundrobin
       option      httpchk GET /empty.html
       server      server1 myip:80 maxconn 15 check inter 10000
       server      server2 myip:80 maxconn 15 check inter 10000

जैसा कि आप देख सकते हैं कि यह सीधे आगे है, लेकिन मैं थोड़ा उलझन में हूं कि अधिकतम गुण कैसे काम करते हैं।

सुन ब्लॉक में वैश्विक एक और सर्वर पर अधिकतम है।

और सुनो ब्लॉक में एक और भी है जो 2000 की तरह कुछ करने के लिए चूक करता है।

मेरी सोच यह है: वैश्विक एक, एक समय में, एक सेवा के रूप में कतारबद्ध या प्रक्रिया करेगा, कुल कनेक्शनों का प्रबंधन करता है।

सही बात। यह समवर्ती कनेक्शन की प्रति-प्रक्रिया अधिकतम संख्या है।

यदि संख्या इससे ऊपर हो जाती है, तो यह या तो कनेक्शन को मार देता है, या कुछ लिनक्स सॉकेट में पूल?

बाद में, यह बस नए कनेक्शन को स्वीकार करना बंद कर देता है और वे कर्नेल में सॉकेट कतार में बने रहते हैं। यात्रा योग्य सॉकेट की संख्या (net.core.somaxconn, net.ipv4.tcp_max_syn_backlog, और सुनो ब्लॉक के मैक्सकोन) के द्वारा निर्धारित की जाती है।

मुझे नहीं पता कि क्या होता है यदि संख्या 4000 से अधिक हो जाती है।

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

फिर आपके पास सर्वर मैक्नोन्क संपत्ति 15 पर सेट है। सबसे पहले, मैंने इसे 15 पर सेट किया क्योंकि मेरा php-fpm, यह एक अलग सर्वर पर अग्रेषित कर रहा है, केवल इतनी सारी बाल प्रक्रियाएं हैं जो इसका उपयोग कर सकती हैं, इसलिए मुझे यकीन है कि मैं हूं php-fpm के बजाय यहाँ अनुरोधों को जमा करना। जो मुझे लगता है कि तेज है।

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

लेकिन विषय पर वापस, इस संख्या के बारे में मेरा सिद्धांत इस ब्लॉक में प्रत्येक सर्वर को केवल एक बार में 15 कनेक्शन भेजे जाएंगे। और फिर कनेक्शन एक खुले सर्वर की प्रतीक्षा करेगा। यदि मेरे पास कुकीज होती हैं, तो कनेक्शन कोररैक्ट ओपन सर्वर की प्रतीक्षा करेगा। लेकिन मैं नहीं।

ठीक यही सिद्धांत है। प्रति-प्रॉक्सी कतार और प्रति-सर्वर कतार है। दृढ़ता कुकी के साथ कनेक्शन सर्वर कतार में जाते हैं और अन्य कनेक्शन प्रॉक्सी कतार में जाते हैं। हालाँकि जब से आपके मामले में कोई कुकी कॉन्फ़िगर नहीं की गई है, सभी कनेक्शन प्रॉक्सी कतार में जाते हैं। आप आरेख स्रोतों में आरेख doc / queuing.fig पर देख सकते हैं यदि आप चाहें, तो यह बताता है कि निर्णय कैसे / कहाँ लिया जाता है।

तो प्रश्न हैं:

  1. यदि वैश्विक कनेक्शन 4000 से ऊपर मिलता है तो क्या होगा? क्या वे मर जाते हैं? या लिनक्स में किसी तरह पूल?

    वे linux में कतारबद्ध हैं। एक बार जब आप कर्नेल की कतार को अभिभूत कर देते हैं, तो वे कर्नेल में गिर जाते हैं।

  2. क्या वैश्विक कनेक्शन सर्वर से जुड़े हैं, इस तथ्य के अलावा कि आपके पास वैश्विक की तुलना में सर्वर कनेक्शन की कुल संख्या नहीं हो सकती है?

    नहीं, वैश्विक और सर्वर कनेक्शन सेटिंग्स स्वतंत्र हैं।

  3. जब वैश्विक कनेक्शन का पता लगा रहे हैं, तो क्या यह सर्वर सेक्शन में जोड़े गए कनेक्शन की मात्रा नहीं होना चाहिए, साथ ही पूलिंग के लिए एक निश्चित प्रतिशत? और स्पष्ट रूप से आपके पास कनेक्शन पर अन्य संयम हैं, लेकिन वास्तव में यह है कि आप कितने को समीप भेजना चाहते हैं?

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


10
इसे पोस्ट करने के लिए धन्यवाद।
तरनतुला

9
मेरे पास एक हाईप्रोफाइल है जो लगभग 200 अन्य लोगों के लिए बैकएंड करता है। एक बार एक बैकेंड डीडीओएस-एड के साथ लगभग ~ 300k कॉनएबिटंस / सेकंड था, अन्य सभी बैकएंड मर जाते हैं। बैकएंड सर्वर (ddos के तहत) पर अधिकतम 2048 मान के साथ, हमारी हैप्रोक्स ठीक चलता है। बहुत बहुत धन्यवाद, आपने मुझे एक रात बचाया :)
Hungnv
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.