2011-04-13 12 views
12

शीर्षक वास्तव में यह सब कहता है।एक फ़ाइल डिस्क्रिप्टर के साथ, क्या चयन, चुनाव और एपोल और ... के बीच कोई प्रदर्शन अंतर है?

और ... इसका मतलब यह भी pselect और ppoll ..

सर्वर परियोजना मैं पर काम कर रहा हूँ मूल रूप से एक से अधिक थ्रेड के साथ संरचित शामिल हैं। प्रत्येक थ्रेड एक या अधिक सत्रों को संभालता है। सभी धागे समान हैं। प्रोटोकॉल इस बात का ख्याल रखता है कि कौन सा धागा सत्र की मेजबानी करेगा।

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

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

एपोल के लिए मैन पेजों में किनारे और स्तर के ट्रिगरिंग के बारे में कुछ संक्षिप्त चर्चा है। मुझे सच में यकीन नहीं है कि इसका क्या अर्थ है। सॉकेट क्लास में मैं कोड के विंडोज़ भाग में एक ऑप्टिमाइज़ेशन देखता हूं जो किसी भी डेटा को जांचने के लिए ioctlsocket & FIONREAD के साथ चुनिंदा कॉल को शॉर्टकट करता है। आश्चर्य है कि अगर वह वापस आएगा> 0 भले ही कॉल के समय पूरा यूडीपी पैकेट नहीं पहुंचा। क्या यह किनारा ट्रिगरिंग एपोल में है?

कुछ प्राथमिक परीक्षण में, मुझे चयन और मतदान का उपयोग करने के बीच कोई उल्लेखनीय अंतर भी नहीं दिख रहा है।

मैं देख सकता हूं कि टाइमआउट में अधिक सटीकता के कारण पीपीओएल का उपयोग लाभ हो सकता है। कोई विचार?

और हां, मैं ऐसे सत्र के लिए थ्रूपुट अनुकूलित करने की कोशिश कर रहा हूं जो बहुत सारे डेटा प्राप्त कर रहा है। सर्वर अधिक नेटवर्क & सीपीयू से बाध्य डिस्क है।

उत्तर

5

एपोल बनाम चयन या सर्वेक्षण के बीच मुख्य अंतर यह है कि एकल धागे में चलने पर एपॉल स्केल बहुत बेहतर होता है।मुझे नहीं पता कि यह चयन या मतदान का उपयोग कर एक बहुप्रचारित सर्वर का उपयोग करने की तुलना कैसे करेगा। इस http://monkey.org/~provos/libevent/libevent-benchmark2.jpg

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

प्रदर्शन करने के लिए एक और बात यह है कि प्रदर्शन कभी भी एक प्रमुख मुद्दा बनता है IO पूर्णता बंदरगाह (केवल विंडोज़) और kqueue (केवल फ्रीबीएसडी) है। यह भी याद रखना महत्वपूर्ण है कि एपोल केवल लिनक्स है। ज्यादातर मामलों में चयन या मतदान ठीक काम करेगा।

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

+0

धन्यवाद, मूल रूप से पुष्टि की गई कि मैंने प्रयोग द्वारा क्या पाया। – Matt

+2

यदि आप एकल फ़ाइल डिस्क्रिप्टर की बड़ी संख्या है, तो आप 'चयन' का उपयोग नहीं करना चाहते हैं, क्योंकि 'चयन'' ओ (अधिकतम एफडी संख्या) 'है, जबकि 'मतदान'' ओ (अनुरोध में एफडीएस की संख्या है) '। – o11c

0

यदि आपके पास केवल एक ही सॉकेट है, तो पहले स्थान पर मतदान का बिंदु क्या है? तब सबसे अच्छा प्रदर्शन नहीं होगा केवल पढ़ने/लिखने को अवरुद्ध करके?

Wrt। प्रदर्शन, केवल एक फ़ाइल डिस्क्रिप्टर के साथ मुझे नहीं लगता कि बहुत कुछ है, यदि कोई है, तो विभिन्न दृष्टिकोणों के बीच अंतर। यदि आप वास्तव में परवाह करते हैं, तो मुझे लगता है कि आप माप सकते हैं, लेकिन मुझे यह मुश्किल लगता है कि यह विशेष रूप से आपके कार्यक्रम के समग्र प्रदर्शन के लिए महत्वपूर्ण होगा।

स्तर/किनारे ट्रिगरिंग। विचार करें कि आप सिग्नल की निगरानी कर रहे हैं, सादगी के लिए एक लाइन में कुछ वोल्टेज कहते हैं। एज ट्रिगरिंग का मतलब है कि वोल्टेज खत्म होने पर या कुछ विशिष्ट सीमा के तहत कुछ ट्रिगर होता है। स्तर ट्रिगरिंग का मतलब है कि कुछ तब तक ट्रिगर किए गए राज्य में माना जाता है जब तक कि वोल्टेज सीमा के नीचे/नीचे न हो। यही है, जब कुछ घटना होती है (कुछ थ्रेसहोल्ड पार करना) ट्रिगर ट्रिगर करता है, तो स्तर ट्रिगरिंग कुछ "चीज़" (इस मामले में, वोल्टेज) की स्थिति को दर्शाती है।

नेटवर्क प्रोग्रामिंग पर वापस जाने के लिए, और एज ट्रिगर सिस्टम एक ऐसा हो सकता है जहां आपको पैकेट प्राप्त होने पर किसी प्रकार का संकेत मिलता है। यदि आप ईवेंट को संभाल नहीं पाते हैं तो सिग्नल गुम हो जाता है। एक स्तर ट्रिगर सिस्टम, ओटीओएच, कुछ पूछने जैसा है "क्या मेरे लिए बफर में डेटा इंतजार कर रहा है?"; यदि आप ईवेंट को संभाल नहीं पाते हैं और फिर से पूछते हैं, तो डेटा अभी भी आपके लिए इंतजार कर रहा है।

+1

मतदान का उपयोग करके मैं टाइमआउट कर सकता हूं और उसी थ्रेड के भीतर अन्य काम कर सकता हूं। मैं मतदान करने के लिए मतदान का भी उपयोग कर सकता हूं जब ऐसा करने के लिए और कुछ नहीं है और जब मैं नेटवर्क से डेटा की प्रतीक्षा कर रहा हूं। मैं एक और धागा बना सकता हूं लेकिन यह अन्य चीजों के साथ साझा डेटा के साथ अन्य समस्याएं पैदा करता है। अधिक धागे = अधिक जटिलता और मेरे मामले में कोई लाभ नहीं। बहुत सारे दृष्टिकोणों का प्रयास किया। – Matt

3

लिंक के अनुसार: http://www.intelliproject.net/articles/showArticle/index/io_multiplexing

आप केवल एक वर्णनकर्ता का उपयोग करते हैं:

  • select: 201 माइक्रो सेकंड।
  • poll: 15 9 माइक्रो सेकेंड।
  • epoll: 176 माइक्रो सेकेंड।

poll ऐसी स्थिति में बेहतर समाधान होगा।