2010-05-05 7 views
15

मैं एक ऐसा उपकरण बना रहा हूं जो एक सर्वर से दूसरे सर्वर पर बहुत बड़े स्ट्रीमिंग डेटा सेट (संभवतः एक स्ट्रीम में टेराबाइट्स के क्रम पर, नियमित रूप से गीगाबाइट्स के क्रम में) स्थानांतरित करता है। टूल का क्लाइंट हिस्सा स्रोत डिस्क से ब्लॉक पढ़ेगा, और उन्हें नेटवर्क पर भेज देगा। सर्वर पक्ष नेटवर्क से इन ब्लॉकों को पढ़ेगा और उन्हें सर्वर डिस्क पर एक फ़ाइल में लिख देगा।http.sys फ़ाइल अपलोड प्रदर्शन को अधिकतम करने के लिए कैसे करें

अभी मैं यह तय करने की कोशिश कर रहा हूं कि कौन से परिवहन का उपयोग करना है। विकल्प कच्चे टीसीपी, और HTTP हैं।

मैं वास्तव में, वास्तव में HTTP का उपयोग करने में सक्षम होना चाहता हूं। HttpListener (या डब्ल्यूसीएफ अगर मैं उस मार्ग पर जाना चाहता हूं) HTTP सर्वर एपीआई (http.sys) में प्लग करना आसान बनाता है, और मैं प्रमाणीकरण और एसएसएल जैसी चीजें मुफ्त में प्राप्त कर सकता हूं। अभी समस्या प्रदर्शन है।

मैंने एक साधारण टेस्ट दोहन लिखा है जो शुरुआती राइट/एंडवाइट एसिंक I/O idiom का उपयोग करते हुए 128K ब्लॉक के नल बाइट भेजता है, सर्वर सर्वर पर async BeginRead/EndRead के साथ। मैंने इस टेस्ट दोहन को संशोधित किया है, इसलिए मैं इसे HttpWebRequest/HttpListener के माध्यम से HTTP PUT संचालन के साथ कर सकता हूं, या TcpClient/TcpListener का उपयोग करके सादे पुराने सॉकेट लिख सकता हूं। नेटवर्क कार्ड या नेटवर्क पथ के साथ समस्याओं को रद्द करने के लिए, क्लाइंट और सर्वर दोनों एक मशीन पर हैं और स्थानीयहोस्ट पर संवाद करते हैं।

मेरे 12-कोर विंडोज 2008 आर 2 परीक्षण सर्वर पर, इस परीक्षण दोहन का टीसीपी संस्करण कम से कम CPU उपयोग के साथ 450 एमबी/एस पर बाइट धक्का दे सकता है। उसी बॉक्स पर, टेस्ट दोहन का HTTP संस्करण 130 एमबी/एस और 200 एमबी/एस के बीच चलता है, इस पर निर्भर करता है कि मैं इसे कैसे ट्वीक करता हूं।

दोनों मामलों में सीपीयू उपयोग कम है, और सीपीयू उपयोग का विशाल बहुमत कर्नेल समय है, इसलिए मुझे पूरा यकीन है कि मेरा उपयोग सी # और .NET रनटाइम बाधा नहीं है। बॉक्स में दो 6-कोर ज़ीऑन एक्स 5650 प्रोसेसर हैं, 24 जीबी एकल रैंकिंग डीडीआर 3 रैम है, और मेरे द्वारा अपने प्रदर्शन परीक्षण के लिए विशेष रूप से मेरे द्वारा उपयोग किया जाता है।

मुझे पहले से ही ServicePointManager.MaxServicePointIdleTime, ServicePointManager.DefaultConnectionLimit, ServicePointManager.Expect100Continue, और HttpWebRequest.AllowWriteStreamBuffering जैसे HTTP क्लाइंट tweaks के बारे में पता है।

