我正在使用 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
这是 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
因此重新同步速度也很棒。现在,出现了一些奇怪的行为。在执行检查时,我可以并行将数据写入阵列,性能良好。写入速度约为 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
重新同步过程设置为正确的值。I/O 调度程序针对所有底层物理磁盘idle
设置为。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 检查时写入阵列也非常好,为什么每月检查时读数这么差?
答案1
首先我要说的是,我对 mdadm 或 Debian 没有什么了解 - 但我认为您看到的效果非常普遍。
了解 RAID 6 的工作原理后,可以预料到写入速度通常比读取速度慢:读取时,可以同时读取所有四个磁盘。跳过奇偶校验数据,而是提前读取下一个数据段以进行缓存。可以实现的最佳读取速度是n是单个磁盘速度的几倍。
在写入时,数据会通过两个不同的奇偶校验段进行增强,这些奇偶校验段也需要写入磁盘。当所有磁盘同时写入时,可实现的最佳速度是n-2倍单速。
使用少量大型磁盘进行 RAID 6 重新同步或重建将需要很长时间。本质上,必须读取每个条带并将其与磁盘上存储的冗余数据进行比较。磁盘负载很重,任何生产性 I/O 都必须与所有读取竞争。这就是读取速度慢的原因。为了获得合适的读取延迟,后台同步需要以低优先级运行,即当检测到其他 I/O 时,它需要停止并暂停片刻。
另一方面,写入操作首先进入缓存,并且似乎立即完成 - 只要有可用的缓存。真正的写入操作会在后台的某个时间发生。只有当您的写入量超过缓存容量时,您才会注意到严重的减速。
为了在重新同步期间使读取速度达到合适的水平,您需要首先使后台检查以较慢的速度运行,或者想办法让它在完成生产性读取时暂停。