MD Raid 1 读取平衡算法

MD Raid 1 读取平衡算法

我已经通过谷歌搜索过,但没有找到有关 MD raid1 的读取平衡算法的任何信息。

几年前我可能在某处读到过它用来hashing the process id决定使用哪种设备,但我不确定。

我在 raid1 上安装了 KVM 虚拟化 + LVM,我多次看到多个虚拟机的读取操作进入同一个磁盘,利用率达到 100%,而 raid1 中的另一个磁盘处于空闲状态。(通过 iostat -x)

编辑:问题还涉及虚拟机内部的多个进程。即使在虚拟机内部也会发生读取平衡吗?

读取是否平衡?如果平衡,使用哪种算法?

我之所以问这个问题,是因为我目前正在两个版本之间犹豫不决

  1. 单个 MD 设备上的 LUKS
  2. 两个 LUKS 设备顶部的 MD

第二种情况使用了更多的 CPU,但这并不是什么问题。

答案1

只要同时执行两个单独的磁盘读取操作,Linux 实施的 RAID1 就会加快磁盘读取操作。这意味着在 RAID1 上读取一个文件不会比在单个磁盘上快,但同时读取两个不同的文件会更快。

使用 DD 完成读取测试并禁用读取缓存:

Test single file:
1048576000 copied @ 224MB/s

Test same file 2 transfers:
Test single file:
1048576000 copied @ 116MB/s
1048576000 copied @ 104MB/s

Test 2 files 2 transfers:
1048576000 copied @ 212MB/s
1048576000 copied @ 217MB/s

至于选项,单个 MD 设备之上的 LUKS 听起来更合乎逻辑。

best_dist_disk您可以使用和参数来调整从同一磁盘读取时出现的问题best_pending_disk。您可以查看完整的示例这里

答案2

如果您只有一个顺序 I/O 流,则 md RAID1 算法将继续选择同一个磁盘。从mdadm 手册页

[在 md RAID1 上] 单个顺序输入流不会加速(例如单个 dd),但多个顺序输入流或随机工作负载将使用多个主轴。理论上,拥有 N 个磁盘 RAID1 将允许 N 个顺序线程从所有磁盘读取。

您可以阅读5.10 内核的源代码,查看 md RAID1 平衡算法. 粗略概述如下:

  • 平衡只能在有多个同步且无故障的磁盘的区域中发生
  • 平衡将尝试避免将磁盘标记为“主要写入”
  • 如果磁盘的最后一个 I/O 恰好在需要读取的区域之前完成,则平衡将继续使用该磁盘,除非新的 I/O 太大(这就是单个顺序流无法加速的原因)
  • 如果上述方法没有给我们一个磁盘,请检查是否有任何磁盘是 SSD,或者是否有任何磁盘没有待处理的 I/O。如果这两种情况都属实,请选择待处理 I/O 数量最少的磁盘。
  • 如果上述方法没有给出磁盘,则选择最近执行 I/O 操作、最接近所需读取位置的磁盘

相关内容