मैं प्रति सेकंड 10000 टीसीपी कनेक्शन को संभालने के लिए एक सिस्टम डिजाइन कर रहा हूं, मैं किन समस्याओं में चलूंगा?


18

मेरे पास अपेक्षाकृत नया 8-कोर बॉक्स है जो CentOS चल रहा है। मैं टीसीपी का उपयोग करने वाला एक आँकड़े सर्वर विकसित करना चाहूंगा। यह बहुत सरल है, यह एक टीसीपी कनेक्शन स्वीकार करता है, एक काउंटर बढ़ाता है और कनेक्शन बंद कर देता है। पकड़ यह है कि इसे कम से कम 10k अनुरोधों को एक सेकंड में करने की आवश्यकता है। मुझे शक है कि CPU / मेमोरी एक समस्या नहीं होगी, लेकिन मैं कृत्रिम सीमाओं (जैसे आधे-खुले कनेक्शन) के बारे में अधिक चिंतित हूं कि मुझे इस तरह की मात्रा के लिए अनुमति देने के लिए अपने सर्वर पर कॉन्फ़िगर करने की आवश्यकता हो सकती है। तो, क्या यह संभव है? मुझे किन सेटिंग्स के बारे में पता होना चाहिए? क्या मेरा एनआईसी इसे संभाल नहीं पाएगा?


1
सुनिश्चित करें कि हर आने वाले कनेक्ट के लिए थ्रेड्स को स्पॉन न करें, यह प्रदर्शन को मार देगा

1
+1 यहां अपने अंतिम परिणामों की रिपोर्ट करने के लिए :)
agsamek

जवाबों:


17

यह आमतौर पर c10k समस्या के रूप में जाना जाता है। उस पृष्ठ में उन समस्याओं के बारे में बहुत अच्छी जानकारी है जिन्हें आप चलाएंगे।


हाँ, अच्छा लिंक!
सिब्रॉन

1
मैं c10k पेज पर उल्लिखित की तुलना में अधिक / विभिन्न समस्याओं को देखने की उम्मीद करूंगा। 10k कनेक्शन प्रति सेकंड 10k कनेक्शन स्थापित करना और बंद करना अलग है। TIME_WAIT स्थिति में रहने वाले कनेक्शन एक होंगे, एक सुनने वाले सॉकेट के लिए बैकलॉग सीमा को मारना एक और हो सकता है। और मुझे आश्चर्य नहीं होगा अगर उस उपयोग-केस को कर्नेल कोड में अधिक सामान्य / 10k खुले कनेक्शन केस की तुलना में अधिक अनुकूलन / अनुकूलन नहीं मिला है।
cmeerw

2

आपको यह करने में सक्षम होना चाहिए [हालांकि यह बुरा विचार है]।

क्वाड कोर 2.6ghz xeon पर रेजिन एप्सर्व पर मैं ~ 5 k req / sec प्राप्त कर सकता हूं। अनुरोध सरल सर्वलेट का आह्वान करते हैं जो mysql से 1 पंक्ति पढ़ता है और बहुत छोटी xml प्रतिक्रिया भेजता है।

के साथ परीक्षण किया गया था

ab -n 10000 -c 16 http://some/url/

परीक्षण के परिणाम:

Concurrency Level:      16
Time taken for tests:   1.904 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      3190000 bytes
HTML transferred:       1850000 bytes
Requests per second:    5252.96 [#/sec] (mean)
Time per request:       3.046 [ms] (mean)
Time per request:       0.190 [ms] (mean, across all concurrent requests)
Transfer rate:          1636.42 [Kbytes/sec] received

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

यहां तक ​​कि लंबे समय तक परीक्षण के दौरान मुझे कनेक्टिविटी के साथ कोई समस्या नहीं आती है [उल्लेखित आधे-खुले सॉकेट]; गीगाबिट ईथरनेट पर [दो जैसा कि आप देखते हैं कि बैंडविड्थ कोई अड़चन नहीं है) से जुड़े दो लिनक्स बॉक्स के बीच परीक्षण चलता है।


क्या ओपी की तरह हर प्रतिक्रिया के बाद आपके कनेक्शन बंद हो गए हैं? क्या एब कनेक्शन भेज रहा है: हेडर?
नैट

1
@ नहीं यह http 1.0 है - हर एक http अनुरोध के लिए एकल कनेक्शन।
pQd

1

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


0

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


मैं सहमत हूँ। यूडीपी अधिक हल्का होगा
fpmurphy

1
यूडीपी में कमियां हैं, जैसे प्रेषक और वितरण सत्यापन, इसलिए किसी को उत्पादन में यूडीपी का उपयोग करने से पहले उन पर विचार करना चाहिए।
SaveTheRbtz

0

आपका निक इसे संभालने में सक्षम होना चाहिए, लेकिन मैं प्रति सेकंड 10k नए टीसीपी कनेक्शन होने के डिजाइन पर सवाल उठाता हूं; यदि आप कनेक्शन बना रहे हैं / नष्ट कर रहे हैं, तो आपको या तो a) उन्हें लंबे समय तक खुला रखना चाहिए या b) इसके बजाय UDP का उपयोग करना चाहिए।

उस स्थिति में जहां आपके पास 1M ग्राहक हैं जिन्हें समय-समय पर एक क्वेरी करने की आवश्यकता होती है, लेकिन जहां लोड 10k प्रति सेकंड मारा जाएगा, यूडीपी शायद एक बेहतर विकल्प है।

उस स्थिति में जहां आपको केवल 10k ग्राहक मिले हैं, जिन्हें हर सेकंड एक क्वेरी करने की आवश्यकता होती है, वे केवल मौजूदा कनेक्शन खोल सकते हैं और उनका पुन: उपयोग कर सकते हैं। यह ओएस के लिए बहुत दयालु होगा और यह बहुत कम विलंबता भी पैदा करेगा क्योंकि इसे हर बार एक नए हैंडशेक की आवश्यकता नहीं होगी।

उस स्थिति में जहां आपके पास प्रति सेकंड 10k अनुरोध हैं, मुझे लगता है कि आपके पास वैसे भी फ्रंट-एंड लोड बैलेंसर है, इसलिए आपको इसे भी परखना होगा।

(एनबी: मुझे लगता है कि यह स्टैक ओवरफ्लो पर था)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.