มีไฟล์ขนาดใหญ่หนึ่งไฟล์ในเซิร์ฟเวอร์ของฉัน ฉันพบว่าการดาวน์โหลดหลายเธรดสามารถรับ 20Mbs แต่เธรดเดี่ยวสามารถรับ 10Mbps ได้ทุกคนสามารถอธิบายได้ไหม
มีไฟล์ขนาดใหญ่หนึ่งไฟล์ในเซิร์ฟเวอร์ของฉัน ฉันพบว่าการดาวน์โหลดหลายเธรดสามารถรับ 20Mbs แต่เธรดเดี่ยวสามารถรับ 10Mbps ได้ทุกคนสามารถอธิบายได้ไหม
คำตอบ:
โดยทั่วไปนี่เป็นเพราะบางสิ่งระหว่างคุณและเซิร์ฟเวอร์อื่นมีไฟร์วอลล์ จำกัด สตรีม HTTP แต่ละรายการที่ 10Mbps เมื่อคุณใช้มัลติเธรดคุณจะได้รับ 2x 10Mb (สำหรับแต่ละเธรด)
นี่เป็นเพราะการ ping ของคุณระหว่างคุณกับเซิร์ฟเวอร์และขนาดหน้าต่างแพ็กเก็ต / ขนาด tcpip ที่ใช้โดยซอฟต์แวร์ดาวน์โหลดของคุณ
โดยทั่วไปถ้าคุณมี 100 ping ไปที่เซิร์ฟเวอร์และขอแพ็กเก็ตที่ 100kb คุณจะได้รับ 10 แพ็กเก็ตต่อวินาทีโดยใช้การเชื่อมต่อ 1 ครั้งแม้ว่าความเร็วอินเทอร์เน็ตของคุณจะไม่สิ้นสุด
TCP ทำงานได้ดีที่สุดเมื่อคุณ "ทำให้เต็มไพพ์" - เมื่อแอพส่งทำการส่งบัฟเฟอร์อย่างรวดเร็วพอที่จะทำให้ผู้ส่ง TCP สแต็คที่ให้ข้อมูลอยู่ตลอดเวลาเพื่อให้สามารถมีข้อมูล "ในการบิน" บนเครือข่ายและเมื่อผู้รับ แอปอ่านต่อจากตัวรับ TCP stack เร็วพอที่ตัวรับ TCP window จะไม่เติมเต็ม (อีกครั้งดังนั้นการส่ง TCP stack สามารถเก็บข้อมูล "ในการบิน" บนเครือข่ายได้เสมอ
ฉันนึกภาพแอพผู้ส่งเธรดเดียวที่เขียนไม่ดีซึ่งส่งผ่านบัฟเฟอร์หนึ่งไปยังสแต็ก TCP รอฟังว่ามันได้รับการตอบรับอย่างเต็มที่แล้วส่งผ่านบัฟเฟอร์อื่น ซึ่งหมายความว่าเมื่อสิ้นสุดบัฟเฟอร์แรกคือ "กำลังบิน" บนเครือข่ายการส่งสแต็ก TCP จะไม่ได้รับข้อมูลเพื่อส่งซึ่งหมายถึงไพพ์ท่อระบายน้ำและจะไม่ถูกเติมจนกว่าหลังจาก Ack มาและแอปส่ง ผ่านมันบัฟเฟอร์ใหม่
ฉันสามารถจินตนาการได้ว่าแอพตัวรับแบบเธรดเดี่ยวที่เขียนไม่ดีที่อ่านจากการรับ TCP สแต็กเร็วพอและทำให้บัฟเฟอร์ของสแต็ก TCP เติมเต็มซึ่งหมายความว่าหน้าต่าง TCP เต็มซึ่งทำให้ TCP สแต็กส่งไป หยุดส่งจนกว่าหน้าต่างจะเปิดขึ้นมา การเพิ่มขนาดหน้าต่าง TCP ของผู้รับอาจช่วยเล็กน้อย แต่ทางออกที่แท้จริงในตอนนี้คือการอ่านข้อมูลได้เร็วขึ้น
อาจเป็นเพราะคุณสามารถถ่ายโอนข้อมูลได้มากผ่านการเชื่อมต่อเดียว อย่างไรก็ตามในโปรแกรมแบบมัลติเธรดคุณสามารถมีการเชื่อมต่อสองการรับข้อมูลในเวลาเดียวกันและเพิ่มปริมาณข้อมูลที่คุณสามารถรับได้เป็นสองเท่า มีข้อ จำกัด บางประการเกี่ยวกับเรื่องนี้เช่นความเร็วของเซิร์ฟเวอร์ที่คุณกำลังดาวน์โหลดจาก ... ปิดผู้ใดก็ตามที่เขียนตัวดาวน์โหลดแบบมัลติเธรดซึ่งไม่ง่ายต่อการเขียน