将文件从一个位置复制到另一个位置时,最常用的资源是设备上的内存(缓冲区)和 I/O。但是,当使用 Robocopy 等多线程复制实用程序时,如果指定大量线程,性能可能会得到增强。
我的问题是:为什么多线程会显著增加大量文件的复制处理时间?无论如何,CPU 不需要做太多工作。谢谢。
答案1
每个文件肯定有一些握手开销(尤其是在复制到网络共享时),当您使用多线程复制许多小文件时,这些开销会减少,因为您会同时进行握手。我怀疑大文件的优势会更小。这个基准似乎支持这个假设: https://www.demartek.com/Reports_Free/RMWTUG_2011-03_Robocopy_multithread_Testing_Dennis_Martin_a.pdf
握手开销的示例可能是检查目标文件是否已存在,检查权限,......
答案2
即使在本地磁盘上,每个文件也有一些开销,我认为这主要是由于打开文件的开销:要打开现有文件,Windows 必须解析路径,在目录树的每一级中找到相应的条目,在 MFT 中查找文件,并检查 ACL。要创建新文件,Windows 必须解析路径,在目录树的每一级中找到相应的条目,检查目录 ACL,并将文件添加到 MFT 和顶级目录条目。
如果只有一个线程,则必须打开源文件、打开目标文件、复制数据并关闭文件,然后才能继续下一个线程。这意味着让 I/O 子系统部分时间处于空闲状态。如果有多个线程,则可以在复制数据的同时打开文件;理想情况下,让 I/O 系统一直处于忙碌状态。
对于单个文件来说,开销并不是那么明显,但是如果您有很多小文件,那么开销加起来就会很可观,节省的时间就很可观。
答案3
当使用单线程时,会出现以下模式:
1: read - write - read - write ..
因此,您使用 50% 的时间从源磁盘读取,使用 50% 的时间写入目标磁盘。
假设您有两个磁盘,您可以使用两个线程和这种模式:
1: read - write - read - write ..
2: read - write - read - write ...
因此交错请求并使两个磁盘的利用率达到 100%