विली ने मुझे ईमेल से जवाब दिया। मुझे लगा कि मैं इसे साझा करूंगा। उनके जवाब बोल्ड हैं।
मेरे पास अपने हाइपोक्सी कॉन्फिग के बारे में एक प्रश्न है:
#---------------------------------------------------------------------
# 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 पर देख सकते हैं यदि आप चाहें, तो यह बताता है कि निर्णय कैसे / कहाँ लिया जाता है।
तो प्रश्न हैं:
यदि वैश्विक कनेक्शन 4000 से ऊपर मिलता है तो क्या होगा? क्या वे मर जाते हैं? या लिनक्स में किसी तरह पूल?
वे linux में कतारबद्ध हैं। एक बार जब आप कर्नेल की कतार को अभिभूत कर देते हैं, तो वे कर्नेल में गिर जाते हैं।
क्या वैश्विक कनेक्शन सर्वर से जुड़े हैं, इस तथ्य के अलावा कि आपके पास वैश्विक की तुलना में सर्वर कनेक्शन की कुल संख्या नहीं हो सकती है?
नहीं, वैश्विक और सर्वर कनेक्शन सेटिंग्स स्वतंत्र हैं।
जब वैश्विक कनेक्शन का पता लगा रहे हैं, तो क्या यह सर्वर सेक्शन में जोड़े गए कनेक्शन की मात्रा नहीं होना चाहिए, साथ ही पूलिंग के लिए एक निश्चित प्रतिशत? और स्पष्ट रूप से आपके पास कनेक्शन पर अन्य संयम हैं, लेकिन वास्तव में यह है कि आप कितने को समीप भेजना चाहते हैं?
तुमने सही समझा। यदि आपके सर्वर का रिस्पांस टाइम कम है, तो एक समय में केवल कुछ ही सेवा करने के लिए हजारों कनेक्शनों की कतार लगाने में कुछ भी गलत नहीं है, क्योंकि यह अनुरोध प्रसंस्करण समय को काफी कम कर देता है। व्यावहारिक रूप से, आजकल एक कनेक्शन स्थापित करने में एक गीगाबिट लैन पर लगभग 5 माइक्रोसेकंड लगते हैं। तो यह बहुत समझ में आता है कि हाईप्रोक्स को कनेक्शन को अपनी कतार से जितनी जल्दी हो सके सर्वर पर वितरित करने के लिए एक बहुत ही कम अधिकतम के साथ सर्वर को वितरित करना चाहिए। मुझे याद है कि एक गेमिंग साइट 30000 से अधिक समवर्ती कनेक्शनों की कतार लगा रही है और प्रति सर्वर 30 की कतार के साथ चल रही है! यह एक अपाचे सर्वर था, और अपाचे बड़ी संख्या के साथ कनेक्शन की छोटी संख्या के साथ बहुत तेज है। लेकिन इसके लिए आपको वास्तव में एक तेज सर्वर की जरूरत है, क्योंकि आप डॉन ' टी अपने सभी ग्राहकों को एक कनेक्शन स्लॉट की प्रतीक्षा में कतारबद्ध करना चाहता है क्योंकि सर्वर उदाहरण के लिए डेटाबेस की प्रतीक्षा कर रहा है। यह भी कुछ है जो बहुत अच्छी तरह से काम करता है सर्वरों को समर्पित करने के लिए है। यदि आपकी साइट में कई स्टैटिक्स हैं, तो आप स्थिर अनुरोधों को सर्वर (या कैश) के एक पूल में निर्देशित कर सकते हैं ताकि आप उन पर स्थिर अनुरोधों को कतारबद्ध न करें और स्थिर अनुरोध महंगे कनेक्शन स्लॉट न खाएं। इस उम्मीद में, विली मदद करता है