混合 RAID(SDD+HDD)产生意想不到的结果

混合 RAID(SDD+HDD)产生意想不到的结果

我正在 Linux 中对混合 RAID 进行一些实验。我的测试包括以下内容:

2x256GB SSD 组成 RAID 0(/dev/md1)

2x256GB HDD 组成 RAID 0 (/dev/md2)

然后我将 md1 和 md2 制成 RAID 1 (/dev/md127),并将慢速 HDD (md2) 标记为 --write-mostly。

本质上,我的目标是从 SSD 中获得最大性能和磁盘空间,同时又能“避免”驱动器故障。我知道丢失其中一个 SSD 意味着我将不得不使用速度较慢的 HDD,但与丢失所有数据相比,这是我愿意付出的代价。此外,更换损坏的 SSD 和修复 RAID 只需要几个小时。

root@s1 / # cat /proc/mdstat
Personalities : [raid0] [raid1] [linear] [multipath] [raid6] [raid5] [raid4] [raid10]

md2 : active raid0 sdd1[1] sdc1[0]
      498802688 blocks super 1.2 512k chunks

md127 : active raid1 md1[2] md2[1](W)
      498671616 blocks super 1.2 [2/2] [UU]
      bitmap: 1/4 pages [4KB], 65536KB chunk

md1 : active raid0 sdb2[1] sda2[0]
      498802688 blocks super 1.2 512k chunks

现在,在 3 个 raid 设备上运行一个简单的吞吐量基准测试,得到了(对我来说)令人惊讶的结果:

root@s1 / # hdparm -t /dev/md1

/dev/md1:
 Timing buffered disk reads: 2612 MB in  3.00 seconds = 870.36 MB/sec
root@s1 / # hdparm -t /dev/md2

/dev/md2:
 Timing buffered disk reads: 812 MB in  3.01 seconds = 270.14 MB/sec
root@s1 / # hdparm -t /dev/md127

/dev/md127:
 Timing buffered disk reads: 1312 MB in  3.00 seconds = 437.33 MB/sec

RAID 0 SSD 提供 870 MB/秒

RAID 0 HDD 提供 270 MB/秒

RAID 1 HYBRID 提供 437 MB/秒。

由于 HDD raid 已被标记为 --write-mostly,我认为纯读取测试根本不会触及 HDD,那么这里发生了什么?我认为混合基准测试将给出与纯 RAID 0 SSD 类似的结果。

乍一看,似乎 HDD 在某种程度上减慢了 RAID 的速度,因为它部分用于读取(尽管我告诉它不要在 HDD 上执行读取操作)。但是,如果我在运行 hdparm 基准测试时在 HDD 上运行文件副本,我会得到相同的结果!如果使用了 HDD,我认为如果在基准测试期间将 HDD 用于其他任务,基准测试的结果会更慢。

我希望有 Linux raid 专家能帮我解答一下这个问题。谢谢!

答案1

我认为纯读取测试根本不会触及硬盘,那么这里发生了什么?

这是一个错误的假设。特别看一下read_balance()中的函数drivers/md/raid1.c

 /*
   * If buffered sequential IO size exceeds optimal
   * iosize, check if there is idle disk. If yes, choose
   * the idle disk. read_balance could already choose an
   * idle disk before noticing it's a sequential IO in
   * this disk. This doesn't matter because this disk
   * will idle, next time it will be utilized after the
   * first disk has IO size exceeds optimal iosize. In
   * this way, iosize of the first disk will be optimal
   * iosize at least. iosize of the second disk might be
   * small, but not a big deal since when the second disk
   * starts IO, the first disk is likely still busy.
   */

  /*
   * If all disks are rotational, choose the closest disk. If any disk is
   * non-rotational, choose the disk with less pending request even the
   * disk is rotational, which might/might not be optimal for raids with
   * mixed ratation/non-rotational disks depending on workload.
   */

(挥手)如果 SSD“超载”,那么将选择空闲的 HDD。/sys/block/X/queue/optimal_io_size监控待处理的请求数量可能有助于确定正在发生的事情。

如果你想要深刻理解,你就必须去理解read_balance()

相关内容