我有一些需要每天同步的VM映像。虚拟机文件稀疏。
为了节省网络流量,我只想传输图像的实际数据。 我在rsync上使用--sparse选项尝试它,但是在网络流量上我看到整个大小通过网络传输而不仅仅是实际数据使用。
如果我使用rsync -zv --sparse,那么只有实际大小才能通过网络传输,一切正常。但是由于cpu的使用,我不想压缩文件。
不应该--sparse选项只传输实际数据,并且本地创建“空数据”以节省网络流量吗?
是否有没有压缩的解决方法?
谢谢!
答案 0 :(得分:8)
看看this discussion,具体来说,this answer。
似乎解决方案是rsync --sparse
后跟rsync --inplace
。
在第一个--sparse
,调用时,还使用--ignore-existing
来阻止已经传输的稀疏文件被覆盖,并使用-z
来保存网络资源。
第二个调用--inplace
应仅更新已修改的块。压缩是可选的。
另见this post。
<强>更新强>
我相信上述建议无法解决您的问题。我也相信rsync
不适合完成任务。您应该搜索其他工具,以便在网络和磁盘I / O效率之间取得良好的平衡。
Rsync
旨在有效使用单一资源,即网络。它假设读取和写入网络比读取和写入源文件和目标文件要昂贵得多。
我们假设两台机器通过低带宽高延迟双向通信链路连接。 The rsync algorithm, abstract
该算法分为四个步骤。
请注意,rsync
通常会将文件 B 重建为临时文件 T ,然后将 B 替换为 T 即可。在这种情况下,它必须写入整个文件。
正如人们可以想象的那样,--inplace
并不能解除rsync
编写与α匹配的块。它们可以匹配不同的偏移量。第二次扫描 B 以获取新的数据校验和在性能方面是令人望而却步的。可以跳过在第一步中读取的相同偏移量匹配的块,但rsync
不会这样做。对于稀疏文件, B 的空块将匹配 A 的每个空块,并且必须重写。
--inplace
只会导致rsync
直接写入 B ,而不是 T 。它会重写整个文件。
答案 1 :(得分:1)
您可以尝试将压缩级别更改为最低值(使用选项--compress-level=1
)。最低压缩级别似乎足以减少稀疏文件的流量。但我不知道,CPU的使用情况如何受到影响。
答案 2 :(得分:1)
最新版本的rsync可以一起处理--sparse和--inplace!我在2016年找到了以下github条目:https://github.com/tuna/rsync/commit/f3873b3d88b61167b106e7b9227a20147f8f6197