快速写入但读取速度慢的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 

并设置了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 

这是4倍的希捷企业10TB 7200rpm。 从RAIDarrays复制大文件到内部系统磁盘(SSD)时,平均吞吐量为220MB / s。 将大文件从SSD复制到arrays是以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 

所以重新同步的速度也很棒。 现在,有一些奇怪的行为。 在执行检查时,我可以将数据写入arrays并且具有良好的性能。 写入速度是〜100MB / s,可以看到RAID同步速度降低。 复制到arrays后,同步速度再次增加到之前的速度。 问题是在检查运行时从arrays中读取数据 。 读数以<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 

重新同步过程被设置为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 

这个数组没有问题。 在检查运行时,我可以以高速读写数组。 看/proc/mdstat ,I / O活动的同步速度会降低,再次完成后会增加。 但不适用于读取md0 / RAID6上的I / O。 至于md0正常同步速度是非常好的,正常的读写没有再同步是好的,甚至在运行RAID检查时写入arrays是非常好的, 为什么每月检查运行时读取这么差

首先让我开始说我对mdadm或者Debian没有真正的想法 – 不过我认为你看到的效果是非常普遍的。

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

在写入时,数据由两个不同的奇偶校验段增加,这些奇偶段也需要写入磁盘。 当所有磁盘同时写入时,要达到的最佳速度是单倍速度的n -2倍。

使用less量大磁盘的RAID 6重新同步或重build将需要很长时间。 实质上,必须读取每个条带,并将其与也存储在磁盘上的冗余数据进行比较。 磁盘负载很重,任何高效的I / O必须与所有的读取竞争。 这就是读取速度慢的原因。 为了有正确的读取延迟,后台同步需要以低优先级运行,也就是说,当检测到其他I / O时,需要暂停和暂停。

写在另一方面去caching第一,似乎马上就完成 – 只要有caching可用。 真正的写作会在某个时间或其他时间发生在后台。 只有当你的写入量超过caching容量时,你才会注意到一个严重的放缓。

为了在重新同步时将读取速度提高到一个体面的水平,你需要让后台检查以一个缓慢的速度开始,或者找出一种办法,让它在有效的读取结束时暂停。