ทำไมการดาวน์โหลดหลายเธรดเร็วกว่าเธรดเดี่ยว?


13

มีไฟล์ขนาดใหญ่หนึ่งไฟล์ในเซิร์ฟเวอร์ของฉัน ฉันพบว่าการดาวน์โหลดหลายเธรดสามารถรับ 20Mbs แต่เธรดเดี่ยวสามารถรับ 10Mbps ได้ทุกคนสามารถอธิบายได้ไหม


มีหลายเธรดที่ให้บริการการเชื่อมต่อ TCP เดียวกันหรือหลายเธรดที่มีการเชื่อมต่อ TCP แยกกันหรือไม่ คุณกำลังพูดว่าเซิร์ฟเวอร์มัลติเธรดหรือไคลเอนต์ถูกมัลติเธรดหรือทั้งสองอย่าง?
Spiff

คำตอบ:


14

โดยทั่วไปนี่เป็นเพราะบางสิ่งระหว่างคุณและเซิร์ฟเวอร์อื่นมีไฟร์วอลล์ จำกัด สตรีม HTTP แต่ละรายการที่ 10Mbps เมื่อคุณใช้มัลติเธรดคุณจะได้รับ 2x 10Mb (สำหรับแต่ละเธรด)


1
ฉันใช้ FTP และไม่มีการ จำกัด บนเซิร์ฟเวอร์ของฉัน
ทำไม

@ ทำไม: อาจเป็น ISP ของคุณที่กำหนดแต่ละการเชื่อมต่อกับ 10mbps คุณจะได้มากกว่านั้นในเครื่องมือทดสอบความเร็วหรือไม่?
AndréParamés

4

นี่เป็นเพราะการ ping ของคุณระหว่างคุณกับเซิร์ฟเวอร์และขนาดหน้าต่างแพ็กเก็ต / ขนาด tcpip ที่ใช้โดยซอฟต์แวร์ดาวน์โหลดของคุณ

โดยทั่วไปถ้าคุณมี 100 ping ไปที่เซิร์ฟเวอร์และขอแพ็กเก็ตที่ 100kb คุณจะได้รับ 10 แพ็กเก็ตต่อวินาทีโดยใช้การเชื่อมต่อ 1 ครั้งแม้ว่าความเร็วอินเทอร์เน็ตของคุณจะไม่สิ้นสุด


คุณไม่จำเป็นต้อง ACK แต่ละแพ็คเก็ตตราบใดที่ผู้รับกำลังล้างบัฟเฟอร์ในอัตราที่เหมาะสมผู้ส่งควรจะสามารถสูบมันได้อย่างต่อเนื่อง
AndréParamés

ถูกตัอง. แต่ถึงแม้จะมีบัฟเฟอร์ 256kb แต่ ping ก็ยังทำให้เกิดการชะลอตัวครั้งใหญ่
BarsMonster

3

TCP ทำงานได้ดีที่สุดเมื่อคุณ "ทำให้เต็มไพพ์" - เมื่อแอพส่งทำการส่งบัฟเฟอร์อย่างรวดเร็วพอที่จะทำให้ผู้ส่ง TCP สแต็คที่ให้ข้อมูลอยู่ตลอดเวลาเพื่อให้สามารถมีข้อมูล "ในการบิน" บนเครือข่ายและเมื่อผู้รับ แอปอ่านต่อจากตัวรับ TCP stack เร็วพอที่ตัวรับ TCP window จะไม่เติมเต็ม (อีกครั้งดังนั้นการส่ง TCP stack สามารถเก็บข้อมูล "ในการบิน" บนเครือข่ายได้เสมอ

ฉันนึกภาพแอพผู้ส่งเธรดเดียวที่เขียนไม่ดีซึ่งส่งผ่านบัฟเฟอร์หนึ่งไปยังสแต็ก TCP รอฟังว่ามันได้รับการตอบรับอย่างเต็มที่แล้วส่งผ่านบัฟเฟอร์อื่น ซึ่งหมายความว่าเมื่อสิ้นสุดบัฟเฟอร์แรกคือ "กำลังบิน" บนเครือข่ายการส่งสแต็ก TCP จะไม่ได้รับข้อมูลเพื่อส่งซึ่งหมายถึงไพพ์ท่อระบายน้ำและจะไม่ถูกเติมจนกว่าหลังจาก Ack มาและแอปส่ง ผ่านมันบัฟเฟอร์ใหม่

ฉันสามารถจินตนาการได้ว่าแอพตัวรับแบบเธรดเดี่ยวที่เขียนไม่ดีที่อ่านจากการรับ TCP สแต็กเร็วพอและทำให้บัฟเฟอร์ของสแต็ก TCP เติมเต็มซึ่งหมายความว่าหน้าต่าง TCP เต็มซึ่งทำให้ TCP สแต็กส่งไป หยุดส่งจนกว่าหน้าต่างจะเปิดขึ้นมา การเพิ่มขนาดหน้าต่าง TCP ของผู้รับอาจช่วยเล็กน้อย แต่ทางออกที่แท้จริงในตอนนี้คือการอ่านข้อมูลได้เร็วขึ้น


ดังนั้นอาจไม่มีอะไรเกี่ยวข้องกับการเป็นเธรดเดี่ยว?
Ape-inago

@ Ape-inago แน่นอนว่าแอพพลิเคชั่นแบบเธรดที่เขียนได้ดีอาจทำให้ท่อเต็มใช่
Spiff

2

อาจเป็นเพราะคุณสามารถถ่ายโอนข้อมูลได้มากผ่านการเชื่อมต่อเดียว อย่างไรก็ตามในโปรแกรมแบบมัลติเธรดคุณสามารถมีการเชื่อมต่อสองการรับข้อมูลในเวลาเดียวกันและเพิ่มปริมาณข้อมูลที่คุณสามารถรับได้เป็นสองเท่า มีข้อ จำกัด บางประการเกี่ยวกับเรื่องนี้เช่นความเร็วของเซิร์ฟเวอร์ที่คุณกำลังดาวน์โหลดจาก ... ปิดผู้ใดก็ตามที่เขียนตัวดาวน์โหลดแบบมัลติเธรดซึ่งไม่ง่ายต่อการเขียน


1
ทำไมมันยากจัง คุณเพียงแค่ต้องจัดสรรแต่ละส่วนสำหรับแต่ละเธรดและปล่อยให้มันเขียนในส่วนที่เหมาะสมของไฟล์ผลลัพธ์ ที่มาของแอ็กเซิลนั้นค่อนข้างตรงไปตรงมาสำหรับฉัน
AndréParamés
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.