Nginx कार्यकर्ता_कनेक्ट के लिए इष्टतम मान


25

Nginx worker_connections"एक साथ काम करने वाले कनेक्शन की अधिकतम संख्या निर्धारित करता है, जिसे एक कार्यकर्ता प्रक्रिया द्वारा खोला जा सकता है। इस संख्या में सभी कनेक्शन शामिल हैं (उदाहरण के लिए प्रॉक्सी सर्वर के साथ अन्य कनेक्शन), न केवल ग्राहकों के साथ कनेक्शन। एक और विचार यह है कि एक साथ कनेक्शन की वास्तविक संख्या। अधिकतम खुली फ़ाइलों की वर्तमान सीमा को पार नहीं कर सकता है ”। इसके आसपास मेरे कुछ प्रश्न हैं:

  1. इसके लिए इष्टतम या अनुशंसित मूल्य क्या होना चाहिए?
  2. कार्यकर्ता कनेक्शन की एक उच्च संख्या का उपयोग करने की डाउनसाइड क्या हैं?

+1, अच्छा सवाल!
cnst

जवाबों:


31

चलो व्यावहारिक दृष्टिकोण लेते हैं।

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

डिफ़ॉल्ट सेटिंग्स वास्तव में खतरनाक हैं। एक वेबसाइट पर सैकड़ों उपयोगकर्ता होना प्रभावशाली नहीं है।

worker_process

संबंधित सेटिंग, जब हम विषय पर हों, तो इसे समझाएं।

nginx लोड बैलेंसर के रूप में:

  • HTTP लोड संतुलन के लिए 1 कार्यकर्ता।
  • HTTPS लोड संतुलन के लिए प्रति कोर 1 कार्यकर्ता।

webservers के रूप में nginx:

यह एक मुश्किल है।

कुछ एप्लिकेशन / चौखटे / मिडलवेयर (जैसे php-fpm) नगनेक्स के बाहर चलाए जाते हैं। उस स्थिति में, 1 नगनेक्स कार्यकर्ता पर्याप्त है क्योंकि यह आमतौर पर बाहरी अनुप्रयोग है जो भारी प्रसंस्करण और संसाधनों को खा रहा है।

इसके अलावा, कुछ एप्लिकेशन / फ्रेमवर्क / मिडलवेयर केवल एक समय में एक अनुरोध को संसाधित कर सकते हैं और उन्हें अधिभार देना बैकफायरिंग है।

आम तौर पर, 1 कार्यकर्ता हमेशा एक सुरक्षित दांव होता है।

अन्यथा, यदि आप जानते हैं कि आप क्या कर रहे हैं, तो आप प्रति कोर एक कार्यकर्ता रख सकते हैं। मैं उस मार्ग को एक अनुकूलन मानूंगा और उचित बेंचमार्किंग और परीक्षण की सलाह दूंगा।

worker_connections

कनेक्शन की कुल राशि है worker_process * worker_connections। आधा लोड बैलेंसर मोड में।

अब हम टोस्टर वाले हिस्से में पहुँच रहे हैं। कई गंभीर रूप से कम प्रणाली की सीमाएँ हैं:

  • ulimits लिनक्स पर प्रक्रिया के अनुसार 1k अधिकतम खुली हुई फाइलें हैं (कुछ डिस्ट्रो पर 1k सॉफ्ट, 4k हार्ड)
  • systemd की सीमाएँ ulimits के समान है।
  • nginx डिफ़ॉल्ट प्रति कार्यकर्ता 512 कनेक्शन है।
  • अधिक हो सकता है: SELinux, sysctl, पर्यवेक्षक (प्रत्येक डिस्ट्रो + संस्करण थोड़ा अलग है)

1k कार्यकर्ता_संपर्क

सुरक्षित डिफ़ॉल्ट हर जगह 1k है।

यह सबसे आंतरिक और अज्ञात साइटों से कहीं अधिक होने के लिए पर्याप्त उच्च है जो कभी भी मुठभेड़ करेगा। यह किसी भी अन्य सिस्टम सीमाओं को हिट नहीं करने के लिए पर्याप्त है।

10k कार्यकर्ता_संपर्क

हजारों क्लाइंट्स होना बहुत आम बात है, खासकर पब्लिक वेबसाइट के लिए। मैंने उन वेबसाइटों की मात्रा गिनना बंद कर दिया है जिन्हें मैंने देखा है क्योंकि कम चूक के कारण मैं नीचे चला गया हूं।

