为什么 rsync 不对本地文件使用增量传输?

为什么 rsync 不对本地文件使用增量传输?

我有一个很大的 iso 映像,目前正在通过打开空间预留的 torrent 客户端下载:这意味着,文件大小不会改变,但其中的某些块(4 Mib)会因为下载而不断改变。

下载到 90% 时我进行了初始 rsync,以便节省稍后的时间:

$ rsync -Ph DVD.iso /media/another-hdd/
发送增量文件列表

DVD 镜像文件
       2.60G 100% 40.23MB/s 0:01:01(xfer#1,to-check=0/1)

发送 2.60G 字节 接收 73 字节 34.59M 字节/秒
总大小为 2.60G 加速比为 1.00

然后,当文件完全下载后,我再次 rsync:

total size is 2.60G   speedup is 1.00

Speedup=1 表示未使用增量传输,尽管 90% 的文件未发生改变,但目标目录位于另一个 FS 上,复制需要几分钟。为什么它不尝试加速传输?!我如何强制rsync使用增量传输?

答案1

根据手册页,psusi是正确的:

-W, --整个文件:如果源计算机和目标计算机之间的带宽高于磁盘带宽(尤其是当“磁盘”实际上是网络文件系统时),则使用此选项可能会加快传输速度。当源计算机和目标计算机均指定为本地路径时,这是默认设置,但前提是没有批量写入选项生效。

答案2

这个问题的直接答案是:

使用该--no-W标志强制进行增量压缩,无论是本地还是远程。

更新:看起来事情还远不止于此。似乎delta compression只在 rsync 的接收和传输过程之间启用。将文件输出到文件系统时,rsync即使启用了增量压缩,仍可能会写出整个文件。

参见“Wakan Tanka”的调查这里

更新 2:--inplace选项仅写入文件的已更改部分。但请注意,--sparse当使用目标文件时,它会与手册中建议的相冲突,并且不推荐使用。

答案3

默认情况下,出于各种安全原因,rsync 首先创建目标文件的新副本,然后替换它。您可以通过指定 来覆盖此设置--inplace--no-whole-file这会告诉 rsync 对目标文件进行就地编辑,并接受手册页中记录的各种风险(在这种情况下通常很小)。

答案4

默认情况下,rsync在目标位置创建文件的副本,然后自动用新副本替换原始文件。这样做是出于安全考虑。您要寻找的是仅修改目标文件中相对于源文件已更改的部分的--inplace选项。rsync

对于 OP 的用例,我建议也关闭预分配,这样可以同步稀疏副本,这样会快得多。对于下载,除非您使用的是像 VFAT 这样的非常古老的文件系统,否则不必担心碎片化。特别是媒体文件不会以存储介质的最大性能读取,因此对它们进行碎片整理是徒劳的。

要将下载目录稀疏地复制到目标卷,我建议按以下顺序使用这些标志和操作:

rsync --ignore-existing -vxaHAXS /source /destination
rsync --inplace -vxaHAX /source /destination

第一遍将稀疏地将新文件复制到目标位置,第二遍将就地更新现有文件,仅复制更改部分

由于它执行的是稀疏和就地增量复制,因此您可以重复运行此操作而不会产生太多额外 IO。即使您同时运行 20 个 torrent,它也不会放大目标处的写入,也不会破坏源/目标卷。

相关内容