是什么让 rsync 的一侧如此忙碌?

MvG*_*MvG 11 performance io mdadm rsync btrfs

我的局域网上有一台 Debian 机器作为其他机器的备份服务器。它有四个硬盘驱动器组合成一个软件 RAID 5 md 设备,在那个 LVM 上,在那个 btrfs 上。使用 rsync 进行备份,对于大型文件系统需要一个多小时。很长一段时间以来,我一直认为我对此无能为力。

然而,最近我注意到传输两端的硬盘活动非常不同。虽然发送端运行 Gentoo 并且主要使用 ext4,几乎没有任何磁盘 IO,但接收端一直很忙。由于大多数数据不会在传输之间发生变化,我认为元数据读取应该构成大部分数据。但是,如果在 btrfs 中读取 inode 比在 ext4 中读取索引节点的工作量大,我会感到非常惊讶。

iotop 确认接收端的磁盘读取速度约为 1-4 MB/s,而发送端只有偶尔的 0.5 MB/s 突发。

我的问题是,谁能解释一下这里发生了什么?如果可能的话,最好有一些如何解决问题的指示。

也许我可以使用一些 btrfs 调整标志或类似的东西。我在备份服务器上需要一个具有快照功能的 FS,而我尝试使用 FreeBSD 和 ZFS 很快就会导致 FS 不一致,所以我目前看不到 btrfs 的替代品。因此,告诉我使用 ext4 或 zfs 的答案可能会收到赞成票但没有复选标记。


根据cjm 的要求,正在使用的 Rsync 选项:

--rsync-path='rsync --fake-super'
--archive               # -rlptgoD
--hard-links            # detect and preserve these
--acls
--xattrs
--sparse
--noatime               # based on patch from samba #7249c1
--delete
--delete-delay
--fuzzy
--human-readable        # size suffixes, base 1000
--stats
Run Code Online (Sandbox Code Playgroud)

以及-f省略一些文件的一堆规则。


btrfs 的挂载选项报告mount

rw,nosuid,noexec,noatime,nospace_cache
Run Code Online (Sandbox Code Playgroud)

特别是,这包括noatime标志,因此除非某些文件中确实存在差异,否则不应涉及任何写入。我响应添加了这个信息的答案凯尔·琼斯

Kyl*_*nes 3

一种可能的答案是远程文件系统默认使用“atime”选项挂载。远程 rsync 访问的所有内容的访问时间写入以及 RAID 5 所遭受的写入损失(计算奇偶校验意味着在写入其中一个磁盘之前读取所有 RAID 磁盘)可以解释远程端的 I/O 放大。

如果我是对的,您可以通过使用“noatime”选项安装远程文件系统来加快速度。

  • 好主意,但遗憾的是不是解决方案:文件系统已经安装了 noatime。Mount 将所有挂载选项集报告为“rw,nosuid,noexec,noatime,nospace_cache”。 (2认同)