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