2009-05-26 13 views
9

गैर-फोर्किंग (उर्फ सिंगल-थ्रेडेड या select()-आधारित) लाइटटीपीडी या एनजिनक्स जैसे वेबसर्वर लोकप्रियता में अधिक से अधिक लाभ प्राप्त कर रहे हैं।एक गैर-फोर्किंग वेब सर्वर कैसे काम करता है?

जबकि सर्वरों को फोर्किंग सर्वर ( पर विस्तार के विभिन्न स्तर) समझाते हुए दस्तावेज़ों की एक बड़ी संख्या है, गैर-फोर्किंग सर्वर के लिए दस्तावेज़ स्पैस है।

मैं एक पक्षी आँखों एक गैर forking वेब सर्वर काम करता हैकैसे के दृश्य के लिए देख रहा हूँ। (छद्म-) कोड या एक राज्य मशीन आरेख, कम से कम पर छीन लिया गया, यह बहुत अच्छा होगा।

मुझे निम्नलिखित संसाधनों से अवगत है और उन्हें उपयोगी पाया गया है।

हालांकि, मैं सिद्धांतों, नहीं कार्यान्वयन विवरण में दिलचस्पी है।

विशेष रूप से:

  • क्यों सर्वर के इस प्रकार कभी कभी कहा जाता है गैर अवरुद्ध, जब select() अनिवार्य रूप से ब्लॉक?

  • अनुरोध की प्रक्रिया में कुछ समय लग सकता है। इस समय के दौरान नए अनुरोधों के साथ क्या होता है जब कोई विशिष्ट श्रोता धागा या प्रक्रिया नहीं होती है? अनुरोध किसी भी तरह से बाधित या समय कटा हुआ प्रसंस्करण है?

संपादित करें: मैं इसे समझते हैं, जबकि एक अनुरोध संसाधित होने के रूप में (उदाहरण, फ़ाइल को पढ़ने या CGI स्क्रिप्ट रन) सर्वर नए कनेक्शन स्वीकार नहीं कर सकते। इसका मतलब यह नहीं होगा कि अगर कोई सीजीआई स्क्रिप्ट चलती है तो ऐसा सर्वर नए कनेक्शन के को याद कर सकता है, मान लें, 2 सेकंड या तो?

+1

द्वारा यूनिक्स नेटवर्क प्रोग्रामिंग मुझे लगता है कि चाहते हैं कि एक गैर forking वेब सर्वर किसी भी वेब सर्वर है कि गतिशील सामग्री की एक छोटी सी राशि से अधिक सर्वर चाहता था करने के लिए एक बुरी मैच होगा । – Eddie

+0

@Eddie कम से कम नहीं। एन प्रोसेसर के साथ, एन थ्रेड से अधिक होने से आपको और अधिक काम करने की अनुमति नहीं मिल रही है। एक उचित ढंग से डिज़ाइन किया गया एसिंक्रोनस सर्वर फोर्किंग या थ्रेडेड के रूप में उतना ही काम कर सकता है। –

+0

@ निक जॉनसन: यह निर्भर करता है। यदि आपके पास एन प्रोसेसर और एन थ्रेड हैं, तो इस सीमा तक कि कोई भी अनुरोध I/O के लिए प्रतीक्षा करने वाले ब्लॉक का अनुरोध करता है, आप वास्तव में अपने प्रोसेसर का उपयोग नहीं कर रहे हैं जब तक कि आप अधिक धागे नहीं बनाते। उदाहरण के लिए, यदि आपको गतिशील अनुरोध को पूरा करने के लिए डेटाबेस पर जाना है, तो उस थ्रेड को तब तक रोक दिया जाता है जब तक आपको कोई प्रतिक्रिया न मिल जाए। केवल एन धागे के साथ, आप अपना अधिकांश समय इंतजार कर सकते हैं और वास्तव में आपके समय की एक छोटी राशि वास्तव में प्रसंस्करण कर सकते हैं। – Eddie

