Linux:rsync 将镜像 SMB 挂载到本地磁盘非常慢

Linux:rsync 将镜像 SMB 挂载到本地磁盘非常慢

我尝试将通过 SMB 安装的共享镜像到本地目录。该共享托管在 Windows 2016 服务器上,我无法访问该服务器,也无法安装任何工具。因此,我只有一个 SMB 共享。

该共享包含大约 350GB 的数据,大部分是小文件(4MB)。每天晚上rsync都会运行一个作业并将所有更新传输到本地目录。这需要很长时间才能完成。发送增量文件列表大约需要 10 到 15 分钟(我需要验证这一点),但随后 rsync 需要传输几 MB(每晚大约更改 20 个文件),耗时长达 12 小时。

也许我对工作原理有误解rsync。但我的印象是,收到增量文件列表后,rsync能够确定需要传输哪些文件。所以剩下的就是选择更改的文件并传输它们,这应该不会超过几分钟,最多一个小时。

通过安装 SMB 共享选项,我能够将传输时间从 12 小时缩短到 9 小时actimeo=600。但仍然比预期的要长得多。

因此这是安装(在 Synology NAS 上):

mount -t cifs //remote.server/share /volume1/sysadmin/share -o vers=3.0,username=john,password='***',domain=EXAMPLE,ro,soft,uid=1026,forceuid,gid=100,forcegid,addr=remote.server,file_mode=0777,dir_mode=0777,iocharset=utf8,nocase,cache=none,noserverino,actimeo=600

这是 rsync 作业:

rsyncOptions=(
    --delete
    --human-readable
    --itemize-changes
    "--modify-window=1"
    --partial
    --protect-args
    --recursive
    --stats
    --times
    --verbose
)
rsyncExclusions=(
    --exclude=.DS_Store
    --exclude=.Trash
    --exclude=.TemporaryItems
    --exclude=._*
    --exclude=.AppleDB
    --exclude=.AppleDouble
    --exclude=__MACOSX
    --exclude=.AppleDesktop
    --exclude=.~lock*
    --exclude=.fseventsd
    --exclude=.lock
    --exclude=.afpDeleted*
    --exclude=.smbdelete*
    --exclude=.TEMP_*
    --exclude=@eaDir
    --exclude=Thumbs.db
    --exclude='* '
    --exclude='*.'
)
/usr/bin/rsync "${rsyncOptions[@]}" "${rsyncExclusions[@]}" "/volume1/sysadmin/share/" "/volume1/share/

以下是上次同步的统计数据:

Number of files: 571170
Number of files transferred: 279
Total file size: 351.95G bytes
Total transferred file size: 387.34M bytes
Literal data: 387.34M bytes
Matched data: 0 bytes
File list size: 25.95M
File list generation time: 0.526 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 413.57M
Total bytes received: 223.89K

sent 413.57M bytes  received 223.89K bytes  13.11K bytes/sec
total size is 351.95G  speedup is 850.56

我该如何加快传输速度?也许其他类似的工具lftp更适合实现这一点...任何指点都值得赞赏。

更新 1

  • lftpmirror --dry-run --no-perms --exclude-glob="*." --exclude-glob="* " --parallel --only-newer选项的也需要大约 9 到 12 小时才能完成。所以这不是替代方案。

  • 在 GUI 中或通过cp4.7MB 文件进行简单复制大约需要 2-3 秒才能完成。

  • rsync--dry-run选项开始。一旦得到结果,我将立即更新此帖子。

更新2

  • rsyncwith--dry-run现在已经运行了 6 个多小时。我猜可以肯定它会运行 9 个多小时。日志中唯一的条目是sending incremental file list。今天是这里的公共假期(因此不会更改文件/目录),所以我不确定完成此部分过程需要多长时间。

更新 3

启用更多日志记录后结果如下所示:

2019/10/04 04:00:03 [20771] building file list
2019/10/04 05:42:16 [20771] .d..t...... dir1/
2019/10/04 05:42:17 [20771] >f+++++++++ dir1/file1
2019/10/04 05:42:44 [20771] .d..t...... dir1/subdir1/
2019/10/04 05:42:44 [20771] >f.st...... dir1/subdir1/file1
2019/10/04 05:43:19 [20771] >f..t...... dir1/subdir1/file2
2019/10/04 05:43:20 [20771] >f.st...... dir1/subdir1/file3
2019/10/04 05:43:20 [20771] .d..t...... dir1/subdir2/
2019/10/04 05:43:21 [20771] >f+++++++++ dir1/subdir2/file1
2019/10/04 10:16:38 [20771] .d..t...... dir2/subdir1/

...

请注意 dir1 和 dir2 之间的巨大时间差距,要么rsync需要大量时间来遍历目录树,要么发生了其他事情。

答案1

我认为解决问题的唯一方法是在两端都运行守护进程。由于我不想在远程 Windows Server(不受我控制)上安装 Cygwin 或 WSL,因此我最终使用了 Unison,到目前为止,它运行良好。同步现在需要 10-15 分钟。因此,将 Unison 与 SSH 一起使用,我从 GitHub 上的 PowerShell 存储库下载了 SSH 二进制文件。因此,我有两个二进制文件/便携式应用程序,我可以直接将它们放在服务器上并使其正常运行。使用 Unison 时,请确保使用相同版本的 Unison 和 OCAML。

相关内容