2012-09-19 17 views
8

मैं Node.js में क्लस्टर मॉड्यूल के डॉक्स पढ़ रहा हूँ:
http://nodejs.org/api/cluster.htmlऑपरेटिंग सिस्टम एक ही सॉकेट को स्वीकार करने वाली एकाधिक प्रक्रियाओं के बीच संतुलन कैसे लोड करता है?

उसका दावा है निम्नलिखित:

जब कई प्रक्रियाओं सभी accept() समान ही अंतर्निहित संसाधन पर ing कर रहे हैं, ऑपरेटिंग सिस्टम लोड-बैलेंस में कुशलतापूर्वक।

यह उचित लगता है, लेकिन googling के कुछ घंटों के बाद भी, मैं सभी, जिस पर किसी भी लेख या कुछ भी नहीं मिला है यह इस बात की पुष्टि या यह बताएं कि यह कैसे लोड तर्क संतुलन ऑपरेटिंग सिस्टम में काम करता है जाएगा।

इसके अलावा, कौन से ऑपरेटिंग सिस्टम इस तरह के प्रभावी लोड संतुलन कर रहे हैं?

+0

मुझे लगता है कि आप इससे संबंधित कुछ भी नहीं ढूंढ सकते क्योंकि जेएस ओएस पर निर्भर नहीं है। मुझे नहीं पता कि वह दस्तावेज ओएस के बारे में क्यों कह रहा है, शायद यह ओएस के रूप में क्रोम पर विचार कर रहा है। – jondinham

+0

ब्याज की, https://www.citi.umich.edu/u/cel/linux-scalability/reports/accept.html –

+1

@Paul - Node.js एक सर्वर-साइड फ्रेमवर्क है, यह ब्राउज़र में नहीं चल रहा है। – Venemo

उत्तर

9

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

अब, स्वीकृति() के विशेष मामले के लिए, यह भी निर्भर करता है कि ओएस कैसे प्रक्रियाओं को जागृत करता है जो स्वीकार() पर इंतजार कर रहे हैं।

  • एक साधारण कार्यान्वयन सिर्फ स्वीकार() कॉल पर अवरुद्ध हर प्रक्रिया को जगाने के लिए है, तो अनुसूचक वे किस क्रम में चलाने के लिए मिल चुनने दें है।

  • उपर्युक्त सरल है लेकिन "थंडरिंग झुंड" समस्या का कारण बनता है, क्योंकि केवल पहली प्रक्रिया कनेक्शन स्वीकार करने में सफल होती है, अन्य लोग अवरुद्ध करने के लिए वापस जाते हैं। ओएस के लिए केवल एक प्रक्रिया जागने के लिए एक और परिष्कृत दृष्टिकोण है; यहां जागने की प्रक्रिया की पसंद शेड्यूलर पूछकर, या उदा। अवरुद्ध-ऑन-स्वीकृति() - इस-सॉकेट सूची के लिए पहली प्रक्रिया को चुनकर। बाद में लिनक्स एक दशक या उससे अधिक समय के बाद करता है, link पर आधारित है जो पहले से ही दूसरों द्वारा पोस्ट किया गया है।

  • ध्यान दें कि यह केवल स्वीकार करने के लिए काम करता है(); गैर-अवरोध स्वीकार करने के लिए() (जो मुझे यकीन है कि node.js क्या कर रहा है) यह मुद्दा चुनता है कि कौन सी प्रक्रिया चुनिंदा()/poll()/जो भी घटना को वितरित करने में अवरुद्ध हो रही है। मतदान के अर्थशास्त्र()/चयन() वास्तव में मांग करते हैं कि उनमें से सभी जाग जाएंगे, इसलिए आपके पास फिर से गर्मी का मुद्दा है। लिनक्स के लिए, और शायद इसी तरह से सिस्टम-विशिष्ट उच्च प्रदर्शन मतदान इंटरफेस के साथ अन्य प्रणालियों में, एक साझा साझा एपॉल एफडी, और किनारे ट्रिगर घटनाओं का उपयोग करके थंडरिंग झुंड से बचना संभव है। उस स्थिति में ईवेंट epoll_wait() पर अवरुद्ध प्रक्रियाओं में से केवल एक को वितरित किया जाएगा। मुझे लगता है कि, ब्लॉकिंग स्वीकार करने के समान(), घटना को वितरित करने की प्रक्रिया की पसंद, उस विशेष एपोल एफडी के लिए epoll_wait() पर अवरुद्ध प्रक्रियाओं की सूची में पहला व्यक्ति चुनना है।

तो कम से कम लिनक्स के लिए, दोनों() अवरुद्ध स्वीकार() और गैर अवरुद्ध स्वीकार बढ़त के साथ के लिए epoll शुरू हो रहा है, कोई समय-निर्धारण से प्रति जब चुनने जो प्रक्रिया को जगाने के लिए है।लेकिन ओटीओएच, वर्कलोड शायद प्रक्रियाओं के बीच काफी समान रूप से संतुलित होगा, क्योंकि अनिवार्य रूप से सिस्टम प्रक्रियाओं को राउंड-रॉबिन करेगा जिसमें वे अपना वर्तमान काम पूरा करेंगे और epoll_wait() पर अवरुद्ध करने के लिए वापस जाएं।

+0

बहुत बढ़िया, स्पष्टीकरण के लिए धन्यवाद। तो मूल रूप से, क्या इसका मतलब यह है कि किसी भी भार संतुलन को लागू करने के बजाय, वे कम से कम व्यस्त प्रक्रिया को नया कनेक्शन देकर कर्नेल पर "सही काम करने" पर भरोसा करते हैं? – Venemo

+0

@ वेनेमो: अनिवार्य रूप से, हां। – janneb

+0

धन्यवाद! मैं इसे स्वीकार किए गए उत्तर को चिह्नित कर रहा हूं! :) – Venemo