RAIDアレイをなんらかの指標をもとに設計するとき、容量、性能および安全性と価格が最初に来るのはともかくとして、それに付随する重要な要素としてディスクがfailしたときのリビルドの所要時間およびリビルド中のパフォーマンス低下具合についても注意は必要だ。ほぼ切れ目なく高負荷がかかり続けるような用途ならそれを前提としてパフォーマンスの最低ライン(つまりRAIDアレイのリビルド中のスループット)をそこに合わせる必要があるし、日中のみ高負荷がかかるが夜間はほとんどI/Oが発生しないような用途であれば、夜間帯のうちにリビルドが終わることがわかっていればリビルド中のパフォーマンス低下が大きくても許容できる。用途を考え、数値を計測することがなによりもはじまりとなる。
リビルド中のパフォーマンスを正確に見積もるのは難しい。ストレージの性能特性は様々な要因によって左右される。read/writeの比率の想定が必要なのは言うまでもないし、ランダムアクセス・シーケンシャルアクセスの配分、さらにはI/Oオペレーションあたりの読み出し/書き込みバイト数の大小によっても性能特性は変わってくる。巨大なwrite bufferを持っているRAIDコントローラであれば、小さいI/Oを発行している限り全く性能が落ちないように見える、ということもあるかもしれない。
またハードウェアRAIDとソフトウェアRAIDによっても大きく異なる。ハードウェアRAIDの場合、コントローラに使用されているプロセッサの特性がユーザから隠蔽されていることが多く、その性能特性の傾向を想像できないのはちょっと痛い。*1
またリビルドの所要時間の見積りも難しい。リビルドに並行して走るI/Oによって左右されるのはもちろん、ディスクの接続インターフェイス(FC/SAS/SATA/ATA)、使用するHDD1台あたりの容量とプラッタ数、RAIDコントローラの性能などなど、あらゆる要素が影響してくる。ただし最良ケースでの所要時間計測は簡単で、要するに負荷のかかってないRAIDアレイをわざとfailさせ、リビルドをかければいい。
最良ケースでの数値の計測は重要で、要するに「最悪、処理から切り離してしまえばその時間内に終わる」のだ。書き込みだけを続けるような用途(バックアップとか)であればその間は別のディスクに書いておくなどできるケースもあるだろうし、夜間帯にその日だけはメンテナンスとして止めることができるケースもあるだろう。用途次第であって、そして特定のRAIDを一時的に止められる、というケースは世の中に割と多いはず。*2
計測してみた
ということで、手元のマシンで計測してみた。
計測環境
使用したのは HP DL180 (Xeon 4Core HT 1CPU, Memory 12GB) + Smart Array P410 なマシン。ただしSmart Arrayは追加ライセンス入れないとRAID-6が使えなかった*3ので、今回はただのBBUつきSATAカード扱いにしている。ディスクは SATA 2TB を12本*4。
ソフトウェアは CentOS 5.6 (Linux kernel 2.6.18-238.9.1) + mdadm 2.6.9-3 という構成で md を組んでいる。まっさらなマシンで、今回のテスト時には何の処理もさせていない。
計測内容
計測対象のRAIDアレイ構成は以下の通り。論理容量と書いたが、要するに2TBのHDD何台分のデータが入るか、くらいの意味。*5
名前 | 論理容量 | 構成 | RAIDレベル |
---|---|---|---|
A | 2TB | 2TB x2 | RAID-1 |
B | 2TB | 2TB x3 | RAID-1 |
C | 10TB | 2TB x6 | RAID-5 |
D | 10TB | 2TB x7 | RAID-6 |
E | 20TB | 2TB x11 | RAID-5 |
F | 20TB | 2TB x12 | RAID-6 |
これらのアレイ構成の各パターンについて、以下の内容をそれぞれ行った。(なおアレイBのリビルドだけは、あほくさくなったので省略した。)
- アレイの構成
- mdadm --create してから、初期の同期が終わるまでに時間を計測
- アレイのリビルド
- mdadm --manage md -f dev -r dev して明示的に1台のディスクをfail/除去
- mdadm --zero-superblock dev して初期化後 mdadm --manage md -a dev して、リビルドが終わるまでの時間を計測
なお処理の終了は5秒ごとに /proc/mdstat を見てその結果をparseして、とやっているので、秒単位の誤差は含まれる。また各計測を1回ずつしか試行していないので試行ごとの変動幅がどの程度の見積りかも計測はしていない。
計測結果
以下のようになった。構成時の結果。
対象 | 構成所要時間 | 論理容量1TBあたりの秒数(sec/TB) | 処理速度(物理KB/sec) | HDDあたり処理速度(物理KB/sec) |
---|---|---|---|---|
A(x2 RAID-1) | 4:46:33 | 8596.5 | 232.65 | 116.33 |
B(x3 RAID-1) | 4:46:09 | 8584.5 | 349.47 | 116.49 |
C(x6 RAID-5) | 5:10:56 | 1865.6 | 643.22 | 107.20 |
D(x7 RAID-6) | 6:22:12 | 2293.2 | 610.50 | 87.21 |
E(x11 RAID-5) | 7:36:20 | 1369.0 | 803.51 | 73.05 |
F(x12 RAID-6) | 8:50:07 | 1590.35 | 754.55 | 62.88 |
およびリビルド時の結果。
対象 | リビルド所要時間 | 論理容量1TBあたりの秒数(sec/TB) | 処理速度(物理KB/sec) | HDDあたり処理速度(物理KB/sec) |
---|---|---|---|---|
A(x2 RAID-1) | 4:43:47 | 8513.5 | 234.92 | 117.46 |
C(x6 RAID-5) | 5:05:26 | 1832.6 | 654.81 | 109.13 |
D(x7 RAID-6) | 6:27:44 | 2326.4 | 601.79 | 85.97 |
E(x11 RAID-5) | 9:32:01 | 1716.05 | 641.01 | 58.27 |
F(x12 RAID-6) | 9:31:43 | 1715.15 | 699.65 | 58.30 |
アレイAおよびBの結果とEやFの結果を較べると、思ったほどには変わらないな、というのが正直なところじゃないだろうか。どっちにしろひと晩あれば終わる。また逆に、RAID-1であればすぐに終わる、という時間でもない。EとFの処理速度が全く違わないことから、要するにパリティ計算なんぞ何の問題でもないということだ。
20TB、12台よりも大きい構成でアレイを組むというなら個別に確認した方がいいだろうが、いきなり数日かかって終了ということにはなりそうにないのがわかるだろう。
なおRAID-1+0構成の場合はどの1台がfailしてもRAID-1ひとつ分のリビルド時間で済むという利点はあるから、RAID-1+0との比較を求めている向きにはこの表の「1TBあたりの秒数」はかなり不平等な数字である。
ハードウェアRAIDの場合は?
今回使用した機材の HP SmartArray でもいちおうハードウェアRAIDのリビルドを試そうとしたんだけど、RAIDアレイを編成した瞬間に「OK」と言われて同期中であるステータスも確認できなかったので、その時点で諦めた。誰か潤沢な機材を有している人にぜひあれこれ試して数値を公開してほしい。
先程も書いたが、コントローラがマルチコアプロセッサを使っているか、メモリはどの程度載っているか、などによってもかなり異なる。逆に言うとこの数年で、RAID-6で必要とされるような演算が処理負荷としては問題にならない程度のものになった可能性は極めて高い。数年前のベンチ結果を信じたままの人は認識を改めた方が良かろうと思う。なにはともあれ計測し直すべき。
以下あれこれ
脳内の自分と想定問答してみる。
リビルド中のパフォーマンスが落ちるのが問題だっつってんだろ!!1!
お前の用途にあわせて自分で計測しろっつってんだろ!!1!!!1!
*1:例えばマルチコアプロセッサが使われていれば、継続的なI/Oをさばく一方でリビルド処理が走っていてもそれなりにこなせそう、というような想像ができる局面は多い。
*2:そして、できるだけそうできるように設計すべきである。
*3:価格はともかく、時限付ライセンスを管理するのってめちゃくちゃ面倒なんだよね……。追加費用の場合でも買いきりにしてくれればいいのに。
*4:HW RAIDカードの設定としては、ディスク1本構成のRAID-0を12個w
*5:厳密にはmdのスーパーブロックがあるから各パーティションで更に少しずつ容量を喰うが。
*6:fs作ってる人がいるんだからそういうところにあるんだろうけど……。