为什么多线程文件传输可以提高性能?

时间:2009-11-25 14:04:55

标签: performance multithreading hardware

RichCopy ,一种比微软更好的robocopy-with-GUI工具,似乎是当前复制文件的首选工具。 TechNet article presenting the tool中突出显示的一个主要功能是并行复制多个文件。在默认设置中,同时复制三个文件,您可以在GUI中很好地看到:[进度:文件A的xx%,文件B的yy%,...]。有很多blog entries赞美这个工具并声称这可以加速复制过程。

我的问题是:为什么这种技术可以提高性能?据我所知,在现代计算机系统上复制文件时,硬盘是瓶颈,而不是CPU或网络。我的假设是,一次复制多个文件会使整个过程更慢,因为HDD需要在不同文件之间来回跳转,而不是仅按顺序传输一个文件。由于RichCopy 更快,我的假设中肯定会出现一些错误......

6 个答案:

答案 0 :(得分:9)

该工具正在改进硬件使用,可以更好地优化多个读写请求。

当一次复制一个文件时,硬件不会知道当前正在读头(或附近)传递的数据块将需要一个后续读取,因为软件尚未排队请求。

现代单个文件复制对于现代磁盘子系统来说并不是一项非常繁重的任务。通过为这些硬件系统提供更多工作,该工具可以利用其改进的优化功能。

答案 1 :(得分:5)

一个天真的“复制多个文件”应用程序将复制一个文件,然后在复制下一个文件之前等待它完成。

这意味着单个文件的复制速度不能超过网络延迟,即使它是空的(0字节)。因为它可能会进行多次文件服务器调用(打开,写入,关闭),这可能是几个延迟。

要有效地复制文件,您希望拥有一个使用具有流水线技术的理智协议的服务器和客户端;也就是说 - 客户端不会在发送下一个文件之前等待保存第一个文件,实际上,几个或多个文件可能同时“在网上”。

当然要做到这一点需要自定义服务器而不是SMB(或类似)文件服务器。例如,rsync执行此操作,并且非常擅长复制大量文件,尽管是单线程的。

所以我的猜测是多线程有帮助,因为它是一个解决方案,因为服务器不支持在单个会话上进行流水线操作。

在我看来,使用合理协议的单线程实现最好。

答案 2 :(得分:2)

这是一个网络工具,因此瓶颈是网络,而不是硬盘。通过并行使用几个连接,您可以从(低)点获得TCP链路的更多吞吐量。这(a)使TCP握手并行化; (b)如果带宽较高,可以更好地利用带宽延迟产品; (c)如果出于某种原因遇到高RTT或失败率,则不会使关键路径的任意连接速度变慢。

另一种方法(b)是使用巨大的TCP套接字接收缓冲区,但这并不总是方便。

关于HDD的其他几个答案都是错误的。实际上任何硬盘驱动器都会在顺序访问的假设下进行一些预读,任何智能操作系统缓存都会这样做。

答案 3 :(得分:1)

我的观点是,hdd读写磁头大部分时间都处于空闲状态,并等待磁盘的正确内存块到它们下面,复制的内存越多意味着空闲时间越少,大多数现代磁盘调度程序应该采用照顾跳跃(对于少量文件/片段)

答案 4 :(得分:1)

  

据我所知,在现代计算机系统上复制文件时,硬盘是瓶颈,而不是CPU或网络。

我认为这些假设过于简单化了。

首先,局域网以100Mb / 1Gbit运行。长途网络的最大数据速率低于最慢链路的最大速率。

其次,互联网上TCP / IP流的有效吞吐量通常由往返消息和确认所花费的时间决定。例如,我有一个8 + Mbit链接,但是当我从美国下载时,我的下载数据速率很少超过每秒1-2Mbits。因此,如果您可以并行运行多个流,则一个流可以等待确认,而另一个流正在泵送数据包。 (但如果你尝试发送太多,你就会开始出现拥堵,超时,退避和降低总体传输速率。)

最后,操作系统擅长与其他工作并行执行各种I / O任务。如果您并行下载2个或更多文件,则操作系统可能正在读取/处理网络数据包以进行一次下载并同时写入另一个文件。

答案 5 :(得分:1)

远距离,网络写入速度可能比读取速度快得多。使用多线程,拥有额外的“读者”意味着数据可以更有效地传输,而不会陷入缓冲区。