背景
我有一台托管虚拟机的服务器和一台较旧的 NAS Synology DS1512+ 用作这些虚拟机的备份目标。服务器使用 ZFS,创建快照并将快照文件传输到 NAS。NAS 使用启用了压缩的 BTRFS,并且还支持快照。最终目标是服务器实际上只使用 RSYNC 发送 DELTA,以最大限度地减少 NAS 接收到的更改数据量,并有效地利用快照。
问题
不过,在我的情况下,将 RSYNC 与 DELTA 一起使用是行不通的,因为传输数据需要太多时间。当 RSYNC 与 一起使用时--inplace --whole-file
,数据传输大约需要 2 小时。删除--whole-file
以使用 DELTA 时,相同的备份过程需要更长的时间,我经常在已经运行 12 多个小时后终止该过程。由于历史原因,我需要将不同的备份放入更小的时间窗口中。
唯一有意义的瓶颈是 NAS,因为服务器功能强大得多,并且大部分时间都处于空闲状态。NAS OTOH 在备份期间对 CPU 和 I/O 的负载非常高。虽然,这些数字也不算太糟糕,只是它们比使用--whole-file
. 这样一来,NAS 几乎可以简单地写入约 100+ MiB/s,而使用 DELTA,它在大多数情况下读取速度较慢,范围从约 50 到 100 MiB/s。我认为由于 DELTA 而不能写入的数据量很容易超过 NAS 较慢的事实,但事实似乎并非如此。并且虚拟机上的数据变化量通常不会太高。
观察
我在 NAS 上认识到的是,RSYNC 似乎在某个时候同时处理两个文件。这看起来像一些预读或类似的东西:
root@amds1512-01:~# lsof | grep [d]asi_
rsync 6883 root cwd DIR 0,33 290 259 /volume1/[...]
rsync 6883 root 0r REG 0,33 2142633984 580 /volume1/[...]/[...]-s024.vmdk
rsync 6884 root cwd DIR 0,33 290 259 /volume1/[...]
rsync 6884 root 1r REG 0,33 2143748096 579 /volume1/[...]/[...]-s023.vmdk
rsync 6884 root 3w REG 0,33 2143748096 579 /volume1/[...]/[...]-s023.vmdk
HTOP 清楚地表明 RSYNC 的两个实例都可以读取。只需忽略其他 RSYNC 进程,它们是不相关的,即使一个备份专门运行,问题仍然存在。
问题
那么这两个在备份目标上有不同文件的运行 RSYNC 的目的是什么?有没有办法告诉 RSYNC 只处理一个又一个文件?
这可能会增加整体处理时间,同时减少并发负载。我在手册页中找不到任何像预读或类似的东西。如果有任何不同,以下是使用的选项:
--owner \
--numeric-ids \
--compress-level=0 \
--group \
--perms \
--rsh=rsh \
--devices \
--hard-links \
--inplace \
--links \
--recursive \
--times \
--delete \
--delete-during \
--delete-excluded \
--rsync-path=[...] \
--specials
谢谢!
看看Rsync 的工作原理。具体来说,有一个生成器进程和一个发送器进程作为管道运行。发送方读取文件以发送到远程。生成器负责生成要发送的文件列表,并且“为基础文件创建块校验和,并在文件的索引号之后立即发送给发送者”。
--inplace
如果您用于发送多个大文件并且没有足够的 RAM 可供内核在缓存中保存两个连续文件,这听起来肯定有可能导致文件系统抖动。作为测试,您可以尝试传输单个文件
rsync --inpace
并查看性能是否明显更好。(类似for i in *.vmdk; do rsync [...]; done
。)这应该有助于确定是否有两个单独的阅读器实际上会导致您的性能问题。如果多个读取器导致性能问题,那么一种可能的方法是提高内核缓存读取的能力,或者通过为主机内核提供更多 RAM 或通过使您的单个 vmdk 文件更小。
不幸的是,除了编写自己的脚本来为每个文件调用一次 rsync 之外,我没有看到任何明显的方法来更改 rsync 中的生成器/发送器管道行为。您可能想在rsync 邮件列表上询问这个问题。