Anm*_*ggi 6 networking performance hard-drive web-server multi-threading
许多下载管理器(例如this、this和this)支持通过多个并行连接(每个线程一个)下载文件。其概念是每个连接将单独下载文件的一部分。
例如,如果有 5 个连接,则第一个连接将下载文件的前 0-20% 部分,第二个连接将下载文件的 20-40% 部分,依此类推。
同样,在服务器端,将有 5 个线程,其中一个线程将并行读取文件的 20%。
但是,我认为尝试使用多个线程同时读取单个文件实际上会使下载速度明显变慢,因为机械磁盘的读取磁头将不得不比以前进行更多的搜索。
即使我们假设磁盘控制器排队机制足够智能,可以在一次顺序读取中将所有 5 个多部分请求一起批处理到单个文件,但与仅在一个线程中执行读取然后为该文件提供服务相比,它并没有给我们带来任何优势。仅通过 1 个 http 连接即可文件。
那么如何才能更快地并行下载文件呢?
我的理解是,并行下载不同文件部分仅在瓶颈是网络连接时才有用:要么是您下载的服务器的上传带宽,要么是服务器和您之间的网络带宽。当这些链路饱和时,可用带宽将在连接之间分配,并且在某些情况下可以在连接之间平均分配。因此,如果您有 5 个打开的连接,那么您将获得比只有一个连接更大的带宽份额。
当然,如果服务器和网络以更巧妙的方式共享带宽,例如通过在客户端 IP 之间而不是连接之间分配共享,则这不起作用。
当瓶颈是服务器或客户端上的磁盘 IO 时,这种策略确实没有帮助,甚至可能会损害性能,因为读取和写入的顺序性会较差。另外,当瓶颈是 ISP 和调制解调器之间的可用带宽时(我认为这可能是最常见的情况),那么并行下载既不会有坏处,也不会有所帮助。