ソフトウェア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で同時に読み取ることができます。シーケンシャル書き込みのパフォーマンスも同様です。
これにより、82MB /秒以上の再構築速度が期待できます。
# 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
しかし、40MB /秒しか得られません。そして、多くの場合、これは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
は、ディスクが100%ビジーではない(ただし40〜50%のみ)ことを示します。これは、最大が約80 MB/sであるという仮説と一致します。
これはソフトウェアRAIDであるため、制限要因は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%近くではありません。
RAIDのチャンクサイズ(128k)は、CPUペナルティが最小のチャンクサイズを測定した後に選択されました。
この速度が正常な場合:制限要因は何ですか?それを測定できますか?
この速度が正常でない場合:制限要因を見つけるにはどうすればよいですか?変更できますか?
4ディスクRAID5から6ディスクRAID6に移行したときの速度は正確には覚えていませんが、同様でした(4TBの使用可能なアレイ、24時間の再構築、約45MB /秒)。
speed_limit_min
でさえ、配列を使おうとするアプリケーションにいくらかの優先順位を与えることを覚えておく必要があります。そのため、アクティビティの検出に使用されるメカニズムでは、アクティビティを検出するためにディスクに50%の負荷が必要であり、IO要求を処理する機能があります。パーティションをアンマウントしてみましたか?
ボトルネックをチェックするには、カーネルをトレースする必要があります(たとえば、Linux Tracing Toolkit lttng
、またはSystem Tapを使用)。それは簡単ではなく、多くの時間がかかるので、少数のコンピューターでアレイを再構築する必要がない限り、おそらくそれだけの価値はありません。それを変更することに関して:私はLinuxカーネルへのそのようなパッチが歓迎されると確信しています:)
Raid6リカバリ操作は、通常、これらのドライブのデータブロック間に埋め込まれているn-1ドライブからチェックサムとデータブロックをリカバリする必要があるため、シーケンシャルな性質になるとは思いません。
これに加えて、私は次のようなややシーケンシャルな操作(=完全並列ではない)を期待します:
少なくとも5.は同期ポイントであるため、duration(1..4)は少なくともduration(slowest(1..4))です。パフォーマンスは、関連するレイヤー(md、ドライバー、コントローラー(ncqなど))の並列化のレベルによって決まります。
単一ディスクのシーケンシャルな読み取り/書き込み時間の近くで、raid6の再構築率を期待することは決してありません。
比較のために:PS6000 Equallogicアレイ(16x1TB)は、中程度の負荷の下で、障害が発生したディスクを再構築するのに約32時間かかります。