IOzoneによるファイルシステムのパフォーマンス測定

  IOzone は、ファイルの大きさの違いによってレコードの入出力速度がどう変化するかを調べることでファイルシステムのパフォーマンスを測定するベンチマークプログラムである。IOzoneを使用すると、Bonnie++で得られる読み取り、書き込み、再書き込みの測定値よりも詳細な情報を得ることができる。IOzoneはファイルの入出力性能が期待したほど引き出されていないような領域を見つけるのに向いている。

 IOzoneの入手方法だが、openSUSE 10.3ではワンクリックインストールで提供され、Ubuntu Hardyではmultiverseリポジトリにて提供される。また、Fedora 9では標準リポジトリに収録されている。

 IOzoneを簡単に起動するには、-aオプションを付けて完全自動モードにするとよい。その際、-gオプションでファイルサイズの上限をシステムのメインメモリサイズの2倍に設定する。

$ time iozone -a -g 4G >|/tmp/iozone-stdout.txt

 いずれのオプションでもサイズ値に単位(メガバイトまたはギガバイト)を表す接尾辞のmまたはg(大文字と小文字は区別されない)を付けることができる。標準出力をファイルにリダイレクトすれば、端末のデータをコピーしなくても出力からグラフを生成できる。呼び出しをtimeコマンドでラップして呼び出しの全体にかかった時間を知ることができる。これでIOzoneの実行に相当時間がかかることがわかるので、これ以降の呼び出しについては、関心のある特定の領域だけテストしてすべてのテストが実行されるのを待たなくて済むように呼び出しの方法を調整することになるだろう。6台の750GBのドライブで構成されるハードウェアパリティRAIDに対して上記のコマンドを実行すると数時間かかる。

 -nオプションを使用すると、自動モードでのテスト中に使われるファイルサイズの下限を設定できる。通常、テストは64KBのファイルから開始され、そのサイズがテストサイクルごとに倍加されていく。システムバッファのキャッシュに入り切らないような大きなファイルについてだけテストしたいときは、-nオプションでテストの範囲を絞り込むことにより時間を節約できる。また、-gオプションの代わりに-sオプションを使用すると、指定した特定のサイズのファイルについてだけテストが行われる。下記のコマンドでは、テストに4GBのファイルだけが使われ、レコードサイズは4KBから256KBの間で増やされる。

$ time iozone -a -s 4G -q 4 -y 256 >|/tmp/iozone-stdout.txt

 IOzoneによるテストでは、読み取り、書き込み、再読み取り、再書き込みなどの単純な測度を初めとして、多くの項目が計測される。読み取りと書き込みについては説明は不要だろう。再読み取りは、最近読み取られたファイルがシステムに適切にキャッシュされるかどうかを表す測度である。再書き込みテストは2種類ある。「単純再書き込み」では既存のファイルが上書きされ、「レコード再書き込み」ではファイル内の特定の場所に何度も書き込みが行われる。

 通常の読み取りおよび書き込みテストは、一時ファイルに対してデータをシーケンシャルに読み書きすることで行われる。ランダムな読み取りおよび書き込みテストもあり、その場合は、シーケンシャルな読み書きではなく、一時ファイルの一部分だけが読み書きされる。RAID上に作成されたファイルシステムに対してIOzoneを実行しようと考えておられる方は、ストライド読み取りテスト(-jを参照)に関心があるだろう。ストライド読み取りテストでは、RAIDストライプ境界に整列していないレコードの読み取りでパフォーマンスに不利な条件が生ずるかどうかを知ることができる。たとえば、4台のディスクで構成されるRAID-5では、データはチャンク単位(通常は64KB)に分割されて3台のディスクに書き込まれ、パリティが4台目のディスクに書き込まれる。つまり、ディスク1の先頭はチャンク1、ディスク2の先頭はチャンク2、ディスク3の先頭はチャンク3となり、ディスク4にチャック1~3のパリティが収容される。このチャンク1~3をRAIDストライプと呼ぶ。パリティのチャンクをストライプに含めることもある。チャンクとパリティの順序はストライプごとに変更され、たとえば、2番目のストライプでは、パリティがディスク1に、チャンク4~6がディスク2~4に収容されるようなことになる。ストライプ内のいずれかのチャンクが変更されるとパリティを更新する必要があるので、パリティの保存場所を変化させることは、入出力をRAID内のすべてのディスクに均等化するのに役立つ。通常、アプリケーションは、チャンクまたはストライプ境界にあるレコードを操作しようとする。IOzoneのストライドパラメータを使用すると、RAIDストライプに整列している場合と整列していない場合について読み取り要求のパフォーマンスをテストできる。ストライド読み取りテストでは、指定したストライドオフセットで(つまり指定したバイト数を隔てて)レコードが読み取られるので、ストライドをRAIDチャンクサイズの倍数に設定するとよいだろう。読み取り、書き込み、再書き込み、再読み取りのテストをバッファ付きのfread()およびfwrite()コールで実行するバージョンもある。これらのテストはCライブラリによるパフォーマンス上のボトルネックを調べるのに役立つだろう。