RAID6 重新同步,写入速度快,读取速度慢

rab*_*dde 6 performance debian io mdadm raid6

我正在使用 Debian Jessie。

# uname -a
Linux host 4.9.0-0.bpo.3-amd64 #1 SMP Debian 4.9.30-2+deb9u5~bpo8+1 (2017-09-28) x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)

并设置了RAID6。

# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4] [raid1]
md0 : active raid6 sda[0] sdd[3] sdc[2] sdb[1]
      19532611584 blocks super 1.2 level 6, 512k chunk, algorithm 2 [4/4] [UUUU]
      bitmap: 1/73 pages [4KB], 65536KB chunk
Run Code Online (Sandbox Code Playgroud)

这是 4x Seagate Enterprise 10TB 7200rpm。将大文件从 RAID 阵列复制到内部系统磁盘(SSD)时,平均吞吐量为 220MB/s。将大文件从 SSD 复制到阵列的速度为 145MB/s。当每月 RAID 检查完成时(由 cron 作业执行开始,checkarray --cron --all --idle --quiet这是默认行为)我可以看到

# cat /proc/mdstat                                                                                                                                                 Personalities : [raid6] [raid5] [raid4] [raid1]
md0 : active raid6 sda[0] sdd[3] sdc[2] sdb[1]
      19532611584 blocks super 1.2 level 6, 512k chunk, algorithm 2 [4/4] [UUUU]
      [>....................]  check =  0.7% (72485728/9766305792) finish=817.2min speed=197694K/sec
      bitmap: 1/73 pages [4KB], 65536KB chunk
Run Code Online (Sandbox Code Playgroud)

所以重新同步速度也很棒。现在,有一些奇怪的行为。在执行检查时,我可以以良好的性能将数据并行写入数组。写入速度约为 100MB/s,可以看到 RAID 同步速度下降。复制到阵列完成后,同步速度再次增加到以前的速度。问题是在检查运行时从阵列读取。读取速度小于 20MB/s。并且 RAID 的重新同步速度不会降低。我不知道这是什么原因。

# ps aux | grep md0
root       211  0.4  0.0      0     0 ?        S    Okt22  93:40 [md0_raid6]
root       648  0.0  0.0      0     0 ?        S    Okt22   0:01 [jbd2/md0-8]
root     15361  4.4  0.0      0     0 ?        DN   02:25   0:00 [md6_resync]
root     15401  0.0  0.0  12752  2040 pts/2    S+   02:26   0:00 grep md6
# ionice -p 211
none: prio 0
# ionice -p 15361
idle
Run Code Online (Sandbox Code Playgroud)

重新同步过程设置idle为正确。I/O 调度程序设置CFQ为所有底层物理磁盘。

该系统中还有一个 RAID1

# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4] [raid1]
md1 : active raid1 sde[0] sdf[1]
      3906887488 blocks super 1.2 [2/2] [UU]
      bitmap: 2/30 pages [8KB], 65536KB chunk
Run Code Online (Sandbox Code Playgroud)

这个数组没有问题。我可以在检查运行时以良好的速度写入和读取数组。看/proc/mdstat,同步速度随着 I/O 活动而降低,并在再次完成后增加。但不适用于md0/RAID6上的读取 I/O 。至于md0正常同步速度很好,没有resync的正常读写都很好,甚至在运行RAID检查时写入阵列也很好,为什么每月检查运行时读取如此糟糕

Zac*_*c67 1

首先我要说的是,我对 mdadm 或 Debian 没有真正的了解 - 但我认为您看到的效果是非常普遍的。

当您了解 RAID 6 的工作原理时,写入速度通常比读取速度慢是可以预料的:通过读取,可以同时读取所有四个磁盘。奇偶校验数据被跳过,而是可以提前读取下一个数据段以进行缓存。可以达到的最佳读取速度是单盘速度的n倍。

写入时,数据会通过两个不同的奇偶校验段进行扩充,这两个奇偶校验段也需要写入磁盘。当所有磁盘同时写入时,能达到的最佳速度是单个速度的n -2 倍。

使用少量大磁盘重新同步或重建 RAID 6 将需要很长时间。本质上,必须读取每个条带并将其与也存储在磁盘上的冗余数据进行比较。磁盘负载很重,任何高效的 I/O 都必须与所有读取竞争。这就是读取速度慢的原因。为了获得适当的读取延迟,后台同步需要以低优先级运行,即当感测到其他 I/O 时,它需要停止并暂停一会儿。

另一方面,写入会首先写入缓存,并且只要有可用的缓存,就会立即完成。真正的写入将在某个时间在后台发生。只有当您的写入量超过缓存容量时,您才会注意到速度严重下降。

为了在重新同步期间使读取速度达到合适的水平,您需要让后台检查以较慢的速度开始运行,或者找到一种方法在完成高效读取时使其暂停。