क्या किसी के पास कोई विचार है कि मैं 200 एमबी/एस से परे HTTP.sys प्रदर्शन कैसे प्राप्त कर सकता हूं? क्या किसी ने इसे किसी भी पर्यावरण पर अच्छा प्रदर्शन किया है?

अद्यतन:

यहाँ प्रदर्शन मैं TcpListener बनाम HttpListener साथ दिखाई दे रही है पर थोड़ा अधिक विस्तार से बताया:

पहले, मैं एक TcpClient/TcpListener परीक्षण लिखा था। मेरे टेस्ट बॉक्स पर 450 एमबी/एस को धक्का देने में सक्षम था।

फिर परावर्तक का उपयोग करके मैंने यह पता लगाया कि कच्चे सॉकेट ऑब्जेक्ट को HttpWebRequest अंतर्निहित कैसे प्राप्त किया जाए, और इसका उपयोग करने के लिए मेरे HTTP क्लाइंट परीक्षण को संशोधित किया गया। अभी भी कोई खुशी नहीं; मुश्किल से 200 एमबी/एस।

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

इसके लायक होने के लिए, मैंने यह भी देखने के लिए 32 समवर्ती HTTP पुट ऑपरेशंस की कोशिश की कि क्या यह स्केल हो सकता है, लेकिन अभी भी कोई खुशी नहीं थी; लगभग 200 एमबी/एस।

दिलचस्प बात यह है कि, मेरे विकास वर्कस्टेशन पर, जो क्वाड-कोर ज़ीऑन प्रेसिजन टी 7400 64-बिट विंडोज 7 चला रहा है, मेरा टीसीपी क्लाइंट कार्यान्वयन लगभग 200 एमबी/एस है, और HTTP संस्करण भी लगभग 200 एमबी/एस है। एक बार जब मैं इसे उच्च-अंत सर्वर-क्लास मशीन पर चलाता हूं, तो सर्वर 2008 आर 2 चल रहा है, तो टीसीपी क्लाइंट कोड 450 एमबी/एस तक पहुंच जाता है, जबकि HTTP.sys कोड लगभग 200 रहता है।

इस बिंदु पर मैंने दुख की बात की है कि HTTP.sys मुझे जो काम करने की ज़रूरत है, उसके लिए सही उपकरण नहीं है, और हमें हाथ से लुढ़का हुआ सॉकेट प्रोटोकॉल का उपयोग जारी रखना होगा जिसे हम सभी के साथ उपयोग कर रहे हैं।

+1

अच्छा, अच्छी तरह से शोध किया गया प्रश्न। HttpListener के उपयोगकर्ता के रूप में, मैं इसे देख रहा हूँ। +1 (मेरे स्वयं के मुकाबले एक शक्तिशाली देव मंच के साथ एक डेवलपर के बारे में सुनने पर मेरी भावनाओं को अलग करने के बाद) – spender

+0

धन्यवाद :) अभी तक ईर्ष्या के साथ हरे रंग की बारी न करें; मैं इस बॉक्स को दो अन्य देवताओं के साथ साझा करता हूं (यह अभी मेरी बारी है लेकिन बाद में मुझे इसे किसी और को चालू करना होगा)। चूंकि यह बॉक्स उस बजट को खा लिया गया है जिसका उपयोग मेरे पुराने विकास लैपटॉप को बदलने के लिए किया जाना था। ओह ठीक है; लेखांकन देता है, लेखांकन दूर ले जाता है। – anelson

+0

बिल्कुल एक जवाब नहीं है, लेकिन मुझे आश्चर्य है कि यूनिसन जैसी उपयोगिता इस http://alliance.seas.upenn.edu/~bcpierce/wiki/index.php?n=Main.UnisonFAQTips –

उत्तर

2

मुझे इस Tech Note को छोड़कर बहुत अधिक रुचि दिखाई नहीं दे रही है। MaxBytesPerSend

+0

