2009-04-17 13 views
22

मेरे पास 5 मिनट में लिखा गया एक बहुत ही सरल प्रोग्राम है जो अनुरोध के माध्यम से एक अलग सॉकेट और लूप खोलता है और स्क्रीन पर भेजे गए बाइट स्क्रीन पर प्रिंट करता है।क्या लिनक्स पर मशीनों के बीच टीसीपी/आईपी कनेक्शन की संख्या पर कोई सीमा है?

मैंने फिर बेंचमार्क करने की कोशिश की कि मैं इस कार्यक्रम के साथ कितने समवर्ती उपयोगकर्ताओं का समर्थन कर सकता हूं, यह जानने के लिए मैं कितने कनेक्शन हथौड़ा कर सकता हूं।

किसी अन्य मशीन पर (जहां उनके बीच नेटवर्क संतृप्त नहीं है) मैंने एक सरल प्रोग्राम बनाया जो लूप में जाता है और सर्वर मशीन से जुड़ता है और बाइट्स "हैलो वर्ल्ड" भेजता है।

जब लूप 1000-3000 होता है तो ग्राहक भेजे गए सभी अनुरोधों के साथ समाप्त होता है। जब लूप 5000 से अधिक हो जाता है तो अनुरोधों की पहली एक्स संख्या समाप्त करने के बाद समय समाप्त हो जाता है। ऐसा क्यों है? मैंने लूप में अपना सॉकेट बंद करना सुनिश्चित कर लिया है।

क्या आप केवल एक निश्चित अवधि के भीतर इतने सारे कनेक्शन बना सकते हैं?

क्या यह सीमा केवल उसी मशीन के बीच लागू होती है और मुझे इस उत्पादन में चिंता करने की आवश्यकता नहीं है जहां 5000+ अनुरोध विभिन्न मशीनों से आ रहे हैं?

+0

आप एस एस -s आदेश का उपयोग कर अपने सॉकेट निगरानी कर सकते हैं। और यदि आवश्यक हो तो सॉकेट सीमा बढ़ाने के लिए चरणों का पालन करें – Antarus

+0

आप TIMED_WAIT सॉकेट का उपयोग कर सकते हैं जैसे: s = socket.socket (socket.AF_INET, सॉकेट.SOCK_STREAM, 0) ' ' s।setockopt (सॉकेट.SOL_SOCKET, सॉकेट.SO_REUSEADDR, 1) ' – knutole

उत्तर

24

एक सीमा है, हां। ulimit देखें।

इसके अलावा आपको TIMED_WAIT स्थिति पर विचार करने की आवश्यकता है। एक बार टीसीपी सॉकेट बंद हो जाने पर (डिफ़ॉल्ट रूप से) बंदरगाह पर TIMED_WAIT स्थिति 2 मिनट के लिए रहता है। यह मान ट्यून करने योग्य है। यह बंद होने के बावजूद भी आपको "सॉकेट से बाहर चला जाएगा"।

netstatTIMED_WAIT कार्रवाई में सामान देखने के लिए चलाएं।

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

+0

मैंने अभी दोनों मशीनों पर नेटस्टैट के साथ जांच की है, और वास्तव में क्लाइंट साइड पर TIMED_WAIT का एक टन है लेकिन सर्वर पक्ष पर TIMED_WAIT नहीं है। क्या यह बहादुर आप वर्णन कर रहे हैं? मान लीजिए हाँ: 1) क्या इसका मतलब यह है कि यह उत्पादन में कोई मुद्दा नहीं होगा क्योंकि सीमा क्लाइंट पक्ष (सॉकेट से बाहर चल रही है) से आ रही है और वह सर्वर पक्ष नहीं है (जहां कोई सॉकेट नहीं बनाया गया है) 2) क्या इसके आसपास जाने का कोई तरीका है इसलिए मैं अपने सर्वर को उत्पादन के समान लोड के साथ परीक्षण कर सकता हूं? – erotsppa

+0

TIMED_WAIT का व्यवहार ओएस-विशिष्ट है। हां आप इसके आसपास हो सकते हैं - TIMED_WAIT टाइमआउट को बदलना संभव है। 120 सेकंड से 30 या उससे भी कम तक। –

+0

ulimit मुझे "असीमित" दिखाता है ... लेकिन मुझे सच में नहीं लगता कि यह असीमित है ... – trillions

1

हां की जाँच करना चाहते हैं हो सकता है, सीमा कर्नेल द्वारा निर्धारित है; अधिक जानकारी के लिए स्टैक ओवरफ़्लो पर इस धागे को देखें: Increasing the maximum number of tcp/ip connections in linux

8

अधिकतम प्रदर्शन की तलाश करते समय आप बहुत सारी समस्याएं और संभावित बाधाओं में भाग लेते हैं। एक सरल हैलो विश्व परीक्षण चलाना जरूरी नहीं है कि वे सभी को ढूंढें।

