6

मैं ऐसे एप्लिकेशन पर काम कर रहा हूं जिसके लिए एक प्रकार का संदेश डेटाबेस पर हिट करने के लिए आवश्यक है, और अन्य प्रकार के संदेश को जाने और कुछ बाहरी xml एपीआई को हिट करने के लिए आवश्यक है।HttpWebRequest और I/O पूरा होने वाले बंदरगाह

मुझे ए लॉट को संसाधित करना है ... बड़ी चुनौतियों में से एक है HttpWebRequest क्लास अच्छी तरह से प्रदर्शन करना है। मैंने शुरुआत में मानक सिंक्रोनस विधियों और पूरी चीज को थ्रेडपूल करने के साथ शुरू किया। यह अच्छा नहीं था।

तो कुछ पढ़ने के बाद मैंने देखा कि ऐसा करने का अनुशंसित तरीका आईओ पूरा करने वाले बंदरगाहों को काम सौंपने के लिए आरंभ/समाप्ति विधियों का उपयोग करना था, इस प्रकार थ्रेडपूल को मुक्त करना और बेहतर प्रदर्शन प्रदान करना। यह मामला प्रतीत नहीं होता है ... प्रदर्शन मामूली रूप से बेहतर है लेकिन मैं निश्चित रूप से थियोपूल की तुलना में आईओ पूरा होने वाले बंदरगाहों का उपयोग नहीं कर सकता।

मेरे पास एक थ्रेड है जो गोल करता है और मुझे थ्रेडपूल में उपलब्ध कार्यकर्ता थ्रेड + समापन बंदरगाह भेजता है। पूरा बंदरगाह हमेशा बहुत कम होता है (अधिकतम मैंने देखा 9 उपयोग किया जाता है) और मैं हमेशा 120 कार्यकर्ता धागे (कभी-कभी अधिक) का उपयोग कर रहा हूं।

Begin/EndGetRequestStream 
Begin/EndWrite (Stream) 
Begin/EndGetResponse 
Begin/EndRead (Stream) 

मैं इसे ठीक कर रहा हूँ: मैं httpwebrequest में सभी तरीकों के लिए शुरू/अंत पैटर्न का उपयोग करें? क्या मैं कुछ भूल रहा हूँ? मैं (कभी-कभी) 2048 HTTP कनेक्शन तक (नेटस्टैट आउटपुट से) का उपयोग कर सकता हूं - पूरा पोर्ट नंबर इतना कम क्यों होगा?

अगर कोई इस प्रबंध कार्यकर्ता धागे, पूरा होने वाले बंदरगाहों और httpwebrequest के साथ अच्छा प्रदर्शन करने के बारे में कुछ गंभीर सलाह दे सकता है तो इसकी अत्यधिक सराहना की जाएगी!

संपादित करें: .NET इस के लिए एक उचित उपकरण है? क्या मुझे .NET और System.Net स्टैक के साथ काम कर रहे HTTPconnections की उच्च मात्रा मिल सकती है? WinHttp (या कुछ अन्य सी ++ लाइब्रेरी) जैसे कुछ का उपयोग करने का सुझाव दिया गया है, और इसे .NET से PInvoke करें, लेकिन यह ऐसा कुछ नहीं है जिसे मैं विशेष रूप से करना चाहता हूं! यह केवल "व्यस्त" जब डेटा नहीं दिया गया है और पर कार्रवाई की जा रही है -

+0

क्या आपकी बाहरी एपीआई लोड को उचित तरीके से संभालने वाली है? मेरे पास एक बाहरी सेवा है जिसका उपयोग मैं करता हूं कि यदि मैं बहुत से अनुरोध भेजता हूं तो सेवा सर्वर पर प्रदर्शन का एक मापनीय degredation है। – btlog

+0

@btlog -> हाँ, जैसे कि मैं कुछ बाहरी प्रदाताओं को अक्षम करता हूं अन्य प्रदाता बेहतर समय प्रदान करते हैं (लेकिन कॉल की समान मात्रा प्राप्त करते हैं)। अगर समस्या उनके पक्ष में मात्रा थी तो इससे कोई फर्क नहीं पड़ता कि मैंने अन्य एक्सएमएल सेवाओं के साथ क्या किया है, इससे दूसरों को प्रभावित नहीं होगा। – peteisace

उत्तर

6

तरह से मैं इसे समझ, आप एक I/O पूर्णता पोर्ट सभी बार हुआ है कि एक अतुल्यकालिक अनुरोध बकाया है गठबंधन नहीं है संबंधित धागा उम्मीद है कि आपके पास बहुत कॉलबैक में करने के लिए बहुत अधिक काम नहीं है, यही कारण है कि आपके पास किसी भी समय उपयोग में आने वाले बंदरगाह नहीं हैं।

क्या आप वास्तव में खराब प्रदर्शन प्राप्त कर रहे हैं? चिंता का कारण केवल कम संख्या है? क्या आप थ्रूपुट प्राप्त कर रहे हैं जिसकी आप उम्मीद करेंगे?