हाँ, मैं वास्तव में इसे देखा होगा। 'MaxBytesPerSend' के साथ मैंने हस्तक्षेप नहीं करने का कारण यह था कि मेरे मामले में, HTTP.sys भेजने को नहीं कर रहा है; मैं एक बड़े पेलोड के साथ एक HTTP पुट कर रहा हूं, जो HTTP.sys को मेरे HttpLisener- आधारित सर्वर पर प्राप्त करता है और स्ट्रीम करता है। इसके अलावा, एक बड़ी टीसीपी विंडो उच्च विलंबता के साथ उच्च बैंडविड्थ के साथ लिंक का लाभ उठाने वाला माना जाता है; चूंकि मेरा परीक्षण लूपबैक इंटरफ़ेस पर किया जा रहा है, इसलिए विलंबता शून्य के लिए असम्मित है। हालांकि सुझाव के लिए धन्यवाद। रखो और आओ! – anelson

0

यदि आप लैन पर फाइलें भेजने जा रहे हैं तो यूडीपी जाने का रास्ता है, क्योंकि टीसीपी का ओवरहेड उस मामले में अपशिष्ट है। टीसीपी बहुत सारे खोए हुए पैकेट से बचने के लिए को सीमित करता है, जबकि यूडीपी के साथ एप्लिकेशन को इसे स्वयं ही हल करना होता है। एनएफएस नौकरी करेगा, ऐसा नहीं था कि आप खिड़कियों से फंस गए हैं; लेकिन मुझे यकीन है कि तैयार यूडीपी सामान तैयार होना चाहिए। प्रोटोकॉल के बावजूद नेटवर्क लिंक को बेंचमार्क करने के लिए टूल "iperf" (लिनक्स पर उपलब्ध, शायद विंडोज़ पर भी उपलब्ध) का उपयोग करें। कुछ नेटवर्क कार्ड सादे बकवास होते हैं और सीपीयू पर बहुत भरोसा करते हैं, जो आपकी गति को 200 एमबी तक सीमित कर देगा। आप अपने प्रोसेसर के साथ एक उचित नेटवर्क कार्ड चाहते हैं (इसे रखने के लिए सही शब्द नहीं जानते हैं)।

+0

सुझाव के लिए धन्यवाद, लेकिन विभिन्न कारणों से मैं HTTP के साथ फंस गया हूं। मैं टीसीपी द्वारा पेश किए गए ओवरहेड से काफी परिचित हूं, लेकिन अकेले उस प्रदर्शन दंड के लिए जिम्मेदार नहीं है जिसका मैं यहां भुगतान कर रहा हूं। कच्चे टीसीपी का उपयोग करके मैं HTTP एमबीएस के साथ 200 एमबी/एस की तुलना में 450 एमबी/एस को स्थानांतरित करने में सक्षम था, इसलिए स्पष्ट रूप से HTTP कार्यान्वयन के लिए अतिरिक्त ओवरहेड विशिष्ट है। मैं टीसीपी ऑफ़लोड के साथ एक पीसीआई-एक्सप्रेस x4 इंटेल प्रो/1000 ड्यूल-पोर्ट गीग एनआईसी का उपयोग कर रहा हूं, लेकिन यह भी प्रासंगिक नहीं है क्योंकि मैं जो परीक्षण चला रहा हूं वह लूपबैक इंटरफेस पर है। – anelson

+0

मुझे यह अजीब लगता है कि आप HTTP के साथ फंस जाएंगे, टीएफटीपी की तरह कुछ बेहतर होगा। कुछ कमांड लाइन HTTP कार्यान्वयन के साथ प्रयोग करने के बारे में, उदाहरण के लिए। कर्ल प्लस सी में कुछ मामूली HTTP सर्वर? आप जो कह रहे हैं उससे यह स्पष्ट लगता है कि यह एक सॉफ्टवेयर सीमा है, इसलिए कुछ अन्य कार्यान्वयन का प्रयास करें। आप शायद एक सर्वर चाहते हैं जो फ़ाइलों को mmaps? – Andreas