2012-09-03 9 views
7

मूल पोस्ट पर अपडेट करें: एक सहयोगी ने बताया कि मैं क्या गलत कर रहा था। मैं पोस्ट के निचले हिस्से में स्पष्टीकरण दूंगा, क्योंकि यह दूसरों के लिए सहायक हो सकता है।पायथन में udp दर सीमा?


मैं अजगर कार्यक्रमों के नेटवर्क के प्रदर्शन पर सीमा की एक बुनियादी समझ पाने के लिए कोशिश कर रहा हूँ और एक विसंगति में चलाने की है। कोड खंड

while 1: 
    sock.sendto("a",target) 

यूपीपी पैकेट को लक्ष्य मशीन पर भेजता है, जितना तेज़ मेजबान भेजता है। मैं प्रति सेकंड 4000 से अधिक पैकेट की प्रति भेजने की दर, या 250 यूएस प्रति पैकेट मापता हूं। यह पाइथन (प्रोग्राम 2 गीगाहर्ट्ज एएमडी ऑप्टरॉन, लिनक्स, पायथन संस्करण 2.6.6 पर चल रहा है) की व्याख्या की गई भाषा के लिए धीमा प्रतीत होता है। मैंने टीसीपी के लिए पायथन में बहुत बेहतर प्रदर्शन देखा है, इसलिए मुझे यह थोड़ा अजीब लगता है।

अगर मैं पृष्ठभूमि में इस चलाने के लिए और शीर्ष चलाने के लिए, मुझे लगता है कि अजगर CPU के सिर्फ 25% उपयोग कर रहा है, कि अजगर का सुझाव दे कृत्रिम रूप से यूडीपी पैकेट के संचरण में देरी हो सकती है।

क्या किसी और ने ऐसा कुछ अनुभव किया है? क्या किसी को पता है कि पाइथन पैकेट ट्रांसमिशन की दर को सीमित करता है, और यदि को बंद करने का कोई तरीका है?

बीटीडब्ल्यू, एक समान सी ++ प्रोग्राम 200,000 से अधिक पैकेट प्रति सेकंड, भेज सकता है, इसलिए यह प्लेटफ़ॉर्म या ओएस की आंतरिक सीमा नहीं है।


तो, यह पता चला कि मैंने मूर्खतापूर्ण नौसिखिया गलती की है। मैंने gethostbyname को स्पष्ट रूप से कॉल करने के लिए उपेक्षित किया। नतीजतन, sendto कमांड में लक्षित पता एक प्रतीकात्मक नाम था। यह हर बार एक पैकेट भेजा गया था जब एक नाम संकल्प ट्रिगर कर रहा था। इसे ठीक करने के बाद, मैं लगभग 120,000 पी/एस की अधिकतम प्रेषण दर मापता हूं। बहुत बेहतर।

+2

अभी भी आश्चर्य की बात है, मैंने सोचा होगा कि नाम संकल्प कैश किया जाएगा। आपको आगे बढ़ना चाहिए और अपना संकल्प उत्तर के रूप में देना चाहिए। –

उत्तर

0

आप एक और पूर्ण कोड नमूना पोस्ट करना चाहते हैं ताकि अन्य आपके बेंचमार्क को दोहरा सकें। 250μs प्रति लूप पुनरावृत्ति बहुत धीमी है। पाइथन को अनुकूलित करने के साथ दैनिक अनुभव के आधार पर, मैं अपेक्षा करता हूं कि पाइथन के दुभाषिया ओवरहेड आधुनिक मशीन पर 1μ से नीचे हो। दूसरे शब्दों में, यदि सी ++ प्रोग्राम प्रति सेकंड 200k पैकेट भेज रहा है, तो मैं उम्मीद करता हूं कि पाइथन गति की परिमाण के समान क्रम में हो।

(ऊपर के प्रकाश में, इस तरह के लूप से बाहर sock.sendto की विशेषता देखने चलती यहाँ लागू नहीं है क्योंकि सुस्ती किसी अन्य स्रोत से आ रहा है के रूप में हमेशा की तरह अनुकूलन सुझाव।)

एक अच्छा पहला पाइथन वास्तव में क्या कर रहा है यह देखने के लिए strace का उपयोग करने के लिए कदम। क्या यह एक सिंगल थ्रेडेड प्रोग्राम है या एक बहुप्रचारित एप्लिकेशन है जो जीआईएल पर इंतजार करने में समय खो सकता है? sock एक सामान्य पायथन सॉकेट है या यह एक और विस्तृत एपीआई का हिस्सा है? क्या ऐसा होता है जब आप सीधे सॉकेट के fileno पर os.write पर कॉल करते हैं?

1

क्या आपने connect() पहले करने की कोशिश की है, तो sendto() के बजाय send() का उपयोग कर रहे हैं? (यूडीपी connect() बस गंतव्य पता स्थापित करता है, यह वास्तव में "कनेक्शन" नहीं बनाता है।) मैं इस पर जंगली हूं, लेकिन मेरा मानना ​​है कि पाइथन सी सॉकेट की तुलना में पता पैरामीटर पर अधिक व्याख्या करता है, जो ओवरहेड जोड़ सकता है।

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