उत्पादन के लिए न्यूनतम स्वीकार्य 10k है। इसे अनुमति देने के लिए संबंधित सिस्टम सीमा बढ़ाई जानी चाहिए।

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

10k से अधिक

10k अच्छा और आसान है।

हम एक मनमाने 1000kk सीमाएँ निर्धारित कर सकते हैं (यह सब के बाद केवल एक सीमा है) लेकिन यह बहुत व्यावहारिक अर्थ नहीं रखता है, हम कभी भी उस यातायात को प्राप्त नहीं कर सकते हैं और इसे वैसे भी नहीं ले सकते हैं।

चलो एक उचित सेटिंग के रूप में 10k से चिपके रहते हैं। जो सेवाएं (और वास्तव में कर सकते हैं) के लिए विशेष ट्यूनिंग और बेंचमार्किंग की आवश्यकता होगी।

विशेष परिदृश्य: उन्नत उपयोग

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

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


मुझे उत्तर पसंद है लेकिन वास्तव में शिक्षित करने के लिए कि कोई व्यक्ति कितना उच्च सेट कर सकता है, ऐसा प्रतीत होता है कि हमें मोटे तौर पर पता होना चाहिए कि कितना रैम एक कनेक्शन लेता है (उदाहरण के लिए एक सामान्य स्थिर फ़ाइल को बचाने के लिए sendfile) ताकि हम गुणा कर सकें गणना करें कि दी गई संख्या को बनाए रखने के लिए कितनी रैम की आवश्यकता होगी worker_connections
nh2

1
आप बहुत अधिक ट्यूनिंग के बिना 10k तक कर सकते हैं। कनेक्शन बफ़र sysctlसेटिंग में सेट किए गए हैं।
user5994461

10

ulimit -a आपको बताएगा कि आपका सिस्टम कितनी खुली फाइलों को प्रोसेस करने की अनुमति देता है।

साथ ही, net.ipv4.ip_local_port_rangeप्रति IP सक्षम करने के लिए सॉकेट्स की कुल श्रेणी सेट करता है।

तो, आपका worker_connectionsकोई भी उन लोगों से अधिक नहीं हो सकता है, या आपके ग्राहक कनेक्शन तब तक कतार में रहेंगे net.core.netdev_max_backlog- जब तक कि टीसीपी कतार का कुल आकार नहीं होगा ।

ध्यान रखें कि यदि आप nginx को रिवर्स-प्रॉक्सी के रूप में उपयोग कर रहे हैं, तो प्रति कनेक्शन दो सॉकेट का उपयोग करता है। आप net.ipv4.tcp_fin_timeoutजल्दी से सॉकेट की स्थिति को स्विच करने का प्रयास करने के लिए थोड़ा और अन्य कर्नेल tcp से संबंधित टाइमआउट के साथ खेलना चाह सकते हैं । ध्यान देने वाली एक और बात यह है कि प्रत्येक सॉकेट टीसीपी मेमोरी स्टैक की मेमोरी आवंटित करता है, आप टीसीपी मेमोरी स्टैक का उपयोग करके कुछ सीमाएं भी सेट कर सकते हैं sysctl, आप रैम में अधिक दबाव डाल सकते हैं जब तक आपके पास सीपीयू और पर्याप्त फ़ाइल हैंडलर हैं।

FYI करना संभव है कि पर्याप्त कंप्यूटिंग संसाधन दिए गए हों, जिसमें एक सर्वर के पास लगभग 32GB RAM और कुछ वर्चुअल नेटवर्क इंटरफेस के साथ 1MM को एक साथ जोड़ने के लिए कुछ कर्नेल ट्यूनिंग के साथ sysctl का उपयोग किया जाए। मेरे परीक्षणों के दौरान जब 1MM से अधिक के साथ काम कर रहा था और लगभग 700Bytes का पेलोड भेज रहा था, तो सर्वर को लगभग 1.2MM एक साथ ग्राहकों को अपडेट करने में लगभग 10 सेकंड का समय लग रहा था। इसके बाद कुछ अतिरिक्त NIC को जोड़कर और वर्चुअल nics को डायन करके नेटवर्क बैंडविड्थ को बढ़ाना था। अपने ग्राहकों को अपडेट करने के लिए पेलोड, बैंडविड्थ और उचित समय को देखते हुए 1.2MM से अधिक ग्राहकों के साथ वास्तविक समय के संचार के पास छद्म हासिल करना संभव है।

हैप्पी ट्यूनिंग!


कृपया फोर्म न करने के लिए कमांड को ठीक करें
अलीम डी। डी।

