rsync挂在一个大文件上

每天晚上,我都会用rsync从一台Linux Debian计算机上将几个虚拟磁盘复制到另一台Linux Debian上。
大多数文件是带有“漏洞”的原始图像:某些部分从未写入,因此在磁盘上保持未分配状态。

rsync挂在一个文件上,总是一样的。 挂起发生在50Gb传输,每次。 我不确定这是否始终处于完全相同的位置,但ls -sh显示50 Gb。
这是一个包含151 Gb的800 Gb文件(因此649 Gb是未分配的)。 其他一些虚拟磁盘有相似的数字,rsync在其上运行良好。

如果我使用rsync在本地更新文件,而没有任何networking参与(使用--no-whole-file ,这是一个要求,请参阅后面的内容),我具有完全相同的行为。

一旦rsync被阻塞,它将使用一个CPU核心到100%,在接收端使用零磁盘活动(这是一个pull请求,所以rsync从这边运行),在发送端使用零CPU和零磁盘。
我让它在几个小时内跑了。
Ctrl + c立即停止rsync。
当运行到本地复制,一旦停滞,我也有一个100%的CPU核心和零磁盘活动。

我发现唯一的例外是当我rsync这个文件到一个新的位置(即目标文件不存在)。 所以我怀疑这个问题与新旧数据的比较有关。

我使用--inplace来限制对目标磁盘的写入,因为每次备份之后都会使用快照。 所以这个选项是一个需求,rsync也是如此,除非我find一个工具只能更新这些文件的变化部分。

已知rsync在大文件上有这种问题,因为内部散列缓冲区的algorithm效率低下。

你必须使用--block-size选项。 但目前的版本不允许使用超过128 kB。 一些网页告诉使用--block-size=10485760 --protocol=29但在我的情况下,它是由rsync拒绝。

  • 使用版本29或更旧版本
  • 或者修改MAX_BLOCK_SIZE常量后重新编译

看看针对rsync的错误报告。 也许文件一个新的。 你可以从https://rsync.samba.org/bugzilla.htmlfind这些

无论是在这里还是在一个错误报告,你应该提供更多的细节。 什么版本的rsync在每一端,你的操作系统是什么,以及你使用的是什么命令? 文件和/或rsync传输是否压缩? 用什么zlib版本?

https://bugzilla.samba.org/show_bug.cgi?id=10518 ,也许https://bugzilla.samba.org/show_bug.cgi?id=10372可能是相关的。 另见http://www.anchor.com.au/blog/2013/08/out-tridging-tridge/