USBメモリによるRAID0
実験に使ったのはA-DATAのUSBメモリ。2Gで2000円を切る値段だったけど、一応ReadyBoost対応をうたっている製品だ。
まずは4本でRAID0を構成する。
sudo mdadm --verbose --create /dev/md0 --level=0 --raid-devices=4 /dev/sd[bcde]
4本をLinuxのソフトウェアRAIDで繋いだときの性能。まずは単純なhdparamによるread性能測定。
単体
/dev/sdb: Timing buffered disk reads: 48 MB in 3.04 seconds = 15.80 MB/sec
RAID0
/dev/md0: Timing buffered disk reads: 136 MB in 3.03 seconds = 44.83 MB/sec
単純に合算したほどには伸びるわけではないけど、まずまずの伸び。
次はsysbenchによるrandom I/O性能。条件は出力結果にもある通り、128個で合計4Gbytesのファイルへ同期読み込みを行ったときの結果。主記憶は2.5G、I/Oの単位はRAIDと同じブロックサイズに揃えた、スレッド数もRAIDの玉数に揃えて4。
まずはrandom read性能。
sysbench v0.4.8: multi-threaded system evaluation benchmark Running the test with following options: Number of threads: 4 Extra file open flags: 0 128 files, 32Mb each 4Gb total file size Block size 64Kb Number of random requests for random IO: 10000 Read/Write ratio for combined random IO test: 1.50 Periodic FSYNC enabled, calling fsync() each 100 requests. Calling fsync() at the end of test, Enabled. Using synchronous I/O mode Doing random read test Threads started! Done. Operations performed: 10000 Read, 0 Write, 0 Other = 10000 Total Read 625Mb Written 0b Total transferred 625Mb (65.185Mb/sec) 1042.96 Requests/sec executed Test execution summary: total time: 9.5881s total number of events: 10000 total time taken by event execution: 38.3215 per-request statistics: min: 0.0000s avg: 0.0038s max: 0.1218s approx. 95 percentile: 0.0150s Threads fairness: events (avg/stddev): 2500.0000/26.57 execution time (avg/stddev): 9.5804/0.00
1000 requests/secを超えているのは流石シリコンメディア。以下は比較対象の500GのHDD(ST3500630AS)。
Operations performed: 10000 Read, 0 Write, 0 Other = 10000 Total Read 625Mb Written 0b Total transferred 625Mb (9.0068Mb/sec) 144.11 Requests/sec executed Test execution summary: total time: 69.3922s total number of events: 10000 total time taken by event execution: 277.4788 per-request statistics: min: 0.0000s avg: 0.0277s max: 0.5235s approx. 95 percentile: 0.3611s Threads fairness: events (avg/stddev): 2500.0000/28.92 execution time (avg/stddev): 69.3697/0.01
で、一方はrandom write性能。
USBメモリ
Operations performed: 0 Read, 10000 Write, 12800 Other = 22800 Total Read 0b Written 625Mb Total transferred 625Mb (1.0435Mb/sec) 16.70 Requests/sec executed Test execution summary: total time: 598.9268s total number of events: 10000 total time taken by event execution: 18.8511 per-request statistics: min: 0.0000s avg: 0.0019s max: 0.4391s approx. 95 percentile: 0.0002s Threads fairness: events (avg/stddev): 2500.0000/264.25 execution time (avg/stddev): 4.7128/0.64
HDD
Operations performed: 0 Read, 10000 Write, 12802 Other = 22802 Total Read 0b Written 625Mb Total transferred 625Mb (8.4252Mb/sec) 134.80 Requests/sec executed Test execution summary: total time: 74.1821s total number of events: 10000 total time taken by event execution: 1.2490 per-request statistics: min: 0.0000s avg: 0.0001s max: 0.0213s approx. 95 percentile: 0.0002s Threads fairness: events (avg/stddev): 2500.0000/180.05 execution time (avg/stddev): 0.3122/0.03
やはりUSBメモリの性能低下が目立つ。HDDの場合書き込み時にも読み込みの90%以上の性能が出ているのに対して、書き込みに弱いフラッシュの特性で1/20以下の性能に落ち込んでいる。
RAID0で繋いでやれば安い低速USBメモリでもそれなりに実用になるかと思って実験してみたが、それほど甘くはないようだ。今回はChunk sizeが64Kと小さかったこともあるだろうけど、書き込み主体の用途にはRAIDで繋ぐ程度ではどうしようもないみたい。
参考URL
(追記)
RAID1よりJBODの方がフラッシュメモリへのアクセスパターン的にもいいんじゃない?という突っ込みをいただきました。確かにブロックサイズの大きさとのかね合いで、書き込み性能でも有利かもしれないです。
一般的に使われるNAND型フラッシュメモリではブロック単位で消去してから変更箇所も含めて書き戻す動作となるそうです。大容量型の場合は1ブロックは64ページで、1ページは2048byteだそうです。つまり書き込み単位は128Kbyteのようです。RAIDを組むときもこれに合わせた方が有利だと思われます。
以下が128KbytesのChunkでRAID0を構成したときの結果です。書き込み性能が2倍以上に向上しているのがわかると思います。
Operations performed: 0 Read, 10000 Write, 12800 Other = 22800 Total Read 0b Written 1.2207Gb Total transferred 1.2207Gb (2.6943Mb/sec) 21.55 Requests/sec executed Test execution summary: total time: 463.9356s total number of events: 10000 total time taken by event execution: 199.9729 per-request statistics: min: 0.0001s avg: 0.0200s max: 4.8667s approx. 95 percentile: 0.0017s Threads fairness: events (avg/stddev): 2500.0000/160.54 execution time (avg/stddev): 49.9932/3.12