如何使用 mdadm/btrfs raid1 或 zfs 镜像获取两个磁盘的读取速度?

如何使用 mdadm/btrfs raid1 或 zfs 镜像获取两个磁盘的读取速度?

鉴于RAID1写入了两份数据,我的理解是读取次数应该接近单个磁盘的两倍。

我已经测试了不同技术(mdadm、zfs、btrfs)的读取性能,但收效甚微。

根据我的经验:

  • btrfs 在读取期间仅使用一个磁盘
  • zfs/mdadm 使用两个磁盘,但实现的读取速度与单个磁盘相同

我已经使用 dd、iotop 和 iostat 验证了结果。

如何才能同时读取两个磁盘上的数据,以达到单磁盘两倍的读取性能?

答案1

关于如何进行测试的信息有点有限,所以我假设您只是使用 dd 直接写入文件。

BTRFS:

在 BTRFS 术语中,RAID1 意味着无论池中有多少个磁盘,都有两个副本。因此,为了简单起见,我们假设数据和元数据都存储在 RAID1 中的两个磁盘上。因此,每个磁盘都是另一个磁盘内容的副本(在 BTRFS 中,磁盘布局可能不相同)。

当 BTRFS 执行读取时(我上次检查时),它依赖进程的 PID 来确定首先从哪些磁盘读取。这意味着,如果您运行单个进程,它将只从其中一个磁盘读取,除非出现错误并且需要从另一个磁盘检索好的副本。

下次运行该进程时,它可能具有不同的 PID,并且 BTRFS 将首先从另一个磁盘读取数据。

医学博士:(MDADM)

对于连续读取,您不会获得太多好处,因为两个设备上的数据相同,因此两个磁盘在开始读取之前都需要跳过(寻道)相同数量的数据。例如,磁盘 A 需要等待(跳过)前 10 个字节才能读取接下来的 10 个字节,即使磁盘 B 可以在磁盘 A 跳过的同时读取前 10 个字节,它仍然需要等到磁盘 A 完成才能将其应该在内存中读取的 20 个字节放在一起。

来自 MD 手册页(man md):

“请注意,驱动程序完成的读取平衡不会使 RAID1 性能配置文件与 RAID0 相同;单个顺序输入流不会加速(例如单个 dd),但多个顺序流或随机工作负载将使用多个主轴。理论上,拥有 N 磁盘 RAID1 将允许 N 个顺序线程从所有磁盘读取。”

ZFS:

我对 ZFS 不了解,但我希望它的工作方式与 BTRFS/MDADM 大致相同。

结论:

为了单身的像您可能使用 dd 执行的顺序读取操作一样,在 BTRFS 和/或 MDADM 上设置 RAID1 并不会在性能方面获得太大的提升。

如果您希望 BTRFS 和 MDADM 的读取速度都有所提高(确实如此),则需要在阵列上并行执行多个不同的读取。BTRFS 可能会根据 PID 将读取分布到不同的磁盘上,而 MDADM 应该会显著减少寻道次数。请记住,RAID1 与 RAID0 不同,尤其是在 BTRFS 阵列上。

相关内容