ネットワーク/ストレージの処理能力をチェックするためのベンチマークツール
ストレージの性能を調査するベンチマークツール
続いて、ストレージの性能を調査するためのベンチマークツールについて紹介しよう。ストレージ性能の評価基準としては、まず読み書き速度が挙げられる。ただ、ネットワークの場合とは異なり、多くのストレージではアクセスのしかたによってそのパフォーマンスが異なる。一般的にもっともパフォーマンスが高いのが、「シーケンシャルアクセス」という、連続したデータを一気に書き込むようなアクセスだ。いっぽう、小さいデータをさまざまな個所に書き込むような「ランダムアクセス」はシーケンシャルアクセスよりもパフォーマンスが落ちることが多い。ベンチマークツールにはシーケンシャルアクセスのみの性能測定しかできないものもあるので、目的に応じて使用するベンチマークツールを選択する必要がある。
ベンチマークツールとしてよく知られているものとしては、表1が挙げられる。
ツール名 | 説明 |
---|---|
hdparm | 本来はSATA/IDEデバイスのパラメータ設定ツールだが、デバイスの読み込み速度を測定するベンチマーク機能がある |
Bonnie++ | ファイルへのI/O速度と、ファイルの作成/メタデータ取得/削除速度を測定するツール(解説記事) |
dbench | ユーザーが定義したI/O処理を実行してその速度を測定するツール |
fs_mark | 指定したサイズのファイルを指定した数だけ作成し、その速度を測定するツール |
tiobench | 複数スレッドから同時にファイルシステムにアクセスし、その速度を測定するツール |
IOzone | ファイルサイズなどの実行条件を変えながらファイルシステムにアクセスし、その速度を測定するツール(解説記事) |
fio | 指定した条件でファイルシステムにアクセスし、その速度を測定するツール(解説記事) |
今回はこのうち、多くの環境で簡単に利用できるhdparmコマンドと、多機能かつ簡単に実行できるBonnie++、過去にSourceForge.JP Magazineで取り上げていないfs_markおよびtiobenchについてその使い方を紹介する。
なお、ストレージの性能を調査する際に注意が必要なのが、ほぼすべてのファイルシステムでメモリを使ったキャッシュが行われている点だ。Linuxでは、空きメモリを積極的にファイルシステム用のキャッシュとして利用するような仕組み(ページキャッシュ)が使われている。そのため、ファイルシステム上でファイルの読み書きを行うベンチマークツールの場合、キャッシュによってストレージ本来の性能以上の結果が出てしまう可能性がある。キャッシュの影響を小さくするためには、テストに使用するファイルの総サイズを搭載する物理メモリの総量よりも大きくすれば良い。ベンチマークツールによって異なるが、搭載物理メモリの2倍程度が目安と言われている。また、Linuxの場合、起動時のカーネルパラメータで「mem=<メモリ容量>」というオプションを指定することで、使用するメモリ量を制限できる。これを利用して、ベンチマークテスト時にはあえて利用できるメモリ容量を少なくする場合もある。たとえば搭載しているメモリのうち256MBのみを使用するには、起動時に以下のようなカーネルオプションを指定すれば良い。
mem=256M
簡易的にベンチマークを実行できるhdparmコマンド
ストレージの読み込み速度を簡易的に調べるには、hdparmコマンドを利用できる。hdparmコマンドは元々はSATA/IDEデバイスの設定パラメータを確認・変更するためのツールなのだが、「-t」および「-T」オプションを利用することで読み込み速度を調査できる簡易的なベンチマークテストを実行できる。「-t」オプションではキャッシュなし読み込み速度を、「-T」オプションではキャッシュ付き読み込み速度の測定が可能だ。どちらの場合も、実行にはroot権限が必要となる。
たとえば、「/dev/sda」のキャッシュなし読み込み速度を測定するには次のようにする。
# hdparm -t /dev/sda /dev/sda: Timing buffered disk reads: 90 MB in 3.05 seconds = 29.47 MB/sec
この場合、読み込み速度は29.47MB/秒となっている。また、同じデバイスに対しキャッシュ付き読み込みでテストを行った結果が次の例だ。
# hdparm -T /dev/sda /dev/sda: Timing cached reads: 18232 MB in 2.00 seconds = 9129.84 MB/sec
この場合、キャッシュの効果によって9129.84MB/秒という非常に高速な結果が得られている。
Bonnie++
Bonnie++は、ファイルシステムの処理性能を測定するベンチマークツールだ。Red Hat Enterprise Linux(RHEL)やその互換ディストリビューションでは、EPELというFedoraプロジェクトが提供しているパッケージリポジトリからRPMパッケージの入手が可能だ。また、Debianでは公式リポジトリで「bonnie++」という名称でパッケージが公開されている。
bonnie++ではファイルに対するI/Oとファイルの作成/削除を行い、その性能を測定する(表2)。
シーケンシャル書き込み | 文字単位での書き込み(Per-Character) | putc()関数を使って1文字づつファイルを書き込む |
---|---|---|
ブロック単位での書き込み(Block) | writeシステムコールを使ってブロック単位でファイルの書き込みを行う | |
上書き(Rewrite) | readシステムコールでファイルを読んだのち、writeシステムコールでそこにデータを上書きする | |
シーケンシャル読み込み | 文字単位での書き込み(Per-Character) | putc()関数を使って1文字づつファイルを書き込む |
ブロック単位での書き込み(Block) | writeシステムコールを使ってブロック単位でファイルの書き込みを行う | |
ランダムシーク(Random Seeks) | lseek()関数をランダムな値を指定して連続実行してその処理速度を調査する | |
シーケンシャルなファイル処理 | 作成(Create) | 7桁の数字からなるファイル名を持つファイルを作成し、番号順にファイルの作成、読み込み、削除を行う |
読み込み(Read) | ||
削除(Delete) | ||
ランダムなファイル処理 | 作成(Create) | ランダムなファイル名を持つファイルを作成し、ランダムにファイルの作成、読み込み、削除を行う |
読み込み(Read) | ||
削除(Delete) |
bonnie++は通常/usr/sbin以下にインストールされるが、実行自体は一般ユーザー権限で行える。実行の際はとくにオプションなどを指定する必要はない。テストしたいファイルシステム上でbonnie++を実行すると、次のようにその実行結果が表示される。
$ /usr/sbin/bonnie++ Writing a byte at a time...done Writing intelligently...done Rewriting...done Reading a byte at a time...done Reading intelligently...done start 'em...done...done...done...done...done... Create files in sequential order...done. Stat files in sequential order...done. Delete files in sequential order...done. Create files in random order...done. Stat files in random order...done. Delete files in random order...done. Version 1.96 ------Sequential Output------ --Sequential Input- --Random- Concurrency 1 -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks-- Machine Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP /sec %CP t001 1G 394 98 74326 16 20347 4 1584 96 157469 15 157.1 2 Latency 34677us 520ms 2557ms 39304us 69247us 770ms Version 1.96 ------Sequential Create------ --------Random Create-------- t001 -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete-- files /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP 16 3437 97 +++++ +++ +++++ +++ 3678 96 +++++ +++ 13754 92 Latency 62812us 200us 150us 720us 186us 519us 1.96,1.96,gate,1,1377689859,1G,,394,98,74326,16,20347,4,1584,96,157469,15,157.1,2,16,,,,,3437,97,+++++,+++,+++++,+++,3678,96,+++++,+++,13754,92,34677us,520ms,2557ms,39304us,69247us,770ms,62812us,200us,150us,720us,186us,519us
ここで、「%CP」の項目はそのテストの実行中のCPU使用率を、「/sec」は1秒あたりの処理回数を示している。一部「++++」として値が表示されていない項目があるが、それは処理時間が短すぎて計測できなかった、という意味だ。今回はファイルの作成/読み取り/削除に関する処理でこのような表示がされているが、この場合はテストに使用するファイルの数を増やしてやればよい。ファイルの数を増やすには、「-n」オプションを使用する。ここで指定した数の1024倍のファイルが使用するファイル数となる。デフォルトは16、つまり16×1024=16384個のファイルを作成/読み取り/削除することになる。ただし、この値を大きくするとテスト時間が増加するため、何度か繰り返して適切な値を探ると良いだろう。
また、最後の行はベンチマークテスト結果をCSV形式で表示したものとなっている。bonnie++にはこのCSV形式データをHTML形式に変換するbon_csv2htmlというツールが含まれており、このデータをこれらプログラムに標準入力経由で渡すことでHTML形式の表を作成できる。
echo "1.96,1.96,t001,1,1377689859,1G,,394,98,74326,16,20347,4,1584,96,157469,15,157.1,2,16,,,,,3437,97,+++++,+++,+++++,+++,3678,96,+++++,+++,13754,92,34677us,520ms,2557ms,39304us,69247us,770ms,62812us,200us,150us,720us,186us,519us" | bon_csv2html > result.html
作成された表は、図3のようになる。慣れない場合はこちらのほうが値を確認しやすいだろう。
fs_mark
fs_markは、ファイルシステム上に多数のファイルを作成して読み取りや削除、メタデータの取得といった操作を行い、その処理にかかった時間を測定するというベンチマークツールだ。bonnie++にも似たようなテスト項目があるが、fs_markは作成するファイルのサイズやファイル数などを簡単に指定できるのが特徴となる。
Debian 7.0(wheezy)以降のDebianでは、「fsmark」という名称でパッケージが提供されている。また、RHELやその互換ディストリビューション向けにはEPELからfs_markという名称のパッケージが提供されている。
manページは用意されていないが、--helpオプションで簡易的なオプション一覧を確認できる。それぞれのオプションの詳細についてはREADME(/usr/share/doc/fs_mark-3.3/以下などにインストールされる)に記載されているが、そのうち必須なのはテストに使用するディレクトリを指定する-dオプションだ。そのほか、よく使われるパラメータとしては、作成するファイルの数を指定する-nオプションと、作成する1ファイル当たりのサイズを指定する-sオプションがある。たとえば次の例は、カレントディレクトリで1MB(1024×1024=1048576B)のファイルを1024個作成するテストを実行するものだ。
$ fs_mark -d . -n 1024 -s 1048576 # fs_mark -d . -n 1024 -s 1048576 # Version 3.3, 1 thread(s) starting at Thu Aug 29 18:27:19 2013 # Sync method: INBAND FSYNC: fsync() per file in write loop. # Directories: no subdirectories used # File names: 40 bytes long, (16 initial bytes of time stamp with 24 random bytes at end of name) # Files info: size 1048576 bytes, written with an IO size of 16384 bytes per write # App overhead is time in microseconds spent in the test not doing file writing related system calls. FSUse% Count Size Files/sec App Overhead 10 1024 1048576 9.4 19055
この例では、1秒あたり9.4ファイルの書き込みが実行できたことになる。1ファイルのサイズは1MBなので、スループットとしては9.4MB/秒程度となる。
また、vオプションを付けるとより詳細な実行結果が表示される。
$ fs_mark -d . -n 1024 -s 1048576 -v # fs_mark -d . -n 1024 -s 1048576 -v # Version 3.3, 1 thread(s) starting at Thu Aug 29 18:31:49 2013 # Sync method: INBAND FSYNC: fsync() per file in write loop. # Directories: no subdirectories used # File names: 40 bytes long, (16 initial bytes of time stamp with 24 random bytes at end of name) # Files info: size 1048576 bytes, written with an IO size of 16384 bytes per write # App overhead is time in microseconds spent in the test not doing file writing related system calls. # All system call times are reported in microseconds. FSUse% Count Size Files/sec App Overhead CREAT (Min/Avg/Max) WRITE (Min/Avg/Max) FSYNC (Min/Avg/Max) SYNC (Min/Avg/Max) CLOSE (Min/Avg/Max) UNLINK (Min/Avg/Max) 10 1024 1048576 9.3 19144 28 55 2706 7 14 118 90939 106042 178190 0 0 0 4 6 27 151 160 338
-vオプションを付けた場合、ファイルの作成(CREAT)およびデータの書き込み(WRITE)、メモリバッファからストレージへの書き出し(FSYNC)、キャッシュのストレージへの書き込み(SYNC)、ファイルのクローズ(CLOSE)それぞれにかかった最小(Min)/平均(Avg)/最大(Max)の時間がミリ秒単位で表示される。この例の場合、メモリバッファからストレージへの書き出しを行うFSYNC処理中でもっとも時間がかかっていることが分かる。
tiobench
tiobenchは、複数のスレッドから同時にファイルシステムにアクセスしてその場合のスループットを測定するベンチマークツールだ。tiotestとtiobenchという2つのベンチマークコマンドが用意されており、tiotestコマンドがベンチマークツール本体で、tiobenchはパラメータを変えながらtiotestを呼び出すラッパープログラムとなっている。
Debianでは、「tiobench」という名称でパッケージが提供されている。RHELやその互換ディストリビューション向けには、EPELからtiobenchという名称のパッケージが提供されている。
tiotestを引数無しで実行すると、シーケンシャルリードおよびシーケンシャルライトでは各スレッドごとに10MBのファイルを読み書きして測定し、またランダムリードおよびランダムライトでは各スレッドごとに4096Bのデータを1000回読み書きして測定を行う。デフォルトでは4スレッドを使用するよう設定されているので、シーケンシャルリード/ライトでは計40MB(10MB×4)、ランダムリード/ライトでは計16MB(4096B×1000×4)分の読み書きが行われることになる。実行結果は次のように表形式で出力され、スループット(Rate)およびレイテンシが表示される。
$ tiotest Tiotest results for 4 concurrent io threads: ,----------------------------------------------------------------------. | Item | Time | Rate | Usr CPU | Sys CPU | +-----------------------+----------+--------------+----------+---------+ | Write 40 MBs | 1.7 s | 23.613 MB/s | 4.8 % | 13.5 % | | Random Write 16 MBs | 5.9 s | 2.663 MB/s | 1.2 % | 1.6 % | | Read 40 MBs | 0.0 s | 10124.019 MB/s | 0.0 % | 1619.6 % | | Random Read 16 MBs | 0.0 s | 11306.078 MB/s | 0.0 % | 2025.8 % | `----------------------------------------------------------------------' Tiotest latency results: ,-------------------------------------------------------------------------. | Item | Average latency | Maximum latency | % >2 sec | % >10 sec | +--------------+-----------------+-----------------+----------+-----------+ | Write | 0.003 ms | 0.014 ms | 0.00000 | 0.00000 | | Random Write | 0.002 ms | 0.015 ms | 0.00000 | 0.00000 | | Read | 0.001 ms | 0.019 ms | 0.00000 | 0.00000 | | Random Read | 0.001 ms | 0.010 ms | 0.00000 | 0.00000 | |--------------+-----------------+-----------------+----------+-----------| | Total | 0.002 ms | 0.019 ms | 0.00000 | 0.00000 | `--------------+-----------------+-----------------+----------+-----------'
シーケンシャルライト/リードのテストで使用するファイルファイズは、-fオプションで変更できる。たとえば1スレッドあたり25MB(4スレッドで100MB)にしたい場合、「-f 25」と指定すればよい。また、スレッド数は-tオプションで指定可能だ(デフォルトは4)。ランダムライト/ランダムリードのテストで使用するファイルサイズは-bオプション(1回のアクセスで実行するバイト数)および-rオプション(実行するアクセス回数)と-tオプション(スレッド数)の値の積で決定され、デフォルトではそれぞれ4KB(4096)、1000、4が使われる(総サイズは4096B×1000×4で16MBとなる)。たとえば総サイズを40MBにしたい場合、アクセス回数を2.5倍に指定すればよいので「-r 2500」と指定すればよい。
ベンチマークテストを実行する際はその結果の「ブレ」にも注意
ここまで複数のベンチマークテスト用ツールを紹介してきたが、これらを利用する際に注意してほしいのが「結果のブレ」だ。PCやサーバー上では複数のプログラムが同時に稼働しているため、ベンチマーク結果は状況によって変動する。また、ネットワークの速度は外的要因によっても大きく変化する。そのため、ベンチマークテストを行う際はテストを複数回実施して結果を比較したうえで評価することをおすすめする。ベンチマークツールによっては複数回のテストを実行する機能を持っているものもあるので、うまく利用すると良いだろう。