सवाल वेब-सर्वर आईपी पते, बाधा या मतदान के लिए "सुनो" कैसे करते हैं?


मैं वेब सर्वर के निचले विवरण को समझने की कोशिश कर रहा हूं। मैं सोच रहा हूं कि एक सर्वर, अपाचे कहता है, लगातार नए अनुरोधों के लिए मतदान कर रहा है या यदि यह किसी प्रकार की इंटरप्ट सिस्टम द्वारा काम करता है। यदि यह एक बाधा है, तो बाधा डालने वाला क्या है, क्या यह नेटवर्क कार्ड ड्राइवर है?


86
2017-11-09 20:39


मूल


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


जवाब:


संक्षिप्त जवाब है: कुछ प्रकार की बाधा प्रणाली। अनिवार्य रूप से, वे ब्लॉकिंग I / O का उपयोग करते हैं, जिसका अर्थ है कि वे नए डेटा की प्रतीक्षा करते समय सोते हैं (ब्लॉक)।

  1. सर्वर एक सुनवाई सॉकेट बनाता है और फिर नए कनेक्शन की प्रतीक्षा करते समय ब्लॉक करता है। इस समय के दौरान, कर्नेल प्रक्रिया को एक में डाल देता है interruptible नींद राज्य और अन्य प्रक्रियाओं को चलाता है। यह एक महत्वपूर्ण बात है: प्रक्रिया मतदान लगातार सीपीयू को बर्बाद कर देगा। कर्नेल प्रक्रिया को अवरुद्ध करके सिस्टम संसाधनों का अधिक कुशलतापूर्वक उपयोग करने में सक्षम है जब तक कि इसके लिए कोई काम न हो।

  2. जब नेटवर्क पर नया डेटा आता है, तो नेटवर्क कार्ड एक बाधा उत्पन्न करता है।

  3. यह देखते हुए कि नेटवर्क कार्ड से एक बाधा है, कर्नेल, नेटवर्क कार्ड ड्राइवर के माध्यम से, नेटवर्क कार्ड से नया डेटा पढ़ता है और इसे स्मृति में संग्रहीत करता है। (यह जल्दी से किया जाना चाहिए और आमतौर पर इंटरप्ट हैंडलर के अंदर संभाला जाता है।)

  4. कर्नेल नए आने वाले डेटा को संसाधित करता है और इसे सॉकेट से जोड़ता है। उस सॉकेट पर अवरुद्ध होने वाली एक प्रक्रिया को चलाने योग्य चिह्नित किया जाएगा, जिसका अर्थ है कि अब यह चलाने के लिए योग्य है। यह जरूरी नहीं है कि तुरंत चलें (कर्नेल अभी भी अन्य प्रक्रियाओं को चलाने का फैसला कर सकता है)।

  5. अपने अवकाश पर, कर्नेल अवरुद्ध वेबसर्वर प्रक्रिया को जगाएगा। (चूंकि यह अब चलने योग्य है।)

  6. वेबसर्वर प्रक्रिया निष्पादित जारी है जैसे कि कोई समय बीत चुका है। इसकी अवरुद्ध प्रणाली कॉल रिटर्न और यह किसी भी नए डेटा को संसाधित करता है। फिर ... चरण 1 पर जाएं।


181
2017-11-09 21:14



