2013-07-11 4 views
26

मशहूर C10k article पढ़ने के बाद और वेब पर खोज करने के बाद यह कैसे लिखा गया है कि यह कैसे विकसित हुआ है, मैं जानना चाहता हूं कि आज के मानक के लिए यह संभव होगा या नहीं > 10000 समवर्ती कनेक्शन कनेक्शन प्रति थ्रेड (संभावित रूप से निर्माण/हत्या प्रक्रिया से बचने के लिए धागे के पूल की सहायता से) का उपयोग करने के लिए सर्वर।टीसीपी/आईपी - प्रति ग्राहक दृष्टिकोण के साथ सी 10 के को हल करना


कुछ जानकारी है कि समस्या के लिए दृष्टिकोण को प्रभावित कर सकता:

  1. इनपुट, मध्यवर्ती प्रसंस्करण और उत्पादन।
  2. प्रत्येक कनेक्शन की लंबाई।
  3. सर्वर तकनीकी विवरण (कोर, प्रोसेसर, रैम, आदि ...)
  4. AIO, मतदान, हरे धागे, आदि जैसे वैकल्पिक तकनीकों के साथ इस प्रणाली का मेल ...

जाहिर है, मैं इस मामले में एक विशेषज्ञ नहीं हूं, इसलिए किसी भी टिप्पणी या सलाह की अत्यधिक सराहना की जाएगी :)

उत्तर

3

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

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

+2

शायद यह है कि मैं थोड़ा उलझन में हूं, लेकिन मैंने सोचा कि 'एपोल' बिल्कुल असीमित नहीं था। कुछ शोधों के बाद मुझे कई ग्रंथों का कहना है कि 'एआईओ' थ्रेड पूल के साथ संयोजन में बेहतर काम करेगा, और एक सिंगल थ्रेड के साथ 'एपोल': [एओओ और एपोल की तुलना] (http://lkml.indiana.edu/hypermail /linux/kernel/0305.2/0697.html)। – Str1101

+1

... मैंने यह भी पढ़ा है कि 'एआईओ' के कार्यान्वयन के संबंध में कुछ कठिनाइयां हैं, इसलिए शायद यह 'एपोल' + थ्रेड पूल दृष्टिकोण का उपयोग करने के लिए अभी भी अधिक लाभदायक है। [क्या-अंतर-बीच ...] (http://stackoverflow.com/questions/5844955/whats-the-difference-between-event-driven-and-asynchronous-between-epoll-and-a)। इसके बारे में मेरा स्वयं का विचार यह है कि प्रत्येक कनेक्शन को बंद करने के लिए पूल के सीधे एक थ्रेड का उपयोग करना संभव होगा जब तक कि एक साथ कनेक्शन की संख्या अधिकतम संख्या में थ्रेड के करीब न हो, जो सिस्टम बनाए रख सकें, और फिर हम इसका उपयोग कर सकते हैं ... – Str1101

+1

एपोल/क्यूक्यू/एआईओ सिस्टम नए आने वाले कनेक्शन को संभालने के लिए, जबकि सभी धागे व्यस्त हैं। (पीएस .: मैं वास्तव में जल्द ही आपके सर्वर को देखना पसंद करूंगा, खासकर अगर यह सी ++ में लिखा गया है :) – Str1101

19

आपको इस विषय पर हाल ही में अनुवर्ती पसंद हो सकता है: The Secret To 10 Million Concurrent Connections -The Kernel Is The Problem, Not The Solution

+2

क्या एक अद्भुत लेख आदमी !! मुझे लगता है कि मैं इससे बहुत कुछ सीख सकता हूं, धन्यवाद :) – Str1101

+0

@ Str1101 मैंने इसे काफी निर्देशक भी पाया। –

+0

कमाल का लेख! – Dinesh

51

बिल्कुल। एक मानक सर्वर 10K समवर्ती कनेक्शनके साथ मॉडल का उपयोग कर एक थ्रेड प्रति कनेक्शन से अधिक संभाल सकता है। मैंने इस तरह का एक एप्लीकेशन बनाया है, और पांच साल पहले, यह एक मानक लिनक्स सर्वर पर प्रति प्रक्रिया 50K से अधिक समवर्ती कनेक्शन के साथ चल रहा था। आजकल, मौजूदा हार्डवेयर पर 250K से अधिक समवर्ती कनेक्शन के साथ एक ही एप्लिकेशन को चलाने के लिए संभव होना चाहिए। एक थ्रेड पूल का उपयोग करके

  • पुन: उपयोग धागे:

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

  • ढेर का आकार: डिफ़ॉल्ट रूप से प्रत्येक लिनक्स थ्रेड अपने ढेर के लिए 8 एमबी आरक्षित करता है। यह 10 के धागे के लिए 80 जीबी तक है। आपको डिफ़ॉल्ट स्टैक आकार को 64k और 512k के बीच कुछ मान पर सेट करना चाहिए, जो कोई समस्या नहीं है, क्योंकि अधिकांश अनुप्रयोगों को गहरे कॉल स्टैक की आवश्यकता नहीं होती है।
  • यदि कनेक्शन अल्पकालिक हैं, तो SO_REUSEPORT विकल्प के साथ एक ही एंडपॉइंट पर कई सॉकेट बनाकर नए कनेक्शन के लिए अनुकूलित करें।
  • उपयोगकर्ता सीमाएं बढ़ाएं: open files (डिफ़ॉल्ट 1.024), max user processes
  • सिस्टम सीमाएं बढ़ाएं, उदा। /proc/sys/kernel/pid_max (डिफ़ॉल्ट 32 के), /proc/sys/kernel/threads-max, और /proc/sys/vm/max_map_count (डिफ़ॉल्ट 65 के)।

ऊपर उल्लिखित आवेदन प्रारंभ में केवल 2 के समवर्ती कनेक्शन को संभालने के लिए डिज़ाइन किया गया था। हालांकि, उपयोग में वृद्धि के साथ, 50K कनेक्शन तक पहुंचने के लिए हमें कोड में महत्वपूर्ण बदलाव नहीं करना पड़ा।

+2

यह आसान भी हो सकता है: https://gcc.gnu.org/wiki/SplitStacks – chbaker0

+0

यह अनिवार्य रूप से थ्रेड शेड्यूलिंग सिस्टम का उपयोग पैकेट शेड्यूलिंग सिस्टम के रूप में कर रहा है: थ्रेड शेड्यूलर निर्धारित करता है कि किस पर 'पढ़ने() 'कॉल करने के लिए अगला डेटा आता है। यह स्पष्ट रूप से काम करता है, लेकिन अधिक स्केलेबल डिज़ाइन हैं। –

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