如何仅使用软件来提高接收主机上 RSYNC 增量传输的性能?

如何仅使用软件来提高接收主机上 RSYNC 增量传输的性能?

我正在使用 RSYNC 将 Virtual Box 的虚拟机从一台服务器备份到一些 Synology NAS DS1512+。重点是我真的想备份虚拟机映像本身,而不是这些映像中的单个文件。我已经额外做了这件事,这不是这里的问题。

使用 备份所有这些图像--whole-file需要大约 3 个小时。但是 NAS 使用 BTRFS,我想使用其快照功能来真正存储差异,但这不适用于--whole-file,因为整个文件都会被传输并真正被重写。--inplace已经使用,但不会改变具体方面,只有当创建新文件或不创建新文件时才会改变。为了有效利用快照,RSYNC 实际上只需要传输文件之间的差异。

这就是问题所在:当删除--whole-file仅传输那些差异时,备份相同数量数据所需的时间会大大增加。我已经在运行 10 小时后关闭了 RSYNC,因为我需要它更早完成,以免与其他备份等重叠。查看这 10 小时后传输的文件,似乎只完成了一半。因此,出于某种原因,增量传输太慢了。

我有点确定瓶颈是 NAS 上的 I/O:服务器没有太多 I/O,甚至从理论上讲,服务器是否使用读取--whole-file也不应该有太大关系。其中一些虚拟机的大小为数百 GiB,并且服务器使用 ZFS,因此这些映像不一定对齐以实现最佳顺序读取。它有足够的可用 RAM 来缓存内容,并且不使用时磁盘或多或少处于空闲状态--whole-file

不过,NAS 上的读取速度也不算太慢:虽然速度会下降,但长时间内会达到 50-70 MiB/s。写入速度似乎也不算太慢,但远不如使用时--whole-file,长时间内达到 100+ MiB/s。有点有趣的是 CPU 负载,尤其是在不使用时,负载相当高--whole-file,很可能是因为 BTRFS 压缩。但为了有效利用可用空间,压缩也是必要的。

NAS 上的 htop

--whole-file我的预期是,特别是对于读取而言,在我的设置中使用与否应该不会有太大影响。NAS 上的 BTRFS 和 ZFS 无论如何不一定会对齐写入的文件以进行顺序读取。虽然我猜测突发不会像使用 那样高--whole-file,但我预计增量传输会最大限度地减少总体写入的数据量,因此情况会相互抵消。但出于某种原因,情况似乎并非如此。

最后,我使用以下选项:

--owner \
--numeric-ids \
--compress-level=0 \
--group \
--perms \
--rsh=rsh \
--devices \
--hard-links \
--inplace \
--whole-file \
--links \
--recursive \
--times \
--delete \
--delete-during \
--delete-excluded \
--rsync-path=[...] \
--specials

这些选项中是否有任何明显的东西可以解释 和 之间的区别--whole-file?已知在后一种情况下表现不佳的东西?使用 RSYNC 接收站点有什么可以改进的吗?

投资购买更多更好的硬件(如 SSD 等)并不是一个选择。要么我发现 RSYNC 的一些错误用法,要么就得忍受--whole-file没有快照。

感谢您的建议!

答案1

RSync 似乎在处理非常大的文件时存在这个问题。传输 VM 映像时我确实感觉到了这一点。我见过 30GB 大小的文件也存在这个问题,但它可能会出现在更小的文件上。

我很幸运,有各种各样的存储硬件可供测试。不幸的是,我可以说 SSD 没什么用。无论是从一台计算机上的 SSD 读取数据,还是写入另一台计算机上基于 HDD 的慢速 ZFS 文件系统(通过千兆链路),还是在装有 SSD 的计算机之间,从启动 RSync 到完成传输的时间并不比发送整个文件(--whole-file)短,而且通常要花两倍的时间。我也尝试过不同的块大小。较小的块(4096 对 65536)更好,但好不了多少。

由于没有人提到使用 RSync 作为连接远程端的守护进程,而不是依赖 SSH,所以我要补充一点,这样做非常值得。只要往返远程计算机的流量不必穿越不安全的网络,这是一种获得线速的简单方法。

但是由于您在 NAS 上使用 BTRFS,如果您也在源机器上使用 BTRFS,则可以使用 BTRFS 发送和接收来仅传输快照之间的更改。第一次传输会很痛苦,比使用 RSync 更糟糕,但后续传输应该非常快。更好的是,您的快照将按预期工作,只有更改会消耗存储。

过去,我就是这么做的,只是 ZFS 除外,而且效果很好。与 RSync 一样,在安全的地方避免使用 SSH,例如使用nc,可以带来巨大的好处。

我可能很快就会按照我在 BTRFS 中描述的方式实现它,并会报告我的发现。

答案2

使用--whole-file,目标端无需进行任何读取,只需截断文件并将其写入缓冲即可。它也不需要进行任何校验和,您只是传输整个文件。

如果没有--whole-file,它必须读取目标端的整个文件并覆盖更改的块。读取速度可能比写入速度慢,尤其是在 ZFS 和 BTRFS 等写时复制文件系统中。

因此,我怀疑您看到的性能差异来自写入与读取的更高顺序性。根据您的 ZFS 记录大小,您应该使用 来设置相同的值--block-size。ZFS 记录大小默认为 128KB,如果您的版本支持大块,您可以将 ZFS 记录大小和 rsync 块大小都设置为 1MB,这将有助于减少碎片。

相关内容