मल्टी थ्रेड सिंगल थ्रेड से अधिक तेजी से क्यों डाउनलोड हो रहा है?


13

मेरे सर्वर में एक बड़ी फ़ाइल है। मुझे लगता है कि मल्टी थ्रेड डाउनलोड को 20Mbs मिल सकते हैं, लेकिन सिंगल थ्रेड को 10Mbps मिल सकता है, क्या कोई इसे समझा सकता है?


एक ही टीसीपी कनेक्शन, या अलग-अलग टीसीपी कनेक्शन के साथ एक-एक धागे के साथ कई धागे? क्या आप यह कह रहे हैं कि सर्वर को मल्टीथ्रेडेड किया गया है, या क्लाइंट को मल्टीथ्रेड किया गया है, या दोनों को?
आकर्षक बनाएं

जवाबों:


14

आमतौर पर इसका कारण यह है कि आपके और अन्य सर्वर के बीच कहीं एक फ़ायरवॉल है जो प्रत्येक HTTP स्ट्रीम को 10Mbps तक सीमित करता है। जब आप मल्टी-थ्रेड का उपयोग करते हैं, तो आपको 2x 10Mb (प्रत्येक थ्रेड के लिए एक) मिलता है।


1
मैं FTP का उपयोग करता हूं और मेरे सर्वर पर कोई सीमित नहीं है
क्यों

@ क्यों: शायद यह आपका आईएसपी है जो प्रत्येक कनेक्शन को 10mbps पर कैप कर रहा है? क्या आप स्पीड टेस्टर में इससे अधिक प्राप्त कर सकते हैं?
आंद्रे परमेस 24/11

4

यह आपके और सर्वर और पैकेट आकार / tcpip विंडो आकार के बीच आपके पिंग के कारण होता है जिसका उपयोग आपके डाउनलोडिंग सॉफ्टवेयर द्वारा किया जाता है।

मूल रूप से, यदि आपके पास सर्वर पर 100ms पिंग है, और 100kb के पैकेट का अनुरोध करते हैं, तो आप 1 कनेक्शन का उपयोग करके केवल 10 पैकेट प्रति सेकंड प्राप्त कर सकते हैं, भले ही आपकी इंटरनेट की गति अनंत हो।


आपको प्रत्येक पैकेट को ACK करने की आवश्यकता नहीं है, जब तक कि रिसीवर अपने बफर को उचित दर पर खाली कर रहा है, प्रेषक को उन्हें लगातार पंप करने में सक्षम होना चाहिए।
आंद्रे परमेस

ये सही है। लेकिन 256kb बफर के साथ, पिंग अभी भी बड़े पैमाने पर मंदी का कारण बनता है
BarsMonster

3

जब आप "पाइप को पूर्ण रखते हैं" तो टीसीपी सबसे अच्छा काम करता है - जब भेजने वाला ऐप बफ़र्स को तेज़ी से भेजता रहता है तो भेजने वाले को टीसीपी स्टैक लगातार डेटा के साथ दिया जाता है ताकि यह नेटवर्क पर हमेशा "फ्लाइट में डेटा" रख सके, और जब रिसीवर एप्लिकेशन काफी तेजी से रिसीवर टीसीपी स्टैक से पढ़ता रहता है कि रिसीवर टीसीपी विंडो कभी भी भरता नहीं है (फिर, इसलिए टीसीपी स्टैक हमेशा नेटवर्क पर "फ्लाइट में डेटा" रख सकता है)।

मैं एक खराब लिखित एकल-थ्रेडेड प्रेषक ऐप की कल्पना कर सकता हूं जो एक बफर को टीसीपी स्टैक से गुजरता है, यह सुनने के लिए इंतजार करता है कि यह पूरी तरह से एकेड है, और फिर एक और बफर पास करता है। इसका मतलब है कि नेटवर्क पर एक बार पहले बफर का अंत "फ्लाइट" में होता है, भेजने के लिए टीसीपी स्टैक को डेटा के लिए भूखा रखा जाता है, जिसका अर्थ है कि पाइप नालियों में बदल जाता है और जब तक एक वापस नहीं आता है और ऐप नहीं भेजता है यह एक नया बफर गुजरता है।

मैं एक खराब लिखित सिंगल-थ्रेडेड रिसीवर एप्लिकेशन की भी कल्पना कर सकता हूं जो प्राप्त टीसीपी स्टैक से तेजी से नहीं पढ़ता है और इस तरह टीसीपी स्टैक के बफ़र्स को भर देता है, जिसका मतलब है कि टीसीपी विंडो भर जाती है, जो टीसीपी स्टैक को भेजने का कारण बनता है। जब तक खिड़की खुल न जाए, तब तक भेजना बंद करें। रिसीवर की टीसीपी विंडो का आकार बढ़ाने से थोड़ी मदद मिल सकती है, लेकिन इस अंत में असली समाधान डेटा को तेजी से पढ़ना है।


तो, यह एकल पिरोया जा रहा है के साथ कुछ नहीं करना हो सकता है?
एप-इनोगो

@ एप-इनैगो ज़रूर, एक अच्छी तरह से लिखा एकल-थ्रेडेड ऐप पाइप को पूर्ण रख सकता है, हाँ।
आकर्षक बनाएं

2

ठीक है, यह शायद इसलिए है क्योंकि आप केवल एक कनेक्शन पर इतना डेटा स्थानांतरित कर सकते हैं। हालाँकि एक बहु-थ्रेडेड प्रोग्राम में आपके पास एक ही समय में डेटा प्राप्त करने वाले दो कनेक्शन हो सकते हैं और आपके द्वारा प्राप्त की जाने वाली जानकारी को दोगुना कर सकते हैं। उदाहरण के लिए सर्वर की गति से आप इसे डाउनलोड कर रहे हैं, इसके लिए कुछ सीमाएँ हैं ... दो बंदों ने जो भी मल्टी-थ्रेडेड डाउनलोडर लिखा है, उन्हें लिखना आसान नहीं है।


1
यह इतना कठिन क्यों हैं? आपको प्रत्येक थ्रेड के लिए एक अलग सेक्शन आवंटित करने की आवश्यकता है और इसे रिजल्ट फाइल के उपयुक्त सेक्शन में लिखने दें। एक्सल का स्रोत मुझे बहुत सीधा लगता है।
आंद्रे परमेस 24/11
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.