为什么多线程下载比单线程下载快?


13

我的服务器中有一个大文件。我发现多线程下载可以达到20Mbs,但是单线程可以达到10Mbps,有人可以解释吗?


多个线程服务于同一个TCP连接,还是多个线程各自具有独立的TCP连接?您还说服务器是多线程的,还是客户端是多线程的,或两者都有?
2011年

Answers:


14

通常这是因为在您与另一台服务器之间的某个地方存在防火墙,将每个HTTP流限制为10Mbps。使用多线程时,您将获得2x 10Mb(每个线程一个)。


1
我使用FTP,服务器上没有限制
为什么

@为什么:也许是您的ISP将每个连接的最大速率限制为10mbps?您可以在速度测试仪中获得更多的收益吗?
安德烈Paramés

4

这是由于您与服务器之间的ping操作以及下载软件使用的数据包大小/ tcpip窗口大小。

基本上,如果您对服务器执行100ms ping操作,并请求100kb的数据包,则即使您的Internet速度是无限的,您也只能使用1个连接每秒获得10个数据包。


只要接收方以合理的速率清空其缓冲区,发送方就应该能够连续地对其进行抽水,因此您无需ACK每个数据包。
2011年

那就对了。但是即使有256kb的缓冲区,ping仍然会导致大量的速度降低
BarsMonster 2011年

3

当您“保持管道满载”时,TCP效果最好—当发送应用程序保持足够快的速度发送缓冲区,以使发送方TCP堆栈不断获得数据时,以便它始终可以在网络上“传输”数据,并且当接收方应用程序保持从接收方TCP堆栈读取数据的速度足够快,以至于接收方TCP窗口永远不会被填满(再次,因此发送方TCP堆栈可以始终使网络上的数据处于“传输中”状态)。

我可以想象一个编写不佳的单线程发送器应用程序,该应用程序将一个缓冲区传递给TCP堆栈,等待它被完全唤醒,然后再传递另一个缓冲区。这意味着,一旦第一个缓冲区的末端在网络上处于“运行中”状态,发送TCP协议栈就会饿死以发送数据,这意味着管道耗尽了,直到Ack回来并且发送应用程序之后才重新填充向其传递一个新的缓冲区。

我还可以想象一个编写不佳的单线程接收器应用程序,它不能足够快地从接收方TCP堆栈中读取数据,从而使TCP堆栈的缓冲区被填满,这意味着TCP窗口被填满,从而导致发送方TCP堆栈停止发送直到窗口打开一些。增大接收器的TCP窗口大小可能会有所帮助,但是为此,真正的解决方案是更快地读取数据。


那么,它可能与单线程无关?
Ape-in​​ago

@ Ape-in​​ago当然,一个编写良好的单线程应用程序可以使管道保持满满,是的。
2011年

2

好吧,这可能是因为您只能通过一个连接传输这么多数据。但是,在多线程程序中,可以有两个连接同时接收数据,并使获得的信息量增加一倍。这有一些限制,例如您要从中下载服务器的速度...编写两个多线程下载器的人简直就是帽子,这两个都不容易编写。


1
为什么这么难?您只需要为每个线程分配一个单独的部分,然后将其写入结果文件的相应部分即可。对我来说,的来源似乎很简单。
2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.