web-dev-qa-db-ja.com

LinuxソフトウェアRAID6:再構築が遅い

ソフトウェア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ペナルティが最小のチャンクサイズを測定した後に選択されました。

この速度が正常な場合:制限要因は何ですか?それを測定できますか?

この速度が正常でない場合:制限要因を見つけるにはどうすればよいですか?変更できますか?

5
Ole Tange

4ディスクRAID5から6ディスクRAID6に移行したときの速度は正確には覚えていませんが、同様でした(4TBの使用可能なアレイ、24時間の再構築、約45MB /秒)。

speed_limit_minでさえ、配列を使おうとするアプリケーションにいくらかの優先順位を与えることを覚えておく必要があります。そのため、アクティビティの検出に使用されるメカニズムでは、アクティビティを検出するためにディスクに50%の負荷が必要であり、IO要求を処理する機能があります。パーティションをアンマウントしてみましたか?

ボトルネックをチェックするには、カーネルをトレースする必要があります(たとえば、Linux Tracing Toolkit lttng、またはSystem Tapを使用)。それは簡単ではなく、多くの時間がかかるので、少数のコンピューターでアレイを再構築する必要がない限り、おそらくそれだけの価値はありません。それを変更することに関して:私はLinuxカーネルへのそのようなパッチが歓迎されると確信しています:)

1
Hubert Kario

Raid6リカバリ操作は、通常、これらのドライブのデータブロック間に埋め込まれているn-1ドライブからチェックサムとデータブロックをリカバリする必要があるため、シーケンシャルな性質になるとは思いません。

これに加えて、私は次のようなややシーケンシャルな操作(=完全並列ではない)を期待します:

  1. datablock1を読み取る
  2. datablock2を読み取る.。
  3. datablockn-1を読み取る
  4. checksum1を読む
  5. datablocknを計算する
  6. datablocknを書き込む

少なくとも5.は同期ポイントであるため、duration(1..4)は少なくともduration(slowest(1..4))です。パフォーマンスは、関連するレイヤー(md、ドライバー、コントローラー(ncqなど))の並列化のレベルによって決まります。

単一ディスクのシーケンシャルな読み取り/書き込み時間の近くで、raid6の再構築率を期待することは決してありません。

比較のために:PS6000 Equallogicアレイ(16x1TB)は、中程度の負荷の下で、障害が発生したディスクを再構築するのに約32時間かかります。

0
tim