2010-04-06 16 views
22

Tornadoweb और Nginx इस पल के लिए लोकप्रिय वेब सर्वर हैं और कई बेंचमार्किंग से पता चलता है कि कुछ परिस्थितियों में अपाचे से बेहतर प्रदर्शन होता है। तो मेरा सवाल है:क्या 'एपोल' आवश्यक कारण है कि टोरनोडोब (या निगेंक्स) इतनी तेज़ है?

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

उत्तर

64

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

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

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

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

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

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

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

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

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

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

इस के

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

+0

यह वही है जो मुझे चाहिए, बहुत बहुत धन्यवाद! –

+0

ओमग, धन्यवाद आदमी! – Caio

5

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

चेक बाहर libevent (gevent द्वारा इस्तेमाल किया, आम तौर पर तेजी & बवंडर से अधिक स्थिर) कार्यान्वयन के लिए या libev

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

मैं भी नेटवर्क प्रोग्रामिंग करने के लिए बीज की गाइड पाया सुंदर होने के लिए:

+0

और क्या आप कृपया अधिक विशेष रूप से हो सकते हैं, मुझे इन सभी चीजों के बारे में अधिक जानकारी कहां मिल सकती है, libevent पर्याप्त है? –

+0

यहां रखरखावकर्ताओं में से एक द्वारा libevent पर एक अच्छी किताब है: http://www.wangafu.net/~nickm/libevent-book/ –

संबंधित मुद्दे