在某种情况下,rsync 速度出现了问题。
我使用 WSL 2 将文件从 SSD 磁盘同步到 Windows 上 HDD 上的 exFAT VeraCrypt 容器(整个 HDD 都用 VeraCrypt 加密,加密容器以 exFAT 格式化)。有快速的 CPU 和磁盘,速度 >50 MB/s。
同步
rsync 报告总共有 17158 个文件 + 2431 个目录,总大小为 2 GB。应该传输了 78 个文件,大小为 40 MB。
试运行:11 分 45 秒
wsl rsync -rtvih --progress --stats --delete %SRC% '%DEST%' --modify-window=2 --filter 'merge ./.rsync-filter-work' -n
实际运行:13 分 16 秒(文件列表创建仅用了 1 分 50 秒)
wsl rsync -rtvih --progress --stats --delete %SRC% '%DEST%' --modify-window=2 --filter 'merge ./.rsync-filter-work' --info=progress2 --no-inc-recursive
为了比较
另一个 Windows 工具比较了这些文件夹0 分 50 秒!它无需任何过滤器即可运行,因此它检查了 201k 个文件和 60k 个文件夹。速度快了 12 倍以上。发送文件最多只需几秒钟。
我还使用以下方法将相同的文件发送到远程 Linux 机器:
rsync -rtvih --progress --stats --delete --compress -e %SSH% %SRC% '%USER%'@%HOST%:'%DEST%' --filter 'merge ./.rsync-filter-work' -n
并且此试运行仅需要1 分 30 秒。
如果我从步骤 (1) 试运行到同一 VeraCrypt 驱动器上不存在的文件夹,它运行得非常快。因此一定有什么东西减慢了读取目标文件列表的速度。
wsl find . -iname xyz
跑进2分 0秒,所以 wsl2 可能不是罪魁祸首。
问题
- 有什么可以提高我的 rsync 命令的性能吗?
- 在步骤 1 和步骤 2 中,什么原因导致本地文件夹比较速度变慢?
答案1
这里稍微猜测一下,但基于这个说法……
另一个 Windows 工具在 0 分 50 秒内比较了这些文件夹!
...听起来源目录可能是 Windows 文件夹(例如/mnt/c/...
,等等)?
如果是这样的话,那么请注意,WSL2 在访问 Windows 驱动器时速度特别慢。请参阅我的答案在这里了解更多详细信息,但作为与该答案的比较:
我见过一个
git clone
大型 repo(WSL2 Linux 内核 Github)在 Windows 驱动器上的 WSL2 上花费 8 分钟,但在根文件系统上仅花费几秒钟。
据我所知,读取小文件时问题更加严重,尽管我不记得对大文件进行过任何基准测试。
另外,您提到:
如果我从步骤 (1) 试运行到同一 VeraCrypt 驱动器上不存在的文件夹,它运行得非常快。因此一定有什么东西减慢了读取目标文件列表的速度。
我对此有一个理论,但我还没有机会去测试。当同步到现有目录时,rsync
将自动使用其“增量传输算法”仅发送更改的部分。这涉及到上面的“小文件读取/写入”问题。
您可以尝试使用该--whole-file
选项来禁用增量传输。
但最好的解决方案(假设这是您的问题)可能是在访问 Windows 驱动器上的文件时使用 WSL1,假设您可以从中访问 VeraCrypt 容器。
出于这个原因,我实际上让一个发行版在 WSL1 主上运行——对我来说,问题是运行一个非常大的s3sync
,并且 WSL1 上的性能在 WSL1 上要快几个数量级。
答案2
在我的案例中,WSL 访问已挂载硬盘的速度慢的问题是一个包含 21000 个文件(没有子文件夹)的文件夹。
time ls -lR
测量时间为 2 到 3 分钟 - 仅列出该文件夹的内容。
当我将这些文件移动到每个包含最多 7000 个文件的子文件夹中时,time
仅用了 15 秒,而且rsync
运行速度现在快多了 ;)。