हजारों आईपी पते/इंटरफेस बनाम धीमी कार्यक्रम प्रदर्शन

मेरे पास eth2 के लिए 5000+ आईपी पते (द्वितीयक) के साथ एक CentOS 5.9 मशीन स्थापित है। मेरा प्रोग्राम केवल 2 यूडीपी सॉकेट (1 आरएक्स, 1 TX) के लिए 2 का उपयोग करता है। जब मैं एप्लिकेशन चलाता हूं, तो CPU उपयोग लगभग 100% हर समय होता है। जब मैं आईपी पते की संख्या छोड़ देता हूं (10), सबकुछ सामान्य हो जाता है - शायद 1% CPU उपयोग।

कार्यक्रम मूल रूप से एक क्लाइंट-सर्वर अनुप्रयोग है। यह गैर अवरुद्ध आर/डब्ल्यू और epoll_wait() का उपयोग करता है घटना इंतजार के लिए।

क्या कोई मुझे बता सकता है कि बाइनरी के लिए इतना उच्च CPU उपयोग क्यों है जो केवल छोटे हिस्से का उपयोग करता है कॉन्फ़िगर किए गए पते का।

3
हो सकता है क्योंकि यह एक अजीब संख्या में आईपी पते के साथ कॉन्फ़िगर किए जाने पर कुशल होने के लिए डिज़ाइन नहीं किया गया है? लेकिन यह सवाल शायद सर्वरफॉल्ट पर है, StasckOverflow नहीं ...
जोड़ा लेखक Roddy, स्रोत
किसी भी कोड के बिना समस्या का निदान करना मुश्किल है।
जोड़ा लेखक aust, स्रोत
रॉड्डी का बयान मान्य हो सकता है, हो सकता है कि सेंटो को इन उच्च संख्या के पते के अनुरोधों को संभालने के लिए डिज़ाइन नहीं किया गया हो। क्या आपने अपने सेटअप के लिए रेडहाट, उबंटू सर्वर संस्करणों जैसे किसी भी लिनक्स स्वाद के साथ प्रयास किया था?
जोड़ा लेखक MuruganV-userm, स्रोत

2 उत्तर

हजारों सॉकेट हैंडलिंग विशेष सॉफ्टवेयर लेता है। अधिकांश नेटवर्क प्रोग्रामर "चुनिंदा" का उपयोग करते हैं और उम्मीद करते हैं कि हजारों सॉकेट अच्छी तरह से स्केल करें ... जो यह निश्चित रूप से नहीं करता है। एक और घटना-संचालित मॉडल बहुत बेहतर है ... घटना सॉकेट पर एक नई सॉकेट या डेटा है।

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

http://libevent.org/

यहां वेबसाइट देखें और आप लॉगरिदमिक ग्राफ देख सकते हैं जो हजारों सॉकेट प्रदर्शन करता है जैसे कि वे 100 थे। बेशक, यदि सॉकेट बहुत व्यस्त हैं, तो आप कम प्रदर्शन पर वापस आ गए हैं, लेकिन अधिकांश सॉकेट दुनिया ज्यादातर चुप हैं और यह वह जगह है जहां मुक्तिदाता चमकता है। अन्य पुस्तकालयों के साथ-साथ ज़ीरोमक (सी # मोनो), libev, Boost.ASIO भी हैं।

http://zeromq.org/
http://libev.schmorp.de/bench.html
http://www.boost.org/doc/libs/1_36_0/doc/html/boost_asio.html

यहां मेरा कामकाजी, सुपर-सरल नमूना है। आपको थ्रेडिंग सुरक्षा जोड़ने की आवश्यकता होगी लेकिन एक घंटे से भी कम समय के काम के साथ, आप आसानी से कुछ हज़ार एक साथ कनेक्शन का समर्थन कर सकते हैं।

http://pastebin.com/g02S2RTi
1
जोड़ा
ओपी ने हजारों सॉकेट को संभालने के बारे में एक शब्द नहीं कहा है। इसके विपरीत, उन्होंने स्पष्ट रूप से दो सॉकेट, और हजारों पते का उल्लेख किया है। स्पष्ट रूप से आपने वास्तव में प्रश्न नहीं पढ़ा है। -1
जोड़ा लेखक EJP, स्रोत

मुझे नहीं लगता कि प्रश्न ने सॉकेट की संख्या के बारे में वार्ता पोस्ट की है बल्कि इंटरफ़ेस पर पते की संख्या पोस्ट की है। यद्यपि यह बहुत अजीब लगता है कि क्यों आपका प्रोग्राम इस नंबर के साथ सीपीयू में बहुत अधिक है, लेकिन सामान्य पते में आने वाले पैकेट और आउटगोइंग पैकेट से निपटने के लिए आईपी स्टैक के प्रदर्शन को प्रभावित करेगा। जब आप एक भेजते हैं, और आपकी सॉकेट बाध्य नहीं होती है, तो कर्नेल को गंतव्य पते के आधार पर पैकेट में रखने के लिए एक आईपी पता निर्धारित करने की आवश्यकता होती है, और यदि समय लगता है तो यह आपके प्रक्रिया संदर्भ में दिखाई देगा।

लेकिन ये अभी भी ज्यादा व्याख्या नहीं करते हैं, मुझे लगता है कि एक gprof डालने का एक अच्छा विचार होगा।

1
जोड़ा