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