我正在使用 robocopy 将大量文件(总计约 4TB 的 300,000 个文件)从一个 NAS 驱动器复制到另一个 NAS 驱动器。以下是示例命令:
robocopy \\nas1\myfolder \\nas2\myfolder /E /R:1 /W:5
我之前在各种文件夹和驱动器上执行过数百次此操作,没有任何问题。每次复制完一个文件后,它总是报告已复制 100%,然后再继续复制下一个文件。
但是,我突然收到报告称传输率低于 100% 的提示。通常为 98-99%,但有时低至 30%。见图:
robocopy 命令仍在运行(预计需要几个小时),所以我还无法确定复制文件的有效性或进行任何检查。
robocopy 在什么情况下会这样做?传输有问题吗?还是它报告了线程中的部分进度?
更新: 小文件 (< 1k) 往往受影响最严重,在许多情况下报告 < 50%。大文件 (> 10MB) 往往报告 98%+
答案1
我相信,如果目标卷的底层块大小与源卷不同,robocopy 将把文件视为不同的大小(即,几字节文件的磁盘大小可能是 4k NTFS,但在 NAS 上只有 1k)
这通常出现在人们从 NTFS 镜像到 NAS 时,但是我只看到关于比较阶段的评论而不是在复制过程中。
我认为您可以告诉 samba 使用特定的块大小,这样您就可以将目标配置为使用与源相同的块大小(如果它们尚不匹配)。
答案2
未经任何测试,推测会发生什么:
- 少于 100% 的文件可能已复制完毕,但正在等待稍后处理中的完整性测试(可能在 robocopy 即将完成时)
- 低于 100% 的文件可能失败了,正如你所说,5 秒后重试一次,所以网络故障可能会导致
- 它同时复制多个文件,并真正列出它已复制的部分文件
您可以尝试以下方法:
robocopy /J
:使用无缓冲 I/O 进行复制(推荐用于大文件)robocopy /NOOFFLOAD
:不使用 Windows复制卸载机制robocopy /z /MT 32 /Log+:<LogFile>
:- /z= 以可重启模式复制文件。在可重启模式下,如果文件复制中断,Robocopy 可以从中断处继续,而不是重新复制整个文件。
- /MT 32= 创建具有 n 个线程的多线程副本。n 必须是 1 到 128 之间的整数。n 的默认值为 8。为了获得更好的性能,请使用 /log 选项重定向输出。
- /日志= 创建一个日志文件,有助于跟进任何失败的文件
我发现对调查此问题有帮助的链接:
- https://ss64.com/nt/robocopy.html | https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/robocopy
- https://docs.microsoft.com/en-us/azure/databox/data-box-deploy-copy-data
- https://techcommunity.microsoft.com/t5/ask-the-performance-team/slow-large-file-copy-issues/ba-p/372377
- https://social.technet.microsoft.com/wiki/contents/articles/1073.robocopy-and-a-few-examples.aspx