2004.09.22
これまでRAID0(ストライピング)は、動画編集のような用途で大容量とシーケンシャル アクセス性能の向上を目的にした技術と思っていましたが、たまたまインテルが掲載した記事を見ていると、ストライプ サイズを大きくすると非シーケンシャル I/O の性能が向上するという記述がありました。
「非シーケンシャル I/O」というのはランダム アクセスになりますが、よくよく考えたらそうなることも理解できます。
これまでRAID0を使うことは何度かありましたが、大容量ドライブを作るために使っていたので、速度や性能についてはたいして気にしていませんでした。
それで今回は、ストライプ サイズの違いによるRAID0(ストライピング)の性能について調べてみることにします。
RAID 0 - ストライピングの仕組み
まずは、RAID0(ストライピング)の仕組みについて簡単に説明しておきます。
ストライピングは、データを複数のハードディスクに分けて並列してデータ転送することで転送速度を高速化します。
ここでは同じ性能・容量のハードディスクを2台使うという前提で説明しますが、1台で50MB/sの転送速度が出るとしたら、2台同時に転送すれば50MB/s×2で100MB/sの速度が期待できるわけです。実際には様々なオーバーヘッドがあるので単純に2倍になりませんが、高速化の仕組みはこのように単純です。
しかし、ストライピングは常に同時転送できるわけではありません。
ストライピングではハードディスクの領域を一定サイズのブロックで分割して、fig.1のようにHDD-1とHDD-2の領域を交互に使います。
| fig.1 ストライプ サイズのイメージ |
|
このブロックの大きさをストライプ サイズとかチャンク・サイズ(CHUNK SIZE)といいます。
一度に転送するデータサイズがストライプ サイズより大きければ、fig.2ようにブロック1とブロック2の両方から同時に転送できます。
| fig.2: データはHDD-1とHDD-2の両方から同時に転送する。 |
|
しかし、データサイズがfig.3のように小さければ、ブロック1の範囲で収まるのでハードディスクも1台しか使用しません。
| fig.3: データが小さければストライピングしていてもハードディスクは1台しか利用しない。 |
|
ストライピングはランダム アクセスが遅い?
ストライピングでランダム アクセスが遅くなるのは、fig.2のように常に同時転送が起こる場合です。
ハードディスクが目的のデータにアクセスする場合、ヘッドを目的にトラックに移動して、トラック内の目的のセクタにディスクが回転してくるのを待って、それから転送が始まります。
HDD-1とHDD-2から転送するデータサイズが同一なら、転送部分についてはほぼ同じ時間で処理できますが、ヘッド移動と回転待ちについてはハードディスク間で多少の差が出ます。
ヘッド移動(シークタイム)+回転待ち時間はスペック上ではアクセスタイムとして表わされますが、実際の処理時間は一定ではないため平均値として出されます。
ストライピングにより複数同時転送が必要な場合、どちらか遅いほうのハードディスクの処理が完了するのを待つ必要があるために、ハードディスク1台のときよりもアクセスタイムは遅くなります。このためにストライピングでは、ハードディスク1台のときよりもランダム アクセスが遅くなることがあります。
しかし、fig.3のケースではストライピングしていても、ハードディスクは1台しかアクセスしないため、アクセスタイムも1台のときと同じです。
しかも、このような小さなデータサイズのランダム アクセスが連続したり同時に発生すると、HDD-1とHDD-2を交互に使ったり、fig.4のようにHDD-1とHDD-2で異なる場所から同時に転送できる場合もあるため、1台で使用している場合よりもランダム アクセスが速くなることもあります。
| fig.4 処理が分散したり異なる場所にあるデータを同時に転送できる |
|
このようにストライピングでもランダム アクセスが速い場合と遅い場合があり、これはアクセス時のデータサイズとストライプ サイズの関係で決まります。
ようするにストライプ サイズを大きく設定していれば、fig.3/fig.4のようにランダム アクセスが速くなりやすいというわけです。
もちろん、データサイズが小さくても場所によっては、ブロックの境界にまたがって2台のハードディスクにアクセスすることがあります。この場合はfig.2と同じようにランダム アクセスが遅くなりますが、ストライプ サイズが大きいほどそのような回数は減るので全体としてはランダム アクセスは速くなります。
シーケンシャル アクセスが速くならない
ストライピングでも、ストライプ サイズが大きければランダム アクセスに不利なわけではないことは分かったと思いますが、それではストライプ サイズは大きければ、大きいほどいいのでしょうか?
実はストライプ サイズを大きく設定するとシーケンシャル アクセスが遅いというか、速くならないことがあります。
ランダム アクセスが速いのは、ストライピングしていてもアクセス時に1台しかハードディスクを使用しないからですが、これではデータの複数同時転送ができません。
Windows等のOSやアプリケーションが数100MとかGバイト単位の大きなデータを転送する場合でも、一度に転送するのは数10Kから数100Kバイト程度です。
ストライプ サイズを不必要に大きく設定すると、複数同時転送できる回数が減ってしまうため、シーケンシャル アクセスが速くならないことがあります。
したがって、ストライピングを使用する場合、用途や使い方に合わせてストライプ サイズを適切に設定することが重要になります。
ベンチマーク テスト
|
- マザーボード ASUS A7M266
- CPU AMD Athlon 1.33GHz
- RAM 512Mバイト
- OS Windows XP Professional
- SATA RAIDカード システムトークス SATA-RD150C
- PATA-SATA変換 システムトークス SATA-TR150
- ハードディスク Maxtor 6Y200P0
|
|
ストライプ サイズの違いがシーケンシャル アクセスやランダム アクセスにどのように影響するかベンチマーク テストを行ないました。
今回はストライプ サイズの影響を調べるのが目的ですから、ソフトウェアRAIDでもなんでもよかったのですが、システムトークスのSATA RAIDカードSATA-RD150Cを使いました。SATA-RD150Cは Silicon Image Si3112Aチップを採用し、ストライプ サイズは4/8/16/32/64/128Kバイトの中から選択できます。
ハードディスクはMaxtor 6Y200P0を2台用意して、SATA-SATA変換にシステムトークス SATA-TR150を使いました。
6つのストライプ サイズでそれぞれでテストしましたが、比較ためハードディスク単独でもテストしています。
ベンチマーク テストは ソフトウェアライブラリ に登録しているDevTest を使いました。ただし、公開しているDevTestは書き込みテストは実行できません(書き込みテストを実行するとファイルシステムを破壊して危険ですので)。
以下がベンチマークテストの結果です。テストの内容等はDevTestのドキュメントを参考にしてください。
STRIPING BENCHMARK |
TEST |
SINGLE |
STRIPE 4K |
STRIPE 8K |
STRIPE 16K |
STRIPE 32K |
STRIPE 64K |
STRIPE 128K |
Sequential Read/Start |
512B |
3654.5kB/s |
3559.5kB/s |
3577.0kB/s |
3576.7kB/s |
3580.5kB/s |
3554.5kB/s |
3532.5kB/s |
16384B |
57946.7kB/s |
61850.5kB/s |
62003.6kB/s |
61159.0kB/s |
61413.9kB/s |
61603.8kB/s |
61869.1kB/s |
65536B |
57801.2kB/s |
92568.8kB/s |
100723.3kB/s |
98170.8kB/s |
99543.5kB/s |
93155.4kB/s |
94183.6kB/s |
Sequential Read/End |
512B |
3510.4kB/s |
3453.6kB/s |
3466.8kB/s |
3462.9kB/s |
3462.4kB/s |
3455.4kB/s |
3457.5kB/s |
16384B |
42309.4kB/s |
61685.5kB/s |
62491.6kB/s |
62348.9kB/s |
61928.0kB/s |
61176.0kB/s |
60443.4kB/s |
65536B |
42291.2kB/s |
81176.0kB/s |
84552.2kB/s |
83332.6kB/s |
83356.7kB/s |
83254.4kB/s |
81554.3kB/s |
Sequential Read/Ave. |
512B |
3582.4kB/s |
3506.6kB/s |
3521.9kB/s |
3519.8kB/s |
3521.5kB/s |
3505.0kB/s |
3511.9kB/s |
16384B |
50128.1kB/s |
61768.0kB/s |
62247.5kB/s |
61754.0kB/s |
61671.0kB/s |
61389.9kB/s |
61156.3kB/s |
65536B |
50046.2kB/s |
86872.4kB/s |
92637.7kB/s |
90751.7kB/s |
91450.1kB/s |
88204.9kB/s |
87868.9kB/s |
Random Read |
512B |
39.1kB/s |
32.2kB/s |
39.0kB/s |
38.5kB/s |
37.8kB/s |
38.5kB/s |
37.5kB/s |
16384B |
1220.6kB/s |
882.8kB/s |
954.0kB/s |
950.5kB/s |
1034.8kB/s |
1116.4kB/s |
1119.7kB/s |
65536B |
4527.3kB/s |
3290.8kB/s |
3542.8kB/s |
3584.7kB/s |
3484.5kB/s |
3608.5kB/s |
3698.1kB/s |
Sequential Write/Start |
512B |
2512.8kB/s |
2426.9kB/s |
2437.8kB/s |
2387.0kB/s |
2474.3kB/s |
2445.9kB/s |
2498.6kB/s |
16384B |
53438.6kB/s |
59185.1kB/s |
60013.5kB/s |
55159.3kB/s |
53082.2kB/s |
52752.7kB/s |
52618.8kB/s |
65536B |
57870.5kB/s |
88646.0kB/s |
93503.1kB/s |
93253.2kB/s |
93471.3kB/s |
77050.0kB/s |
76948.0kB/s |
Sequential Write/End |
512B |
3090.1kB/s |
2536.7kB/s |
2436.4kB/s |
2394.3kB/s |
2487.7kB/s |
2444.4kB/s |
2503.3kB/s |
16384B |
41966.1kB/s |
58617.7kB/s |
60065.1kB/s |
55043.8kB/s |
54343.2kB/s |
53671.6kB/s |
51564.2kB/s |
65536B |
41716.0kB/s |
67632.2kB/s |
84121.1kB/s |
78173.5kB/s |
78784.3kB/s |
78006.4kB/s |
63845.6kB/s |
Sequential Write/Ave. |
512B |
2801.5kB/s |
2481.8kB/s |
2437.1kB/s |
2390.6kB/s |
2481.0kB/s |
2445.2kB/s |
2500.9kB/s |
16384B |
47702.4kB/s |
58901.4kB/s |
60039.3kB/s |
55101.5kB/s |
53712.8kB/s |
53212.1kB/s |
52091.5kB/s |
65536B |
49793.2kB/s |
78139.1kB/s |
88812.1kB/s |
85713.4kB/s |
86127.8kB/s |
77528.2kB/s |
70396.8kB/s |
Random Write |
512B |
58.4kB/s |
111.6kB/s |
98.9kB/s |
96.2kB/s |
100.0kB/s |
95.1kB/s |
85.3kB/s |
16384B |
1810.4kB/s |
1728.0kB/s |
1649.1kB/s |
1559.5kB/s |
2104.1kB/s |
2382.4kB/s |
2461.6kB/s |
65536B |
6486.8kB/s |
6449.6kB/s |
6441.5kB/s |
5912.7kB/s |
5903.3kB/s |
5890.0kB/s |
7006.3kB/s |
下のグラフはシーケシャル アクセスの性能を見るために、Sequential Read/Start 65536B、Sequential Read/End 65536B、Sequential Write/Start 65536B、Sequential Write/End 65536B についてグラフ化したものです。
グラフで見るとあまり差がないように見えますが、ストライプ サイズが大きくなるほどシーケンシャル アクセスの速度が落ちているのがわかります。
ただし、読み取りに関してはストライプ サイズによる影響は小さいのと、4Kとあまり小さすぎてもだめなようです。ストライプ サイズが小さすぎると、複数同時転送はしやすくても、I/O処理する回数が増えてしまうため遅くなるのだと思います。
ハードディスク単独(ベンチマークではSINGLEと表記)では転送速度は58MB/s程度出ています。
読み取りの最高速度はストライプ サイズ8K時の100.7MB/sで、最低はストライプ サイズ64K時の93.2MB/sで、約7%ほど遅くなっています。
書き込みにについては最高速度はストライプ サイズ8K時の93.5MB/s、最低がストライプ サイズ128K時の76.9MB/sと、約17%遅くなっています。
思ったほど差はついていない感じですが、転送速度がPCIバス帯域の限界に近いために、そこで頭打ちになっている可能性があります。
内周部の転送速度の遅いところを使うとPCIバス帯域に余裕があるためか、書き込み速度の最高はストライプ サイズ8K 84.1MB/s、最低はストライプ サイズ63.8MB/sと、約24%遅くなっています。
シーケンシャル アクセス性能を重視するなら、ストライプ サイズは8Kか16Kあたりがよさそうです。
ストライプ サイズとランダム アクセス性能について
これまでのベンチマークはリードとライトを分離していましたが、ユーザがOSやアプリを使う場合にはリード/ライト共に行われます。そこで、ここではランダムにリード/ライトを行うテストを行なっています。1回に転送するデータサイズも512〜65536Bの範囲でランダムに決まります。これを一定時間実行して、リード/ライトそれぞれの転送速度(kB/s)と、実行回数(io/s)を測ります。
また、リード/ライトの比率を50:50、90:10、10:90の3パターンに分けて計測しています。
Random Read/Write BENCHMARK |
TEST |
SINGLE |
STRIPE 4K |
STRIPE 8K |
STRIPE 16K |
STRIPE 32K |
STRIPE 64K |
STRIPE 128K |
50:50 |
Read Speed |
1353.0kB/s |
807.9kB/s |
1071.5kB/s |
1063.0kB/s |
1071.9kB/s |
1207.7kB/s |
1346.1kB/s |
Write Speed |
1422.8kB/s |
823.8kB/s |
1096.3kB/s |
1083.8kB/s |
1095.2kB/s |
1246.7kB/s |
1406.0kB/s |
Read Count |
41.0io/s |
24.7io/s |
32.7io/s |
32.3io/s |
32.7io/s |
36.7io/s |
41.3io/s |
Write Count |
44.0io/s |
25.3io/s |
33.7io/s |
33.3io/s |
33.7io/s |
38.3io/s |
43.0io/s |
90:10 |
Read Speed |
2122.2kB/s |
1446.7kB/s |
1423.1kB/s |
1463.4kB/s |
1482.9kB/s |
1639.4kB/s |
1772.4kB/s |
Write Speed |
205.2kB/s |
121.4kB/s |
118.9kB/s |
120.3kB/s |
124.9kB/s |
139.5kB/s |
167.8kB/s |
Read Count |
65.0io/s |
44.0io/s |
43.3io/s |
44.7io/s |
45.3io/s |
50.0io/s |
54.7io/s |
Write Count |
6.0io/s |
3.0io/s |
3.0io/s |
3.0io/s |
3.0io/s |
4.0io/s |
4.7io/s |
10:90 |
Read Speed |
271.8kB/s |
264.6kB/s |
271.0kB/s |
268.1kB/s |
280.7kB/s |
309.7kB/s |
347.9kB/s |
Write Speed |
2778.0kB/s |
2687.3kB/s |
2776.5kB/s |
2734.9kB/s |
2896.6kB/s |
3183.4kB/s |
3607.7kB/s |
Read Count |
8.0io/s |
8.0io/s |
8.0io/s |
8.0io/s |
8.3io/s |
9.0io/s |
10.0io/s |
Write Count |
85.3io/s |
82.7io/s |
85.7io/s |
84.0io/s |
89.3io/s |
98.0io/s |
111.3io/s |
ストライプ サイズとランダム アクセス性能の関係についてはグラフを見てもよく分かると思います。ストライプ サイズが大きくなるほど、ランダム アクセス性能は向上しています。
ストライプ サイズ4〜16Kの範囲では、ハードディスク単独使用時よりもランダム アクセスは遅くなっています。
読み取りについてはハードディスク間で同期が必要なためストライプ サイズを大きくしてもなかなか速くならないようですが、読み書きの頻度が同程度ならストライプ サイズ128K時で単独使用時とほぼ同じ性能となります。
ランダム アクセスの書き込みについてはストライプ サイズ64K以上あれば単独使用時よりも速くなるようです。
また、書き込みについてはライト キャッシュによる遅延書き込みや、コマンド・キューイングによる最適化との相乗効果で、さらに速くなる可能性もあります。
今回使用したRAID0ではストライプ サイズの最大は128Kバイトまででしたが、256Kとか512Kとかもっと大きく設定できればさらにランダム アクセスは速くなるはずです。
データサイズ64Kバイトでランダム アクセスを行なう場合、ストライプサイズ128Kだと確率的に半分の50%がハードディスク1台のアクセスで済むことになりますが、残り50%はハードディスク2台にアクセスするためにランダム アクセスが遅くなる可能性があります。
ストライプ サイズをもっと大きく設定できればハードディスク1台でアクセスする確率が高くなります。たとえば、ストライプ サイズ256Kだと75%、ストライプサイズ512Kだと87.5%はハードディスク1台のアクセスで済むので、ランダム アクセスの読み取りについてもかなり速くなるはずです(そのかわり、シーケンシャル アクセス性能は低下しますが)。
まとめ
これまでの結果を見ても、ストライプ サイズが小さいとシーケンシャル アクセスに有利で、ストライプ サイズが大きいとランダム アクセスに有利なことがわかるかと思います。
2台でのストライフビングでいえば、動画編集などでシーケンシャル アクセスを重視するならストライプ サイズは8K/16K、OSやアプリケーション等を使用するランダム アクセスを重視するなら64K/128Kバイト、両者のバランスを取るなら32Kでもいいかと思います。
さらにランダム アクセスを重視するならストライプ サイズ256Kとか512Kとか大きな設定ができるRAIDを使う方法もあるでしょう。
構成するハードウェアやハードディスク性能にもよると思いますが、シーケンシャル・リードについてはストライプ サイズの影響は少ないようです。ストライプ サイズを大きく設定してもシーケンシャル・リードはあまり遅くならないので、読み取りが中心ならストライプ サイズを大きく設定したほうがよさそうです。
シーケンシャル・ライトについてはストライプ サイズが大きいと数10%遅くなるので、動画等の大きなファイルを保存するために書き込み速度を重視するならストライプ サイズは小さいほうがいいでしょう。
【関連記事】
→ 2004.05.07 ハードディスク ベンチマークテスト 2004-05
→ 2004.01.03 SATA変換アダプタ ベンチマーク
【参考資料】
○INTEL
→http://www.intel.com/
○INTEL (Japan)
→http://www.intel.co.jp/
Technology@intel Magazine - Configuring Systems for Optimum Performance and Control
→http://www.intel.com/update/contents/dt01041.htm
○システムトークス
→http://www.system-talks.co.jp/
○Maxtor
→http://www.maxtor.com/
|