उत्तर

8

बेसिक स्यूडोकोड:

setup 
while true 
    select/poll/kqueue 
    with fd needing action do 
     read/write fd 
     if fd was read and well formed request in buffer 
      service request 
     other stuff 
  • हालांकि select() & मित्र ब्लॉक, सॉकेट आई/ओ नहीं रोक रहा। आप केवल तब तक अवरुद्ध हैं जब तक कि आपके पास कुछ मज़ेदार न हो।
  • व्यक्तिगत अनुरोधों को प्रोसेस करना आम तौर पर फ़ाइल (स्थैतिक संसाधन) या प्रक्रिया (गतिशील संसाधन) से फ़ाइल डिस्क्रिप्टर पढ़ने और सॉकेट को लिखने में शामिल होता है। यह अधिक राज्य को बनाए बिना आसानी से किया जा सकता है।
  • तो service request ऊपर आमतौर पर फ़ाइल खोलने का मतलब है, इसे select के लिए सूची में जोड़कर, और वहां से पढ़ी गई सामग्री को एक निश्चित सॉकेट में जाता है। उपयुक्त होने पर फ़ाइल के लिए FastCGI को प्रतिस्थापित करें।

संपादित करें: एक गुरु और एक कार्यकर्ता:

  • दूसरों के बारे में सुनिश्चित नहीं हैं, लेकिन nginx 2 प्रक्रियाओं है। मास्टर सुनता है और फिर प्रसंस्करण के लिए कार्यकर्ता को स्वीकार किए गए कनेक्शन को खिलाता है।
4

का चयन करें() प्लस nonblocking आई/ओ अनिवार्य रूप से आपके द्वारा प्रबंधित/एकाधिक कनेक्शन का जवाब के रूप में वे एक ही धागा (बहुसंकेतन) में आते हैं, एक से अधिक थ्रेड/प्रक्रियाओं एक सॉकेट प्रत्येक संभाल होने बनाम करने के लिए अनुमति देता है। लक्ष्य सर्वर पदचिह्न के अनुपात को कनेक्शन की संख्या को कम करना है।

यह कुशल है क्योंकि यह एकल धागा संतृप्ति तक पहुंचने के लिए आवश्यक उच्च सॉकेट कनेक्शन का उच्च स्तर का लाभ लेता है (क्योंकि हम एकाधिक फ़ाइल वर्णनकर्ताओं को I/O को अनब्लॉक कर सकते हैं)।

तर्क यह है कि बाइट्स को स्वीकार करने के लिए बहुत कम समय लगता है, उन्हें समझें, फिर आउटपुट स्ट्रीम पर उचित बाइट्स पर निर्णय लें। वास्तविक I/O कार्य को इस सर्वर थ्रेड को अवरुद्ध किए बिना संभाला जाता है।

इस प्रकार का सर्वर हमेशा चयन() पर अवरुद्ध करके कनेक्शन के लिए प्रतीक्षा कर रहा है। एक बार यह एक हो जाता है, यह कनेक्शन को संभालता है, फिर एक अनंत लूप में चयन() का पुनरीक्षण करता है। सबसे सरल मामले में, यह सर्वर थ्रेड I/O सेट अप करने के अलावा किसी भी अन्य समय को अवरुद्ध नहीं करता है।

यदि कोई दूसरा कनेक्शन आता है, तो अगली बार सर्वर को चुनने के लिए इसे संभाला जाएगा()। इस बिंदु पर, पहला कनेक्शन अभी भी प्राप्त हो सकता है, और हम उसी सर्वर थ्रेड से दूसरे कनेक्शन पर भेजना शुरू कर सकते हैं। यह लक्ष्य है।

अतिरिक्त संसाधनों के लिए "multiplexing network sockets" के लिए खोजें।

या कोशिश स्टीवंस, फेनर, Rudoff

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