8

我有一些需要每天同步的 VM 映像。VM 文件是稀疏的。

为了节省网络流量,我只想传输图像的真实数据。我在 rsync 使用 --sparse 选项尝试它,但在网络流量上,我看到整个大小都通过网络传输,而不仅仅是真实的数据使用。

如果我使用 rsync -zv --sparse 则只有真实大小通过网络传输,一切正常。但由于 cpu 使用率,我不想压缩文件。

--sparse 选项不应该只传输真实数据,并且在本地创建“空数据”以节省网络流量吗?

有没有不压缩的解决方法?

谢谢!

4

3 回答 3

11

看看这个讨论,具体来说,这个答案

似乎解决方案是执行 arsync --sparse后跟 a rsync --inplace

首先,--sparse调用,也用于--ignore-existing防止已经传输的稀疏文件被覆盖,并-z节省网络资源。

第二个调用--inplace应该只更新修改过的块。在这里,压缩是可选的。

另见这篇文章

更新

我相信上面的建议不会解决你的问题。我也认为这rsync不是完成任务的正确工具。您应该寻找其他可以在网络和磁盘 I/O 效率之间取得良好平衡的工具。

Rsync旨在有效利用单一资源,即网络。它假设读写网络比读写源文件和目标文件要昂贵得多。

我们假设两台机器通过低带宽高延迟的双向通信链路连接。rsync 算法,抽象

该算法总结为四个步骤。

  1. 接收方β发送目标文件B的大小为S的块的校验和。
  2. 发送方α标识在源文件A中匹配的块,在任何偏移量处。
  3. αβ发送由逐字、非匹配、数据或匹配块引用组成的指令列表。
  4. β根据这些指令重建整个文件。

请注意,通常将文件Brsync重建为临时文件T,然后将B替换为T。在这种情况下,它必须写入整个文件。

正如人们可以想象的那样,--inplace并不能减轻与αrsync匹配的书写块的负担。它们可以匹配不同的偏移量。再次扫描B以获取新的数据校验和在性能方面是令人望而却步的。可以跳过与在第一步中读取的相同偏移量中匹配的块,但不会这样做。在稀疏文件的情况下,B的空块将匹配A的每个空块,并且必须重写。rsync

直接写入B而不是T--inplace正当原因。它将重写整个文件。rsync

于 2013-11-07T03:34:27.147 回答
5

最新版本的 rsync 可以同时处理 --sparse 和 --inplace !我发现了 2016 年的以下 github 条目:https ://github.com/tuna/rsync/commit/f3873b3d88b61167b106e7b9227a20147f8f6197

于 2019-05-18T17:20:26.547 回答
2

您可以尝试将压缩级别更改为最低值(使用选项--compress-level=1)。最低压缩级别似乎足以减少稀疏文件的流量。但我不知道,CPU使用率如何受到影响。

于 2015-11-05T15:03:59.610 回答