Robocopy 有一个/J
命令行选项,推荐用于复制大文件(它使用无缓冲 I/O 进行复制)。
有什么缺点(如果有的话)?有什么原因没有默认启用此功能?(这就是我认为可能存在缺点的原因。)
答案1
好问题。
无缓冲 I/O 是从源位置到目标位置的简单文件复制。缓冲 I/O 通过将文件复制到目标位置来增强简单复制,以优化将来对同一文件的读取(和写入)文件系统缓存,这是虚拟内存的一个区域。缓冲 I/O 在第一次访问文件时会导致性能下降,因为它必须将文件复制到内存中;但是,由于内存访问比磁盘访问快,因此后续文件访问应该更快。操作系统负责将文件写入同步回磁盘,读取可以直接从内存中提取。
使用说明中提到大文件与缓冲 I/O 的关系,因为:
- 前期成本很昂贵。对于大文件来说,缓冲 I/O 的性能损失要严重得多。
- 你得到的回报却很少。无论如何,大文件块不会在缓存中停留很长时间,除非您拥有相对于文件大小的大量内存。
- 它可能无法避免磁盘 I/O。大型文件数据块的读写增加了需要磁盘 I/O 的概率。
- 无论如何,您可能不需要缓冲。实际上,大文件的访问频率往往比小文件的访问频率要低。
因此,这其中存在着一种权衡,但哪种方式适合您取决于您的具体情况。如果您要压缩一堆文件并将压缩文件传输到备份目标,则非缓冲方式是最佳选择。复制一堆刚刚更改的文件?缓冲方式应该更快。
最后,请注意,文件大小并不是决定缓冲和非缓冲的唯一因素。与任何缓存一样,文件系统缓存比其背后的源更快但更小。它需要缓存替换策略它控制何时驱逐项目以腾出空间给新项目。当频繁访问的项目被驱逐时,它就失去了优势。例如,如果您在盘中将用户主目录同步到单独的位置(即,当用户正在积极使用文件时),缓冲 I/O 将受益于已驻留在缓存中的文件,但可能会暂时用陈旧的文件污染缓存;另一方面,非缓冲将放弃已缓存文件的任何好处。在这种情况下没有明显的赢家。
注意:这也适用于xcopy /J
参见微软询问绩效团队博客了解更多信息。
答案2
如果您通过 WAN 进行复制,我建议不要为大文件启用 /J 选项,因为这样您的平均复制时间会显著增加。我复制的文件大小从 500MB 到 23GB 不等。
在 50Mbps 的线路上,我的平均速度为 43.5Mbps(其他流量和开销),而没有 /J 时从未低于 32Mbps。使用 /J 时,我的平均速度约为 25Mbps...查看 perfmon,我可以看到底部有大的峰值和谷值。
希望这对某人有帮助。
答案3
我尝试了以下操作:
当您从快速设备(通过千兆以太网的 NAS)复制到另一个快速设备(USB3 磁盘)时
- 没有 /J:数据被读入缓冲区,然后写入,因此网络或硬盘处于空闲状态
- 使用/J:无需等待即可读取和写入数据,因此网络和硬盘同时使用
我建议使用此选项。