एक समस्या आपको हो सकता है कि किसी एक होस्ट के लिए HTTP कनेक्शन पूल अपेक्षाकृत छोटा है। यदि आपके पास एक ही मशीन पर सैकड़ों अनुरोध हैं, तो डिफ़ॉल्ट रूप से केवल 2 अनुरोध वास्तव में एक समय में किए जाएंगे, ताकि मेजबान में प्रश्नोत्तरी पर हमला किया जा सके (और जीवित रहने के लाभ प्राप्त करने के लिए)। आप इस प्रोग्रामेटिक रूप से या app.config का उपयोग कर सकते हैं। बेशक, यह आपके मामले में कोई समस्या नहीं हो सकती है, या तो क्योंकि आपने पहले से ही समस्या को ठीक कर दिया है या क्योंकि आपके सभी अनुरोध अलग-अलग मेजबान हैं। (यदि नेटस्टैट 2048 कनेक्शन दिखा रहा है तो यह बुरा नहीं लगता है।)

+0

कॉलबैक बहुत कुछ नहीं करता है - यहां तक ​​कि स्ट्रीम रीडिंग + लेखन भी असीमित रूप से किया जाता है (हालांकि यह मेरी समस्या का हिस्सा हो सकता है? सभी उदाहरणों में मैं सिंक्रोनस स्ट्रीम पढ़ने, लिखने और स्ट्रीम ऑपरेशन का अनुरोध करने के लिए उपयोग करता हूं। खराब प्रदर्शन: हाँ - i स्टॉपवॉच का उपयोग करें और पूरा होने पर एक संदेश भेजें। स्टॉपवॉच <1 सेकंड से 60 सेकंड तक होगा। मैंने पहले ही सर्विसपॉइंट मैनेजर बढ़ाया है। डीफॉल्टकोनकवेशनलिमिट 2048 तक, और मैं KeepAlive का उपयोग कर रहा हूं, और नेटस्टैट डीआईडी ​​शो 2048 कनेक्शन जैसा कि स्थापित किया गया है। – peteisace

+0

@peteisace: ऐसा लगता है कि आप सभी सही चीजें कर रहे हैं। आप कितने निश्चित हैं कि सर्वर वास्तव में * प्रतिक्रिया * जल्दी है? क्या आपने वायरसहार्क डंप को पकड़ने की कोशिश की है? –

+0

अगर मैं बाहरी एपीआई में से एक को हटा देता हूं कि मैं टी पर बेहतर समय के साथ संवाद कर रहा हूँ वह दूसरों, तो यह निश्चित रूप से मेरे ग्राहक कॉल है। मेरा सिद्धांत यह है कि मैं बहुत अधिक थ्रेडपूल धागे का उपयोग कर रहा हूं और इससे बहुत सारे धागे उछलते हैं, जिसका मतलब है कि चीजें बस पर्याप्त संसाधित नहीं हो सकती हैं, यही कारण है कि मैं वास्तव में पूरा होने वाले बंदरगाहों को मजबूर करने की उम्मीद कर रहा था वे जितना व्यस्त हैं। पीएस सभी उपलब्ध बैंडविड्थ का उपयोग नहीं कर रहा है! साथ ही http सामग्री मेरे डीबी धागे पर नकारात्मक प्रभाव डाल रही है, यही कारण है कि मुझे लगता है कि यह पूल में बहुत सारे धागे हैं। – peteisace

0

हो सकता है कि आपके एंड्रॉइड विधियों को केवल एक थ्रेड सुरक्षित कतार में परिणाम लिखना चाहिए जिसे आप अपने नियंत्रण में कम से कम कार्यकर्ता धागे से पढ़ते हैं । और/या इस तथ्य का उपयोग करें कि HttpWebRequest एक प्रतीक्षा योग्य ऑब्जेक्ट को सिग्नल करेगा जब यह किया जाता है और एक ही (या छोटी संख्या) थ्रेड से सभी बकाया अनुरोधों पर प्रतीक्षा करने के लिए अपना तर्क लिखें।

0

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

यदि चल रहे धागे में से एक निष्क्रिय (नींद/ब्लॉक/प्रतीक्षा) हो जाता है और प्रक्रिया के लिए अतिरिक्त कार्य आइटम होते हैं, तो सक्रिय गिनती को 8 पर रखने के लिए अतिरिक्त थ्रेड बनाया जाएगा। यदि आपको 9 धागे दिखाई देते हैं, इसका मतलब है कि आप अपने समापन बंदरगाह धागे के तरीकों में वास्तव में कोई अवरोध नहीं कर रहे हैं और वास्तव में उनके साथ सीपीयू काम कर रहे हैं।

यदि आपके पास 8 कोर पर सीपीयू बाध्य काम सक्रिय रूप से 8 धागे हैं, तो अधिक थ्रेड जोड़ना केवल चीजों को धीमा कर देगा (धागे के बीच संदर्भ स्विचिंग बर्बाद समय होगा)।

आपको क्या देखना चाहिए यह है कि आपके पास 120 अन्य धागे और वे क्या कर रहे हैं।

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