I wrote you a full benchmark, एक छोटी सी बोतल आवेदन gUnicorn द्वारा समर्थित का उपयोग कर/meinheld + nginx, और देख कितनी देर तक यह 10,000 अनुरोध को पूरा करने के लेता है (प्रदर्शन और HTTPS के लिए)। अनलोड किए गए c4.Large उदाहरणों की एक जोड़ी पर एडब्ल्यूएस में टेस्ट चलाए जाते हैं, और सर्वर इंस्टेंस सीपीयू-सीमित नहीं था।
टीएल; डीआर सारांश: यदि आप बहुत सारी नेटवर्किंग कर रहे हैं, तो PyCurl का उपयोग करें, अन्यथा अनुरोधों का उपयोग करें। PyCurl अनुरोध के रूप में तेज़ी से 2x-3x छोटे अनुरोधों को पूरा करता है जब तक आप बड़े अनुरोधों (लगभग 520 एमबीआईटी या 65 एमबी/एस) के साथ बैंडविड्थ सीमा को हिट नहीं करते हैं, और 3x से 10x कम CPU पावर का उपयोग करते हैं। ये आंकड़े ऐसे मामलों की तुलना करते हैं जहां कनेक्शन पूलिंग व्यवहार समान होता है; डिफ़ॉल्ट रूप से, PyCurl कनेक्शन पूलिंग और DNS कैश का उपयोग करता है, जहां अनुरोध नहीं होते हैं, इसलिए एक निष्क्रिय कार्यान्वयन 10x धीमा होगा।
ध्यान दें कि डबल लॉग भूखंडों परिमाण शामिल होने की वजह से ही नीचे ग्राफ के लिए उपयोग किया जाता है
- pycurl जब एक कनेक्शन
- अनुरोधों जब एक कनेक्शन
- pycurl खुला एक करने के लिए लगभग 165 सीपीयू माइक्रोसेकंड लेता है पुन: उपयोग के बारे में 526 सीपीयू माइक्रोसेकंड लेता है एक अनुरोध जारी करने के लिए पुन: उपयोग के लिए एक अनुरोध जारी करने के लिए 73 के बारे में सीपीयू माइक्रोसेकंड लेता है नया कनेक्शन और एक अनुरोध (कोई संबंध पुन: उपयोग) जारी, या ~ 92 माइक्रोसेकंड
- अनुरोधों को खोलने के लिए एक नया कनेक्शन खोलने के लिए और एक अनुरोध (कोई संबंध पुन: उपयोग) जारी, या के बारे में सीपीयू माइक्रोसेकंड लेता है ~ 552 माइक्रोसॉन्ड खोलने के लिए
Full results are in the link, बेंचमार्क पद्धति और सिस्टम कॉन्फ़िगरेशन के साथ।
चेतावनी: हालांकि मुझे यह सुनिश्चित करने के लिए दर्द होता है कि परिणाम वैज्ञानिक तरीके से एकत्र किए जाते हैं, यह केवल एक सिस्टम प्रकार और एक ऑपरेटिंग सिस्टम का परीक्षण करता है, और प्रदर्शन का सीमित सबसेट और विशेष रूप से HTTPS विकल्प।
आपका बेंचमार्क अच्छा है, लेकिन लोकहोस्ट में कोई भी नेटवर्क परत ओवरहेड नहीं है। यदि आप यथार्थवादी प्रतिक्रिया आकार ('पोंग' यथार्थवादी नहीं है) का उपयोग करके वास्तविक नेटवर्क गति पर डेटा स्थानांतरण गति को कैप कर सकते हैं, और सामग्री-एन्कोडिंग मोड (संपीड़न के साथ और बिना) के मिश्रण सहित, और * फिर * समय के आधार पर उत्पादन कि, तो आपके पास वास्तविक अर्थ के साथ बेंचमार्क डेटा होगा। –
मैं यह भी ध्यान देता हूं कि आपने लूप के बाहर pycurl के लिए सेटअप को स्थानांतरित किया है (यूआरएल सेट करना और writedata लक्ष्य तर्कसंगत रूप से लूप का हिस्सा होना चाहिए), और 'cStringIO' बफर को न पढ़ें; गैर-पिकुरल परीक्षणों को सभी को पाइथन स्ट्रिंग ऑब्जेक्ट के रूप में प्रतिक्रिया उत्पन्न करना होता है। –
@MartijnPieters नेटवर्क ओवरहेड की कमी जानबूझकर है; यहां इरादा क्लाइंट का अलगाव में परीक्षण करना है। यूआरएल वहां प्लग करने योग्य है, इसलिए आप इसे अपनी पसंद के वास्तविक, लाइव सर्वर के खिलाफ परीक्षण कर सकते हैं (डिफ़ॉल्ट रूप से ऐसा नहीं होता है, क्योंकि मैं किसी के सिस्टम को हथियार नहीं देना चाहता)। ** मुख्य नोट: ** पिकुरल का बाद का परीक्षण body.getvalue के माध्यम से प्रतिक्रिया निकाय को पढ़ता है, और प्रदर्शन बहुत समान है। अगर आप सुधार का सुझाव दे सकते हैं तो पीआरएस कोड के लिए स्वागत है। – BobMcGee