apache क्या 'एपोल' आवश्यक कारण है कि टोरनोडोब(या निगेंक्स) इतनी तेज़ है?




nginx tornado (2)

टॉरनेडोब और निजिनक्स इस पल के लिए लोकप्रिय वेब सर्वर हैं और कई बेंचमार्किंग से पता चलता है कि कुछ परिस्थितियों में अपाचे की तुलना में उनके पास बेहतर प्रदर्शन है। तो मेरा सवाल है:

क्या 'एपोल' सबसे आवश्यक कारण है जो उन्हें इतना तेज़ बनाता है? और अगर मैं एक अच्छा सॉकेट सर्वर लिखना चाहता हूं तो मैं उससे क्या सीख सकता हूं?


यदि आप सॉकेट सर्वर लिखना चाहते हैं, तो कुछ साल पहले दान केगेल का सी 10 के आलेख एक अच्छा प्रारंभिक बिंदु है:

http://www.kegel.com/c10k.html

मुझे बीज की मार्गदर्शिका नेटवर्क प्रोग्रामिंग को बहुत आसान बनाने के लिए भी मिला:

http://beej.us/guide/bgnet/

अंत में, यदि आपको एक महान संदर्भ की आवश्यकता है, तो डब्ल्यू रिचर्ड स्टीवंस एट द्वारा यूनिक्स नेटवर्क प्रोग्रामिंग है। अल .:

http://www.amazon.com/Unix-Network-Programming-Sockets-Networking/dp/0131411551/ref=dp_ob_title_bk

वैसे भी, आपके प्रश्न का उत्तर देने के लिए, अपाचे और एनजिनक्स के बीच मुख्य अंतर यह है कि अपाचे ब्लॉकिंग I / O के साथ प्रति क्लाइंट एक थ्रेड का उपयोग करता है, जबकि Nginx गैर-अवरुद्ध I / O के साथ सिंगल-थ्रेडेड होता है। अपाचे का कार्यकर्ता पूल प्रारंभिक और विनाशकारी प्रक्रियाओं के ऊपरी हिस्से को कम करता है, लेकिन यह कई क्लाइंटों की सेवा करते समय भी कई धागे के बीच सीपीयू स्विच बनाता है। दूसरी ओर, Nginx, सभी धागे एक थ्रेड में संभालती है। जब एक अनुरोध को नेटवर्क अनुरोध करने की आवश्यकता होती है (कहें, बैकएंड के लिए), Nginx बैकएंड अनुरोध पर कॉलबैक संलग्न करता है और फिर किसी अन्य सक्रिय ग्राहक अनुरोध पर काम करता है। प्रैक्टिस में, इसका मतलब है कि यह इवेंट लूप ( epoll , kqueue , या select ) पर kqueue और फाइल डिस्क्रिप्टर के लिए पूछता है जिसमें रिपोर्ट करने के लिए कुछ है। ध्यान दें कि मुख्य ईवेंट लूप में सिस्टम कॉल वास्तव में एक अवरुद्ध ऑपरेशन है, क्योंकि ऐसा करने के लिए कुछ भी नहीं है जब तक कि फ़ाइल वर्णनकर्ताओं में से कोई एक पढ़ने या लिखने के लिए तैयार न हो।

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

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

http://www.evanmiller.org/nginx-modules-guide.html

(चेतावनी: गाइड Nginx 0.5-0.6 के खिलाफ लिखा गया था और एपीआई बदल सकते हैं।) यदि आप HTTP के साथ कुछ भी कर रहे हैं, तो मैं कहूंगा कि Nginx को एक शॉट दें क्योंकि यह बेवकूफ ग्राहकों से निपटने के सभी बालों के विवरणों का काम करता है। उदाहरण के लिए, छोटे सॉकेट सर्वर जो मैंने मजे के लिए लिखा था, सभी ग्राहकों के साथ बहुत अच्छा काम किया - सफारी को छोड़कर, और मैंने कभी नहीं सोचा क्यों। अन्य प्रोटोकॉल के लिए भी, Nginx जाने का सही तरीका हो सकता है; घटनाक्रम प्रोटोकॉल से बहुत अच्छी तरह से सारणित है, यही कारण है कि यह HTTP के साथ ही IMAP प्रॉक्सी कर सकते हैं। Nginx कोड बेस बेहद सुव्यवस्थित और बहुत अच्छी तरह लिखित है, एक अपवाद के साथ जो उल्लेख करता है। जब प्रोटोकॉल पार्सर को हाथ से रोल करने की बात आती है तो मैं इसका नेतृत्व नहीं करता; इसके बजाय, एक पार्सर जनरेटर का उपयोग करें। मैंने यहां Nginx के साथ एक पार्सर जेनरेटर (रागल) का उपयोग करने के बारे में कुछ सामान लिखा है:

http://www.evanmiller.org/nginx-modules-guide-advanced.html#parsing

यह सब शायद आप चाहते थे की तुलना में अधिक जानकारी थी, लेकिन उम्मीद है कि आप इसे कुछ उपयोगी पाएंगे।


हां और ना। हालांकि वे दोनों एपोल का उपयोग करते हैं, इसकी तकनीकी रूप से वे दोनों अनुरोधों को संभालने के लिए एक ईवेंट लूप का उपयोग करते हैं। आप ईवेंट लूप क्या हैं और wikipedia पर उनका उपयोग कैसे किया जाता है, इसके बारे में अधिक जानकारी प्राप्त कर सकते हैं।

libevent ( libevent द्वारा उपयोग किया जाता है, आमतौर पर तेजी से और libev से अधिक स्थिर) या कार्यान्वयन के लिए libev





epoll