नोट net.ipv4.ip_local_port_rangeकेवल आउटगोइंग कनेक्शन के लिए प्रासंगिक है , आने वाले कनेक्शन के लिए नहीं (जैसा कि nginx के साथ विशिष्ट है जैसे कि पोर्ट 80 और 443); यहाँ देखें ।
nh2

@ nh2 लेकिन अगर कोई nginx को रिवर्स प्रॉक्सी के रूप में उपयोग कर रहा है, तो क्लाइंट कनेक्शन के अनुसार कम से कम 2 सॉकेट खुले हैं, और फिर यह मायने रखता है कि कर्नेल कितने स्थानीय पोर्ट को बाइंड करने की अनुमति दे सकता है।
मार्सेल

हाँ, यह सही है।
nh2

0

परीक्षण के माध्यम से उपयुक्त आकार की खोज की जा सकती है, क्योंकि यह चर है जिस प्रकार के यातायात के आधार पर Nginx संभाल रहा है।

सैद्धांतिक रूप से, nginx को संभाल सकता है: अधिकतम ग्राहक = कार्यकर्ता_प्रोसेस * कार्यकर्ता_कनेक्ट (* = गुणा) और कार्यकर्ता_प्रोसेस = प्रोसेसर की संख्या

प्रोसेसर का पता लगाने के लिए, उपयोग करें: grep processor / proc / cpuinfo | wc -l


वास्तव में रिवर्स प्रॉक्सी के साथ: max_clients = (कार्यकर्ता_प्रोसेस * कार्यकर्ता_कनेक्ट) / (एक्स * 2) जहां एक्स हालांकि कई समवर्ती कनेक्शन हैं जो ये ग्राहक आपके लिए बनाते हैं। इसके अलावा, कनेक्शन संरचनाओं का उपयोग सुनने की सॉकेट्स, आंतरिक नियंत्रण सॉकेट्स के बीच नगणक्स प्रक्रियाओं और अपस्ट्रीम कनेक्शनों के लिए किया जाता है। इसलिए यह अधिकतम क्लाइंट = कार्यकर्ता_प्रोसेस * कार्यकर्ता_कनेक्ट काम नहीं करेंगे क्योंकि हमें पता नहीं है कि कई कनेक्शन आंतरिक नियंत्रण सॉकेट में उपयोग किए जा रहे हैं।
आरती

0

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

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

अनुशंसित मूल्य क्या है? यह डिफ़ॉल्ट है।

चूक दस्तावेज के भीतर सभी प्रलेखित हैं:

डिफ़ॉल्ट: worker_connections 512;

और स्रोत-कोड स्तर परevent/ngx_event.c भी पुष्टि की जा सकती है

13 # परिभाषित DEFAULT_CONNECTIONS 512


0

मार्सेल के जवाब को वास्तव में उभारने की जरूरत है! यदि ulimits को 1k के डिफ़ॉल्ट मान पर सेट किया जाता है, तो max_connections को उसी मान के आस-पास सेट किया जाना चाहिए अन्यथा 10k पर max_connections सेट करने का कोई लाभ नहीं है।

यदि आपके कार्यकर्ता_कनेक्शन उन में से किसी से अधिक नहीं हो सकते हैं या आपके ग्राहक कनेक्शन net.core.netdev_max_backlog- TCP प्रतिमा के कुल आकार तक कतारबद्ध हो जाएंगे, तो आपको कतारबद्ध अनुरोध और नगीनों को बंद कर दिया जाएगा।

एक एकल प्रक्रिया के रूप में कनेक्शन के रूप में ulimits अनुमति देते हैं खोल सकते हैं। num_workers * max_connections सूत्र है, लेकिन लोडबेलर / प्रॉक्सी अधिकतम कनेक्शन और ulimits के बाहर उचित मूल्यों के लिए ध्यान में रखा जाना चाहिए। Max_connection को वास्तव में उच्च मूल्य पर सेट करना बैकफ़ायर के रूप में हो सकता है क्योंकि यह एक सीमित कारक होगा।


1
यह तथ्यात्मक रूप से गलत है। डेस्कटॉप लाइनक्स पर सॉफ्ट लिमिट 1k है, लेकिन यह प्रक्रियाओं को जरूरत से ज्यादा इस्तेमाल करने से नहीं रोकता है, अगर वे हार्ड लिमिट (32k या अधिक) तक का अनुरोध करते हैं। max_connectionsडिफ़ॉल्ट सॉफ्ट लिमिट से अधिक होने पर नगनेक्स अपने आप अल्सर को बढ़ा देगा ।
user5994461 21
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.