我正试图find重build软件raid6的瓶颈。
## Pause rebuilding when measuring raw I/O performance # echo 1 > /proc/sys/dev/raid/speed_limit_min # echo 1 > /proc/sys/dev/raid/speed_limit_max ## Drop caches so that does not interfere with measuring # sync ; echo 3 | tee /proc/sys/vm/drop_caches >/dev/null # time parallel -j0 "dd if=/dev/{} bs=256k count=4000 | cat >/dev/null" ::: sdbd sdbc sdbf sdbm sdbl sdbk sdbe sdbj sdbh sdbg 4000+0 records in 4000+0 records out 1048576000 bytes (1.0 GB) copied, 7.30336 s, 144 MB/s [... similar for each disk ...] # time parallel -j0 "dd if=/dev/{} skip=15000000 bs=256k count=4000 | cat >/dev/null" ::: sdbd sdbc sdbf sdbm sdbl sdbk sdbe sdbj sdbh sdbg 4000+0 records in 4000+0 records out 1048576000 bytes (1.0 GB) copied, 12.7991 s, 81.9 MB/s [... similar for each disk ...]
因此,我们可以在外部磁道上以140 MB / s的速度依次读取数据,而在所有驱动器的内部磁道上,可以同时读取82 MB / s的数据。 顺序写入性能类似。
这将导致我期望82 MB / s或更高的重build速度。
# echo 800000 > /proc/sys/dev/raid/speed_limit_min # echo 800000 > /proc/sys/dev/raid/speed_limit_max # cat /proc/mdstat md2 : active raid6 sdbd[10](S) sdbc[9] sdbf[0] sdbm[8] sdbl[7] sdbk[6] sdbe[11] sdbj[4] sdbi[3](F) sdbh[2] sdbg[1] 27349121408 blocks super 1.2 level 6, 128k chunk, algorithm 2 [9/8] [UUU_UUUUU] [=========>...........] recovery = 47.3% (1849905884/3907017344) finish=855.9min speed=40054K/sec
但是我们只有40 MB / s。 而且通常会降到30 MB / s。
# iostat -dkx 1 sdbc 0.00 8023.00 0.00 329.00 0.00 33408.00 203.09 0.70 2.12 1.06 34.80 sdbd 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 sdbe 13.00 0.00 8334.00 0.00 33388.00 0.00 8.01 0.65 0.08 0.06 47.20 sdbf 0.00 0.00 8348.00 0.00 33388.00 0.00 8.00 0.58 0.07 0.06 48.00 sdbg 16.00 0.00 8331.00 0.00 33388.00 0.00 8.02 0.71 0.09 0.06 48.80 sdbh 961.00 0.00 8314.00 0.00 37100.00 0.00 8.92 0.93 0.11 0.07 54.80 sdbj 70.00 0.00 8276.00 0.00 33384.00 0.00 8.07 0.78 0.10 0.06 48.40 sdbk 124.00 0.00 8221.00 0.00 33380.00 0.00 8.12 0.88 0.11 0.06 47.20 sdbl 83.00 0.00 8262.00 0.00 33380.00 0.00 8.08 0.96 0.12 0.06 47.60 sdbm 0.00 0.00 8344.00 0.00 33376.00 0.00 8.00 0.56 0.07 0.06 47.60
iostat说磁盘不是百分之百忙碌(但只有40-50%)。 这符合最大值约为80MB / s的假设。
由于这是软件突袭,限制因素可能是CPU。 top说:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 38520 root 20 0 0 0 0 R 64 0.0 2947:50 md2_raid6 6117 root 20 0 0 0 0 D 53 0.0 473:25.96 md2_resync
所以md2_raid6和md2_resync显然占用了CPU的64%和53%,但不是接近100%。
在测量哪个块大小给CPU最less的惩罚之后,RAID的块大小(128k)被select。
如果这个速度是正常的:什么是限制因素? 我可以衡量一下吗?
如果这个速度不正常:我怎样才能find限制因素? 我可以改变吗?
我不记得从4磁盘RAID 5迁移到6磁盘RAID 6时的速度,但它们是相似的(4TB可用arrays,24小时重build,大约45MB / s)。
您必须记住,即使是speed_limit_min也会优先尝试使用该数组的应用程序。 因此,用于检测活动的机制可能需要磁盘上50%的负载来检测,并且仍然能够为IO请求提供服务。 你尝试卸下分区吗?
为了检查瓶颈,你必须跟踪内核(例如,使用Linux Tracing Toolkit lttng或System Tap)。 这并不容易,需要花费很多时间,除非你需要在几台电脑上重buildarrays,否则这可能是不值得的。 至于改变它:我相信这样的Linux内核的补丁将受到欢迎:)
我不希望Raid6恢复操作具有连续性,因为它通常需要从embedded在这些驱动器上的数据块之间的n-1个驱动器恢复校验和和数据块。
除此之外,我会期待一个有点顺序的操作(=不完全平行),如:
至less是5.是同步点,所以duration(1..4)至less是duration(最慢(1..4))。 它所做的好坏取决于任何涉及的层(md,驱动程序,控制器(ncq等))的并行化程度。
我永远不会期望在单个磁盘的连续读取/写入时间附近的raid6的重build速率。
作为比较:我们的PS6000 Equallogicarrays(16x1TB)在中等负载下花费大约32小时来重build故障磁盘。