运行 Rsync 时文件比较速度非常慢

运行 Rsync 时文件比较速度非常慢

在某种情况下,rsync 速度出现了问题。

我使用 WSL 2 将文件从 SSD 磁盘同步到 Windows 上 HDD 上的 exFAT VeraCrypt 容器(整个 HDD 都用 VeraCrypt 加密,加密容器以 exFAT 格式化)。有快速的 CPU 和磁盘,速度 >50 MB/s。

同步

rsync 报告总共有 17158 个文件 + 2431 个目录,总大小为 2 GB。应该传输了 78 个文件,大小为 40 MB。

  1. 试运行:11 分 45 秒

    wsl rsync -rtvih --progress --stats --delete %SRC% '%DEST%' --modify-window=2  --filter 'merge ./.rsync-filter-work' -n
    
  2. 实际运行: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
    

为了比较

  1. 另一个 Windows 工具比较了这些文件夹0 分 50 秒!它无需任何过滤器即可运行,因此它检查了 201k 个文件和 60k 个文件夹。速度快了 12 倍以上。发送文件最多只需几秒钟。

  2. 我还使用以下方法将相同的文件发送到远程 Linux 机器:

    rsync -rtvih --progress --stats --delete --compress -e %SSH% %SRC% '%USER%'@%HOST%:'%DEST%' --filter 'merge ./.rsync-filter-work' -n
    

并且此试运行仅需要1 分 30 秒

  1. 如果我从步骤 (1) 试运行到同一 VeraCrypt 驱动器上不存在的文件夹,它运行得非常快。因此一定有什么东西减慢了读取目标文件列表的速度。

  2. wsl find . -iname xyz跑进2分 0秒,所以 wsl2 可能不是罪魁祸首。

问题

  1. 有什么可以提高我的 rsync 命令的性能吗?
  2. 在步骤 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运行速度现在快多了 ;)。

相关内容