संभव सीमाओं में शामिल हैं:

  • कर्नेल सॉकेट सीमाएं: कर्नेल ट्यूनिंग के बहुत सारे के लिए /proc/sys/net में देखो ..
  • प्रक्रिया सीमा: ulimit की जाँच के रूप में दूसरों को यहाँ
  • ने कहा है के रूप में अपने आवेदन में बढ़ता है जटिलता, इसमें आने वाले कनेक्शनों की संख्या को बनाए रखने के लिए पर्याप्त CPU पावर नहीं हो सकती है। top का उपयोग यह देखने के लिए करें कि आपका सीपीयू अधिकतम
  • धागे की संख्या है? मुझे थ्रेडिंग के साथ अनुभव नहीं हुआ है, लेकिन यह पिछले आइटम के साथ संयोजन में खेल सकता है।
2

क्या आपका सर्वर सिंगल-थ्रेडेड है? यदि हां, तो आप किस मतदान/मल्टीप्लेक्सिंग फ़ंक्शन का उपयोग कर रहे हैं?

चुनिंदा() का उपयोग करना संकलित समय पर सेट हार्ड-कोडेड अधिकतम फ़ाइल डिस्क्रिप्टर सीमा से परे काम नहीं करता है, जो निराशाजनक (आमतौर पर 256, या कुछ और) है।

मतदान() बेहतर है, लेकिन आप लूप के चारों ओर सेट को दोबारा सेट करने की बड़ी संख्या में एफडी के साथ स्केलेबिलिटी समस्या के साथ समाप्त हो जाएंगे।

एपोल() को आपके द्वारा मारा गया कुछ अन्य सीमा तक अच्छी तरह से काम करना चाहिए।

10k कनेक्शन प्राप्त करने के लिए पर्याप्त आसान होना चाहिए। हालिया (आईएसएच) 2.6 कर्नेल का प्रयोग करें।

आपने कितनी क्लाइंट मशीनों का उपयोग किया था? क्या आप वाकई क्लाइंट-साइड सीमा नहीं मारा है?

+0

मेरी प्रणाली पर हार्डकोडेड चयन सीमा 1024 थी और यह वास्तव में ऊपर जाना असंभव है (सीमा डेटा प्रकार द्वारा लगाई गई है देखने के लिए फ़ाइल वर्णनकर्ताओं का नक्शा)। –

2

त्वरित उत्तर 2^16 टीसीपी बंदरगाह, 64 के है।

सिस्टम लगाए गए सिस्टम के साथ समस्याएं एक कॉन्फ़िगरेशन समस्या है, जो पहले से ही पिछली टिप्पणियों पर छू चुकी है।

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

64K टीसीपी सत्रों को देखते हुए बंदरगाहों के उदाहरणों के लिए ओवरहेड 32-बिट कर्नेल पर एक मुद्दा हो सकता है, लेकिन 64-बिट कर्नेल नहीं (यहां सुधार खुशी से स्वीकार्य है)। 64 के सत्रों के साथ लुकअप प्रक्रिया चीजों को धीमा कर सकती है और प्रत्येक पैकेट टाइमर कतारों को हिट करता है, जो समस्याग्रस्त भी हो सकता है। पारगमन डेटा में भंडारण सैद्धांतिक रूप से विंडो आकार के समय बंदरगाहों (शायद 8 GByte) में सूजन कर सकते हैं।

कनेक्शन की गति (ऊपर वर्णित) के साथ समस्या शायद आप जो देख रहे हैं। टीसीपी आमतौर पर चीजों को करने में समय लगता है। हालांकि, यह आवश्यक नहीं है। एक टीसीपी कनेक्ट, ट्रांजैक्ट और डिस्कनेक्ट बहुत कुशलता से किया जा सकता है (यह देखने के लिए जांचें कि टीसीपी सत्र कैसे बनाए जाते हैं और बंद होते हैं)।

ऐसे सिस्टम हैं जो प्रति सेकेंड गिगाबिट पास करते हैं, इसलिए पैकेट स्तर स्केलिंग ठीक होनी चाहिए।

बहुत सारी भौतिक स्मृति वाली मशीनें हैं, जो ठीक दिखती हैं।

सावधानी से कॉन्फ़िगर किए जाने पर सिस्टम का प्रदर्शन ठीक होना चाहिए।

चीजों का सर्वर पक्ष समान रूप से स्केल करना चाहिए।

मुझे मेमोरी बैंडविड्थ जैसी चीजों के बारे में चिंतित होगा।

एक प्रयोग पर विचार करें जहां आप स्थानीय मेजबान 10,000 बार लॉगिन करते हैं। फिर एक चरित्र टाइप करें। उपयोगकर्ता स्थान के माध्यम से संपूर्ण ढेर प्रत्येक चरित्र पर लगाया जाएगा। सक्रिय पदचिह्न डेटा कैश आकार से अधिक होने की संभावना है। बहुत सारी मेमोरी के माध्यम से चलने से वीएम सिस्टम पर दबाव हो सकता है। संदर्भ स्विच की लागत एक सेकंड तक पहुंच सकती है!

यह अन्य धागे की एक किस्म में चर्चा की है: https://serverfault.com/questions/69524/im-designing-a-system-to-handle-10000-tcp-connections-per-second-what-problems

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