कर्नेल बनाम वेबसर्वर प्रक्रिया के स्पष्ट चित्रण के लिए +1। - Russell Borogove
मैं कुछ जटिल नहीं मान सकता क्योंकि इसे संक्षेप में और आसानी से सारांशित किया जा सकता है, लेकिन आपने इसे किया। +1 - Brandon
+1 महान जवाब। साथ ही, आधुनिक एनआईसी, ओएस और ड्राइवरों के साथ 2 और 3 के बीच के कदम थोड़ा अधिक जटिल हो सकते हैं। उदाहरण के लिए, के साथ NAPI लिनक्स पर, पैकेट वास्तव में इंटरप्ट संदर्भ में प्राप्त नहीं होते हैं। इसके बजाए, कर्नेल कहता है "ठीक है एनआईसी, मुझे समझ में आता है कि आपको डेटा मिल गया है। मुझे बगिंग करें (इंटरप्ट स्रोत अक्षम करें), और मैं जल्द ही इस पैकेट को पकड़ने के लिए वापस आऊंगा तथा कोई भी बाद के पैकेट जो मेरे आने से पहले पहुंच सकते हैं। " - Jonathon Reinhart
थोड़ा नाइटपिक: ब्लॉक करना वास्तव में जरूरी नहीं है। जैसे ही सर्वर प्रक्रिया ने एक सुनवाई सॉकेट बनाया है, कर्नेल उस बंदरगाह पर SYNs स्वीकार करेगा, भले ही आप अंदर अवरुद्ध न हों accept। वे हैं (सौभाग्य से, या यह पूरी तरह से चूसना होगा!) स्वतंत्र, असीमित रूप से चल रहे कार्यों। जैसे-जैसे कनेक्शन आते हैं, उन्हें कतार में रखा जाता है accept उन्हें खींचता है। केवल अगर कोई नहीं है, तो यह ब्लॉक करता है। - Damon
"नेटवर्क कार्ड से नया डेटा पढ़ता है और इसे स्मृति में संग्रहीत करता है। (यह जल्दी से किया जाना चाहिए और आमतौर पर इंटरप्ट हैंडलर के अंदर संभाला जाना चाहिए।)" क्या यह सीधे मेमोरी एक्सेस के साथ नहीं किया जाता है? - Siyuan Ren


बहुत सारे "निचले" विवरण हैं।

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

सर्वर में कहीं एक है सिस्टम कॉल जो कहता है "मुझे कुछ करने दो"। इस तरीके के दो व्यापक श्रेणियां हैं जिन्हें किया जा सकता है। अपाचे के मामले में, यह कॉल करता है accept एक सॉकेट पर अपाचे पहले खोला गया है, शायद पोर्ट 80 पर सुन रहा है। कर्नेल कनेक्शन प्रयासों की कतार बनाए रखता है, और उस कतार में हर बार जोड़ता है टीसीपी एसवाईएन मिला है। कैसे कर्नेल एक टीसीपी एसईएन प्राप्त किया जानता है डिवाइस चालक पर निर्भर करता है; कई एनआईसी के लिए नेटवर्क डेटा प्राप्त होने पर शायद हार्डवेयर में बाधा आती है।

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

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

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

यह पहली व्यापक श्रेणी है कि इसे कैसे करें, और इसे कहा जाता है आईओ अवरुद्ध क्योंकि सिस्टम की तरह कहते हैं accept तथा read तथा write जो सॉकेट पर काम करते हैं, प्रक्रिया को तब तक निलंबित कर देंगे जब तक कि उनके पास वापस आने के लिए कुछ न हो।

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

इस मॉडल के साथ, आप कर्नेल को बता सकते हैं (के साथ epoll), "मुझे बताएं कि पोर्ट 80 पर नया कनेक्शन है या इनमें से किसी भी 9471 अन्य कनेक्शन पर पढ़ने के लिए नया डेटा है"। epoll ब्लॉक जब तक कि उनमें से एक चीज तैयार नहीं है, तो आप इसे करते हैं। फिर आप दोहराना। सिस्टम कॉल की तरह accept तथा read तथा write कभी भी ब्लॉक न करें, क्योंकि जब भी आप उन्हें बुलाते हैं, epoll सिर्फ आपको बताया कि वे तैयार हैं इसलिए ब्लॉक करने का कोई कारण नहीं होगा, और क्योंकि जब आप सॉकेट या फ़ाइल खोलते हैं तो आप निर्दिष्ट करते हैं कि आप उन्हें गैर-अवरुद्ध मोड में चाहते हैं, इसलिए वे कॉल विफल हो जाएंगे EWOULDBLOCK अवरुद्ध करने के बजाय।

इस मॉडल का लाभ यह है कि आपको केवल एक प्रक्रिया की आवश्यकता है। इसका मतलब है कि आपको प्रत्येक अनुरोध के लिए एक स्टैक और कर्नेल संरचनाओं को आवंटित करने की आवश्यकता नहीं है। nginx तथा HAProxy इस मॉडल का उपयोग करें, और यह एक बड़ा कारण है कि वे समान हार्डवेयर पर अपाचे की तुलना में इतने सारे कनेक्शन से निपट सकते हैं।


7
2017-11-12 19:38