2011年11月14日月曜日

RAID-Zは遅いよ

このエントリーをはてなブックマークに追加
以前紹介しましたが、ftp.jaist.ac.jpのストレージは2TBのDeskstar 7K2000を24個積んでいます。ZFSの構成は、11個ずつでRAID-Z2を2つ作りストライピングしています。残りの2個はRAID-Z2のスペアです。この構成の問題は読み込みのIOPS (1秒間あたりに可能な読み込み回数)がとても少ない低いことです。

RAID-Zは普通のRAIDと異なり、RAIDを組むディスクの個数を増やしても読み込みのIOPSは上がりません。普通のRAIDでは複数のブロックへのアクセスを複数のディスクで同時に行えるので、ディスクの数を増やせばIOPSが向上します。RAID-Zでは1つのブロックをすべてのディスクに分けて書き込みます。そのため1つのブロックを読むときには、パリティを除くすべてのディスクにアクセスする必要があります。
RAID 5とRAID-Zを比較したのが上の図です。理想的な場合にRAID 5が5つのブロックを同時に読み込めるのに対して、RAID-Zでは5つのディスクを全部読んで1ブロック分です。そのためRAID-Zは構成するディスクが何個でもIOPSはディスク1個分です。ですからディスク11個でRAID-Z2という構成は普通はしません。もっと少ないディスクでRAIDを組んで、より多くのRAIDグループをストライピングします。

ftp.jaist.ac.jpは2つのRAID-Z2のストライピングですからIOPSはディスク2個分です。ftp.jaist.ac.jpのワークロードはおおむね128kB単位のランダムアクセスです。それなりにIOPSを必要とするので、このワークロードにおける転送速度のピークは100MB/sec前後です。ネットワークインターフェイスの帯域の4Gbpsにはまったく届きません。

しかし、ストレージの転送速度は低くても問題ありません。アクセスが一部のファイルに偏っていてキャッシュが効きやすいからです。ZFSにはメモリキャッシュのARCと、SSDによるキャッシュのL2ARCがあります。メモリは64GBあり、そのうち40GBほどがARCに使われていて90%強ヒットします。L2ARCは320GBで40%ほどヒットします。つまり94%はキャッシュでひろえます。

十分なヒット率ですが、全面的にARCとL2ARCに依存することはできません。再起動するとキャッシュが消えるからです。L2ARCはSSDですがメタデータがメモリに あるので再起動すると消えます。再起動後にデータがある程度キャッシュされるまで1時間くらいかかるので、その間はストレージの性能不足に悩まされます。そこで再起動しても消えないSSDキャッシュ機構(pcache)を作りました。これを利用して、ARCとL2ARCにデータがキャッシュされるまでの時間をかせいでいます。

[2011/11/15 修正] 性能という記述が誤解をまねいているのでIOPSに改めました。
[2011/11/28 修正] シーケンシャルリードの場合の補足が間違えていたので修正しました。
[補足] シーケンシャルリードの場合には、D1~D5の読み込みが一度に行えるようにスケジューリングされます。各ディスクで連続したブロックを一度に読み込めるので転送速度は上がります。この記事ではランダムリードを想定しています。D1~D5にランダムにリクエストが来たときには、ハードディスクのシークと回転待ちの遅延が入ります。そのためIOPSも転送速度も上がりません。

2 件のコメント:

  1. RAID-Z/Z2/Z3 ではストライプ幅が可変なので、読み込み時でも、図にあるように常に全ドライブへのアクセスが必要とはならないようです。また、複数の読み込みがある程度まとめられるため、worst case として、非常に細かいランダムな読み込み要求がくると、HDD 1 本分の read/s 性能しか出ないということになります。このあたりの弱点を改善したのが、RAID-Z/mirror hybrid allocator とよばれるもので、メタデータの一部を mirror として置くことで、IOPS 性能を向上させるという狙いです。
    なお、書込は全て sequential にまとめられます。

    http://blogs.oracle.com/roch/entry/when_to_and_not_to
    http://blogs.oracle.com/oracle4engineer/entry/zfs_1

    では、RAID-Z (single parity) として group 数を増やせばよいかというと、上記資料にあるように、1TB HDD では 3D+1P でも再構成失敗率が数 % あり、かといって 2D+1P にすると容量がもったいない感じで、なかなか難しいところです。

    返信削除
  2. ストライプ幅が可変というのは誤解です。中の人ですらよく間違えます。ZFSのソースコードを読めばわかるのですが、RAID-Zではサイズが512byte以下にならない限りRAIDグループの全ドライブに書き込みます。読むときにも全ドライブを読みます。

    返信削除