vdbench でディスクの性能を測定する : やっぱり Sun がスキ! やっぱり Sun がスキ!

やっぱり Sun がスキ!

http://blogs.sun.com/yappri/date/20090824 2009年 8月 24日 月曜日

vdbench でディスクの性能を測定する

はじめに

今回は vdbench というツールをご紹介したいと思います。vdbench は Henk Vandenbergh さんが作ったストレージのベンチマークツールです。Java と JNI で書かれており Solaris(SPARC and x86) の他 Windows や Linux, VMware, Mac OS X 等の主要なプラットフォームで動作する様です。私は主に Solaris と Linux で使用しています。このツールは元々は Sun の社内用のテストツールでしたが、バージョン 5.00 からはオープンソースとして公開されており、自由にお使い頂くことが可能です。ストレージのベンチマークは他にも bonnie-64, bonnie++, Iometer, IOzone, FileBench, IOR 等がありますが、vdbench には以下の特徴があります。使い勝手が良く動作も安定しておりますので、是非お試し下さい。

  • 複数のプラットフォームで同じテストを実行できます
  • RAW デバイスとファイルシステムに対して I/O 負荷を掛ける事が出来ます
  • マルチスレッド、マルチプロセスを使用して並列に I/O を発生させる事が出来ます
  • Read / Write の比率を変更して I/O を発生させる事が出来ます
  • I/O サイズを変更して I/O を発生させる事が出来ます
  • IOPS を指定して負荷を発生させる事が出来ます
  • シーケンシャルかランダムか、I/O の特性を変更して負荷を生成する事が出来ます
  • 複数のディスクに股がって I/O を発生させる事が出来ます
  • 複数のホストから I/O を発生させる事が出来ます
  • Solaris と Linux では O_SYNC, O_DSYNC, O_RSYNC のフラグを設定してファイルを開く事が出来ます
  • テスト時間やテスト回数、I/O 発生パターン等をシナリオとして定義し、テストを自動化する事が出来ます

vdbench は http://blogs.sun.com/henk/entry/vdbench_a_disk_and_tapehttp://www.sun.com/storage/white-papers/storage_bottlenecks.pdf でも紹介されておりますので、併せてご覧下さい。

vdbench のダウンロード

vdbench のソースコードとバイナリは http://vdbench.sourceforge.net/ からダウンロードできます。2009 年 8 月現在の最新バージョンは 5.01 です。

vdbench のインストール

Solaris へのインストール

ダウンロードしたファイルを展開するだけです

 # mkdir /var/tmp/vdbench
 # cp vdbench501.zip /var/tmp/vdbench
 # cd /var/tmp/vdbench
 # unzip vdbench501.zip

Linux にインストールする

CentOS(64bit) の場合は付属の OpenJDK で vdbench を動かす事が出来ます。お使いの Linux に JavaVM が入っていない場合は http://java.sun.com から最新の JDK の 64bit Linux 版をダウンロードしてインストールしてください。

 # mkdir /var/tmp/vdbench
 # cp vdbench501.zip /var/tmp/vdbench
 # cd /var/tmp/vdbench
 # unzip vdbench501.zip

vdbench の使い方

ここでは vdbench の基本的な使用方法を解説します。より詳しい使い方を知りたい方は vdbench のアーカイブに含まれている vdbench.pdf をご覧下さい。

vdbench を動かしてみる

動作確認の意味も込めて、早速 vdbench を動かしてみましょう。./vdbench -t を実行して下さい。以下の様な出力が得られれば成功です。

 # ./vdbench -t
 
 
 Vdbench distribution: vdbench500
 For documentation, see 'vdbench.pdf'.
 
 01:07:59.273 input argument scanned: '-f/tmp/parmfile'
 01:07:59.327 Starting slave: /var/tmp/vdbench/vdbench SlaveJvm -m 10.16.67.4 -n localhost-10- 090723-01.07.58.208 -l localhost-0 -p 5570   
 01:07:59.660 All slaves are now connected
 01:08:00.763 Inserted 'rd=File_format_for_sd=sd1' to initialize new file for sd=sd1,lun=/tmp/quick_vdbench_test,size=10485760
 01:08:02.003 Starting RD=File_format_for_sd=sd1; I/O rate: 5000; Elapsed=(none); For loops: threads=8
 01:08:02.089 All sequential workloads on all slaves are done.
 01:08:02.089 This triggers end of run inspite of possibly some non-sequential workloads that are still running.
 
 Jul 23, 2009 interval        i/o   MB/sec   bytes   read     resp     resp     resp    cpu%  cpu%
                             rate  1024**2     i/o    pct     time      max   stddev sys+usr   sys
 01:08:03.051        1       9.00     9.00 1048576   0.00   11.178   15.601    5.275     2.7   1.4
 01:08:03.057  avg_2-1       0.00     0.00       0   0.00    0.000    0.000    0.000
 01:08:04.003 Starting RD=rd1; I/O rate: 100; Elapsed=5; For loops: None
 
 Jul 23, 2009 interval        i/o   MB/sec   bytes   read     resp     resp     resp    cpu%  cpu%
                             rate  1024**2     i/o    pct     time      max   stddev sys+usr   sys
 01:08:05.009        1      84.00     0.33    4096  53.57    0.009    0.040    0.005     1.1   0.3
 01:08:06.047        2      89.00     0.35    4096  50.56    0.008    0.018    0.003     0.1   0.0
 01:08:07.048        3      99.00     0.39    4096  50.51    0.008    0.017    0.003     0.1   0.0
 01:08:08.047        4      94.00     0.37    4096  51.06    0.008    0.017    0.003     0.1   0.0
 01:08:09.047        5     111.00     0.43    4096  53.15    0.008    0.024    0.003     0.1   0.1
 01:08:09.050  avg_2-5      98.25     0.38    4096  51.40    0.008    0.024    0.003     0.1   0.0
 01:08:09.357 Slave localhost-0 terminated
 01:08:09.409 Vdbench execution completed successfully. Output directory: /var/tmp/vdbench/output
  • vdbench -t は /tmp に負荷を発生させます。テスト結果は output ディレクトリにも出力されます。ウェブブラウザで output/summary.html を開いてみてください。

vdbench コマンドのオプション

テストの実行時に付けるオプションは、殆どの場合 "./vdbench -f <CONFIG FILE> -o <OUTPUT DIR>+" で十分です。以下の様にコマンドを実行すると myconf.txt から設定を読み込み、測定を実施し、測定結果を /var/tmp/resultXXX ディレクトリに書き出します。結果が出力されるディレクトリは自動的に作成されます。resultXXX の XXX は最初は空文字、2 回目以降は 000 から 999 までの値が自動的にインクリメントされます。これで同じコマンドを繰り返し実行しても(当分の間は)結果が上書きされずに済みます。

 # ./vdbench -f myconf.txt -o /var/tmp/result+

vdbench の実行時に以下のオプションを渡すことも可能です。詳細はマニュアルをご覧下さい。

 usage: 
   ./vdbench [compare][gui] [-f xxx] [-o xxx] [-e nn] [-i nn] [-j] [-jr] [-v] [-vq] [-s] [-k] [- "parmfile parameters"]
 
   '-f xxx': Workload parameter file name(s). Default 'parmfile' in current directory
   'gui':    Start Vdbench Graphical User Interface
   '-o xxx': Output directory for reporting. Default 'output' in current directory
   '-e nn':  Override elapsed=seconds. 
   '-i nn':  Override interval=seconds. 
   '-v':     Activate Data validation. 
   '-vq':    Activate Data validation, validate lba and data key (saves cpu) 
   '-j':     Activate Data validation with Journaling. 
   '-jr':    Recover existing Journal, Validate data and run workload 
   '-s':     Simulate execution. Do everything but I/O. 
   '-k':     Solaris only: Report kstat statistics on console. 

設定ファイルの書き方

I/O パターンやテスト時間等の負荷シナリオは設定ファイルに記述します。ここではその記述方法を解説します。

サンプル設定

vdbench の設定ファイルの中身は以下の様なテキストです。設定は行単位で記述し、* で始まる行はコメントです。これをファイル保存し、vdbench -f <ファイル名> で読み込ませて実行します。他にも vdbench の配布ファイル中にサンプル設定が幾つか含まれていますのでご参照下さい。設定ファイルは生成したい負荷のシナリオを書き下した物なので、負荷シナリオとも呼ばれます。

  • Example 1
  •  *Example 1: Single run, one raw disk
     
     *SD:	Storage Definition
     *WD:	Workload Definition
     *RD:	Run Definition
     *
     sd=sd1,lun=/dev/rdsk/c0t0d0s0
     wd=wd1,sd=sd1,xfersize=4096,rdpct=100
     rd=run1,wd=wd1,iorate=100,elapsed=10,interval=1
     
     *Single raw disk, 100% random read of 4k records at i/o rate of 100 for 10 seconds
    
  • Example 2
  •  *Example 2: Single run, two raw disk, two workloads.
     
     sd=sd1,lun=/dev/rdsk/c0t0d0s0
     sd=sd2,lun=/dev/rdsk/c0t0d1s0
     wd=wd1,sd=sd1,xfersize=4k,rdpct=80,skew=40
     wd=wd2,sd=sd2,xfersize=8k,rdpct=0
     rd=run1,wd=wd*,iorate=200,elapsed=10,interval=1
     
     *Two raw disks: sd1 does 80 i/o's per second, read-to-write ratio 4:1, 4k records. sd2 does 120 i/o's per second, 100% write at 8k records.
    
  • Example 3(Filesystem)
  •  fsd=fsd1,anchor=/dir1,depth=2,width=2,files=2,size=128k 
     fwd=fwd1,fsd=fsd1,operation=read,xfersize=4k,fileio=sequential,fileselect=random,threads=2 
     rd=rd1,fwd=fwd1,fwdrate=max,format=yes,elapsed=10,interval=1 
    

Raw デバイスに負荷を掛ける場合の設定手順

vdbench は Raw デバイスにもファイルシステムにも I/O 負荷を掛ける事が出来ますが、まずは Raw デバイスに負荷を掛ける場合の設定ファイルの書き方を解説します。

  • sd の設定

まずは負荷生成対象のディスクの定義を行います。ディスクは sd=<設定名> で始まる行で定義します。sd は Storage Definition の略で、この行がディスクの定義であることを示しています。設定名は後でこの定義を参照するために付けます。

 sd=sd1     <-- sd=<設定名> でディスクの定義

sd=<設定名> に続いて、カンマで区切り、負荷を掛ける対象のディスクの名前を記述します。ディスクの名前は lun=<デバイス名> の様に記述します。lun は Logical Unit Number の略です。デバイス名は Solaris では /dev/rdsk/c0t0d0s0 や /dev/md/rdsk/d10 の様にキャラクタデバイスをフルパスで指定します。Linux では raw コマンドで /dev/raw/... を作成し、それを指定します。

 sd=sd1,lun=/dev/rdsk/c0t0d0s0     <-- lun=<デバイス名> を追加

Linux の場合は更にカンマで繋げて size=<ディスクサイズ> を指定する必要があります。ディスクサイズは fdisk -l で確認できます。

 sd=sd1,lun=/dev/raw/raw1,size=733468426240     <-- Linux では size=<サイズ> が必要

基本的には、一行で指定できるディスクは一つだけです。複数のディスクに同時に負荷を掛けたい場合は sd の設定をディスクの数だけ記述する様にしてください。

更にカンマで区切って threads=<スレッド数> を指定することで、そのディスクに対する同時アクセス数を設定する事も出来ます。

 sd=sd1,lun=/dev/rdsk/c0t0d0s0,threads=32      <-- threads=<スレッド数> を追加

ここまでの説明で以下の様な設定が記述できます。ここでは sd1 と sd2 という二つの設定をしています。それぞれ c0t0d0s0 と c0t1d0s0 が負荷生成対象のディスクです。

 sd=sd1,lun=/dev/rdsk/c0t0d0s0
 sd=sd2,lun=/dev/rdsk/c0t1d0s0
  • wd の設定

次にワークロード(どんな I/O を発行するか)の定義を記述します。I/O の定義は行を wd=<設定名> で始めます。wd は Workload Definition の略です。

 wd=wd1     <-- wd=<設定名> でワークロードの定義

wd=<設定名> に続いて、カンマで区切って負荷生成対象のディスクを指定します。ディスクは先ほど設定した sd の設定名で指定します。具体的には sd=<sd の設定名> の様に記述します。複数の sd を指定する場合はカンマで区切って sd=(sd1,sd2) の様に指定することも可能です。また sd=(sd1-sd10) の様に範囲で指定する事も出来ます。

 wd=wd1,sd=sd1     <-- sd=<sd の設定名> を追加

wd には I/O サイズ、Read / Write の比率、シーケンシャルかランダムか、キャッシュヒット率等の I/O パターンを指定する事が出来ます。I/O サイズは xfersize=<サイズ> の様に指定します。Read / Write 比は rdpct=<Read の割合>、シーケンシャルかランダムかは seekpct=<ランダムシークの割合>、キャッシュヒット率は rhpct=<Read のヒット率>、whpct=<Write のヒット率> の様に指定します。seekpct の値はランダムアクセス用のディスクシークをどれだけの割合で行うかです。この値が 0 または sequential の時にシーケンシャルアクセスに、100 または random の値の時にランダムアクセスになります。seekpct=0 でシーケンシャルになるというのは直感的ではないかもしれませんので注意してください。

 wd=wd1,sd=sd1,xfersize=32k,rdpct=100,seekpct=100     <-- wd のパラメータを追加

複数の wd を同時に実行するシナリオを作成することも可能です。複数の wd を同時実行した場合にそれぞれの wd にどれだけの I/O を割り振るかを指定する skew というパラメータも用意されています。skew は skew=<この wd に割り当てる I/O の割合> の様に設定します。skew を設定せずに複数の wd を同時実行した場合は、I/O はそれぞれの wd に均等に割り当てられます。

ここまでの説明で以下の様な設定を記述する事が出来ます。この設定では c0t0d0s0 と c0t1d0s0 に対して 4KB のサイズでシーケンシャルに書き込みを行います。

 sd=sd1,lun=/dev/rdsk/c0t0d0s0
 sd=sd2,lun=/dev/rdsk/c0t1d0s0
 wd=wd1,sd=(sd1,sd2),xfersize=4k,rdpct=0,seekpct=0
  • rd の設定

最後にテストの実行に関する設定を行います。テストの実行に関する設定は rd=<設定名> で始まる行を記述します。rd は Run Definition の略です。

 rd=rd1     <-- rd=<rd の設定名> でテストの実行に関する定義

rd=<設定名> の後にカンマを置いて wd の指定を行います。wd は wd=<wd の設定名> の様に指定します。複数の wd を同時に実行する場合は wd=(wd1, wd2) の様に括弧の中にカンマ区切りで指定します。wd=(wd1-wd10) の様に範囲で指定することも可能です。複数の wd を指定する場合は、wd の設定の中で skew を設定すると、それぞれの wd に割り当てる I/O 量を変更する事が出来ます。

 rd=rd1,wd=wd1     <-- wd=<wd の設定名> を追加

rd には秒間の I/O 回数、テスト実施時間、テスト状況をレポートする間隔等を設定する事が出来ます。I/O 回数は iorate=<毎秒の I/O 回数> または iorate=max で指定します。max を指定すると無制限に I/O を発行します。テスト実施時間は elapsed=<秒>、レポート間隔は interval=<秒> で指定します。

 rd=rd1,wd=wd1,iorate=max,elapsed=600,interval=30     <-- rd のパラメータを追加

また複数のテストパターンを一括して行うための forxfersize=<サイズ>、forthreads=<スレッド数>、forrdpct=<Read の割合>、forseekpct=<ランダムシークの割合> の様なパラメータもあります。forxferseize=(4k,8k,12k,16k) と指定すると、I/O サイズが 4KB, 8KB, 12KB, 16KB のテストを順番に実施します。これらのパラメータはテストを自動化したい場合に便利です。

ここまでの説明で以下の様な設定が完成します。I/O 回数は最大、テスト実行時間は 180 秒、レポートの間隔は 10 秒おきになります。なお、* で始まる行はコメント行です。

 * Test Pattern 1 - Sequential Write, 4KB
 * 2009/07/31
 sd=sd1,lun=/dev/rdsk/c0t0d0s0
 sd=sd2,lun=/dev/rdsk/c0t1d0s0
 wd=wd1,sd=(sd1,sd2),xfersize=4k,rdpct=0,seekpct=0
 rd=rd1,wd=wd1,iorate=max,elapsed=180,interval=10
  • まとめ

以上見てきました通り、vdbench の設定はテキストファイルの中に行単位で記述します。パラメータは sd, wd, rd のカテゴリに分かれており、設定ファイルの各行は設定カテゴリの指定と設定名の記述で始めます。設定名の記述に続いて、カンマ区切りでパラメータとその値を記述します。パラメータは パラメータ名=値 という形式で指定します。* で始まる行はコメントです。

 * コメント
 設定カテゴリ名=設定名,パラメータ名=値,パラメター名=値,...

ファイルシステムに負荷を掛ける場合の設定手順

ファイルシステムに負荷を掛ける場合は sd の代わりに fsd, wd の代わりに fwd のエントリを作成し、rd の記述内容も多少変わってきます。

  • fsd の設定

fsd は Filesystem Definition の略で、負荷を生成する対象のファイルシステムの構成を指定するエントリです。ここに負荷を発生させるディレクトリ名、ファイルの個数、ファイルサイズ等を設定します。

 fsd=fsd1     <-- fsd=<fsd の設定名> でファイルシステム構成の設定

fsd の行は fsd=<設定名> で記述を始めます。設定名は後で参照する為に付ける名前です。この後ろにカンマで区切ってパラメータを設定して行きます。ディレクトリ名は anchor パラメータを使用して anchor=<ディレクトリ名> という様に指定します。ファイルの個数は files=<個数> と指定します。ファイルサイズは sizes=<サイズ> です。サイズは複数指定することが可能です。sizes=(32k,30,2m,70) と指定した場合は 32KB のファイルが 30%, 2MB のファイルが 70% の割合で作成されます。

 fsd=fsd1,anchor=/mnt/test,files=100,sizes=2m    <-- マウントポイント、ファイル数、ファイルのサイズを定義

width=<ディレクトリ数>, depth=<ディレクトリの深さ> を設定するとディレクトリの階層を指定する事が出来ます。depth で指定した深さだけサブディレクトリが作成され、それぞれのサブディレクトリには width で指定した数だけサブディレクトリが作成され、一番下の階層のディレクトリに files で指定した個数のファイルが作成されます。最終的に作成されるファイル数は "width ^ depth * files" で求まります。width=2,depth=2,files=2 の場合は 4 つのディレクトリに 8 つのファイルが作成され、width=2, depth=3, files=4 の場合は 8 つのディレクトリに股がって 32 個のファイルが作成されます。

 fsd=fsd1,anchor=/mnt/test,width=2,depth=3,files=4,sizes=10m     <-- ディレクトリ階層に付いても追加で定義

ここまでの説明で以下の様な設定を記述する事が出来ます。この設定では /mnt/test01 以下に 1GB のファイルが 10 個作成されます。/mnt/test01/ ディレクトリはテスト実施前に作成しておく必要があります。

 fsd=fsd1,anchor=/mnt/test01/,files=10,sizes=1g
  • fwd の設定

fwd は Filesystem Workload Definition の略で、発生させる I/O の中身を細かく定義する為のエントリです。I/O がシーケンシャルかランダムか、一つのファイルを open() してから close() するまでに何回ずつ I/O を発行するか、I/O を掛けるファイルを順番に選ぶかランダムに選ぶか、I/O のサイズ、read / write 等の I/O 操作の種類、I/O の並列度等を指定する事が出来ます。

 fwd=fwd1     <-- fwd=<fwd の設定名> でワークロードの定義

fwd の行は fwd=<設定名> で始めます。設定名はこの定義を後で参照する為の名前です。続いて、カンマで繋げて fsd=<設定名> で既に定義したファイルシステム構成を関連づけます。更にカンマで区切り、fileio=<I/O 特性> を指定します。I/O 特性は random または sequential を指定します。ここで random を設定するとランダム I/O に、sequential だとシーケンシャル I/O になります。close() するまでに何回 I/O を発行するかは stopafter=<回数> で指定します。ファイルの選択方法は fileselect=<選択方法> で指定します。選択方法は random または sequential のどちらかを指定します。I/O のサイズは xfersizes=<サイズ> で指定します。このサイズは複数指定することも可能です。xfersizes=(8k,30,128k,70) の様に指定した場合は 8KB 単位の I/O が 30% と 128KB 単位の I/O が 70% 発生します。I/O 操作の種類は operation=<操作> で指定します。指定できる操作は read / write / open / close / create / delete / mkdir / rmdir / setattr / getattr です。読み出し性能の試験を行うときは read を、書き込み性能の試験を行う場合は write を指定してください。最後に、I/O の並列度は threads=<スレッド数> で指定します。

ここまでの説明で以下の様な設定を作成する事が可能です。8KB のシーケンシャル書き込みを一つのファイルに対して 1000 回ずつ 8 並列で実行します。負荷生成対象のファイルの探索はシーケンシャルに行われます。

 fsd=fsd1,anchor=/mnt/test01/,files=10,sizes=1g
 fwd=fwd1,fsd=fsd1,fileio=sequential,stopafter=1000,fileselect=sequential,xfersizes=8k,operation=write,threads=8
  • rd の設定

一番最後に rd を設定します。rd は Run Definition の略です。Raw I/O の場合の rd と同じ位置付けですが、パラメータが異なります。rd には既に定義した fwd をどの様に実行するかを設定します。

 rd=rd1     <-- rd=<rd の設定名> でテストの実行に関するパラメータの設定

rd の行は rd=<設定名> から始めます。続いて、カンマで区切り、fwd=<fwd の設定名> を記述して既定の fwd を rd に関連付けます。これに続けて、秒間にどれだけの I/O 操作を発生させるかを指定します。指定方法は fwdrate=<I/O を発生させる量> です。このパラメータに max を指定するとマシンの性能が許す限りの I/O 操作を実行します。format=yes を設定すると、テスト開始前にファイルとディレクトリを作成します。これを設定しない場合は自分でファイルとディレクトリを作成しておく必要があります。ファイル数やファイルサイズが増えるとファイルの作成に時間が掛かる様になるので、一回目のテストでファイルを生成して、以降はそれを使い回すと良いかもしれません。elapsed=<秒> を設定すると、テストの実行時間を指定する事が出来ます。デフォルトは 30 秒です。ファイルシステムはキャッシュの影響が大きいので、ある程度長い時間でテストを行ってください。interval=<秒> を設定すると、統計情報の出力間隔を指定する事が出来ます。Solaris と Linux では openflags=<フラグ> を設定すると open() に渡すフラグを指定する事が出来ます。設定できるフラグは o_sync, o_dsync, o_rsync です(ソースファイルの Vdb/OpenFlags.java で確認できます)。データベース等を模したテストをする場合は O_DSYNC を付けると実環境により近付くかもしれません。

forsizes=<ファイルサイズ> を設定すると複数のファイルサイズのテストを一つの設定で実行する事が出来ます。forsizes=(128k,2m,1g) の様に指定すると、まず 128KB でテストを行い、それが終了したら 2MB のファイルサイズで、最後に 1GB のファイルサイズでテストを行います。forfiles=<ファイル数> を設定すると異なるファイル数のテストを順番に実施する事が出来ます。forfiles=(300,500,1000) と指定すると 300 個のファイルのテスト、500 個のファイルのテスト、1000 個のファイルのテストを順番に実行します。

ここまでの説明で以下の様な負荷生成シナリオができました。これをファイルに保存し vdbench コマンドの -f オプションでそのファイル名を指定することでこの負荷シナリオを実行する事が出来ます。

 fsd=fsd1,anchor=/mnt/test01/,files=10,sizes=1g
 fwd=fwd1,fsd=fsd1,fileio=sequential,stopafter=1000,fileselect=sequential,xfersizes=8k,operation=write,threads=8
 rd=rd1,fwd=fwd1,fwdrate=max,elapsed=600,interval=10,format=yes
  • 注意

繰り返しテストを実行する場合は、測定条件を合わせるため、なるべく一度ファイルシステムをアンマウントしてから次のテストを実行する様にしてください。

  • まとめ

Raw の設定ファイルでは sd, wd, rd のパラメータを設定しましたが、ファイルシステムの設定ファイルでは fsd, fwd, rd のパラメータを設定します。ファイルシステムキャッシュ等の影響があるので、試験時間は長めに、データ量は実環境になるべく近く、テストする度にマウントし直す様にしてください。

vdbench のパラメータ

前項まででご覧頂いた通り、Raw デバイスに負荷を生成する場合は SD(Storage Definition), WD(Workload Definition), RD(Run Definition) を設定する必要があります。ファイルシステムの場合は FSD(Filesystem Storage Definition), FWD(Filesystem Workload Definition), RD(Run Definition) を定義する必要がありました。実際にはそれ以外に General Parameters と HD(Host Definition) というパラメータもあります。全てのパラメータはマニュアルに記載されていますので、ご確認下さい。

テスト結果の見方

Raw の場合

出力先に指定したディレクトリに summary.html ができます。これをウェブブラウザで開いてください。

 14:55:08.000 Starting RD=rd1;
 I/O rate: Uncontrolled MAX; Elapsed=60; For loops: xfersize=32768
 
 Aug 04, 2009 interval        i/o   MB/sec   bytes   read     resp     resp     resp    cpu%  cpu%
                             rate  1024**2     i/o    pct     time      max   stddev sys+usr   sys
 14:55:18.023        1    9978.40   311.82   32768   0.00    0.798   52.837    1.960     4.5   3.8
 14:55:28.011        2    8517.60   266.18   32768   0.00    0.936   26.145    2.138     4.0   3.3
 14:55:38.011        3    8661.60   270.68   32768   0.00    0.921   33.382    2.112     4.1   3.3
 14:55:48.012        4    7870.60   245.96   32768   0.00    1.013   30.333    2.250     3.6   3.1
 14:55:58.010        5    8523.80   266.37   32768   0.00    0.935   87.823    2.317     3.9   3.3
 14:56:08.011        6    8365.10   261.41   32768   0.00    0.954   34.503    2.170     3.9   3.2
 14:56:08.014  avg_2-6    8387.74   262.12   32768   0.00    0.951   87.823    2.198     3.9   3.2
 14:56:09.296 Vdbench execution completed successfully
  • interval の値は統計情報の出力回数です。連番になっており一行出力する度に値が一つずつ増えて行きます。
  • i/o rate は I/O の回数 (IOPS) です。
  • MB/sec は I/O スループット (megabytes per second) です。
  • bytes i/o は I/O サイズ(の平均)です。上の例の場合は xfersize=32768 にしましたので、一回の I/O サイズも 32768 bytes になります。
  • read pct は Read の割合です。Write Only の時は 0 になります。
  • resp time はミリ秒単位の平均レスポンス時間です。
  • resp max はもっとも時間が掛かった処理の処理時間(ミリ秒単位)です。
  • resp stddev はレスポンス時間の標準偏差(ばらつき度合い)です。
  • cpu% sys+usr は処理に費やした CPU 時間です。
  • cpu% sys は OS 側の処理に消費した CPU 時間です。
  • avg_2-6 は、この行が 2 回目の出力から 6 回目の出力の平均であることを示しています。この行の i/o rate と MB/sec をテスト結果として採用すると良いでしょう。
  • ほぼ同じ内容が標準出力にも出力されます。そちらを見て頂いても構いません。

ファイルシステムテストの場合

出力先に指定したディレクトリに summary.html ができます。これをウェブブラウザで開いてください。以下は summary.html の一部を抜き出したものです。

 ...
 15:15:15.001 Starting RD=rd1; Elapsed=60; fwdrate=max. For loops: None
 
 15:15:25.025 Interval ....Ops..... ...cpu%... ....read.... ...write.... ..mb/sec.. .xfer. ...
 15:15:25.025            rate  resp total  sys   rate  resp   rate  resp read write   size  ...
 15:15:25.025        1  10228   0.5   4.6  4.1    0.0   0.0  10228   0.5  0.0  79.9   8192   ...
 15:15:35.011        2 3443.1   2.8   1.2  1.0    0.0   0.0 3443.1   2.8  0.0  26.9   8192   ...
 15:15:45.013        3  14297   0.6   3.8  3.2    0.0   0.0  14297   0.6  0.0 111.7   8192   ...
 15:15:55.009        4 8678.4   0.9   3.5  3.1    0.0   0.0 8678.4   0.9  0.0  67.8   8192   ...
 15:16:05.011        5 5030.4   1.0   2.2  2.0    0.0   0.0 5030.4   1.0  0.0  39.3   8192   ...
 15:16:15.009        6 3532.8   3.0   1.8  1.6    0.0   0.0 3532.8   3.0  0.0  27.6   8192   ...
 15:16:15.012  avg_2-6 6996.5   1.2   2.5  2.2    0.0   0.0 6996.5   1.2  0.0  54.7   8192   ...
 15:16:17.044 Vdbench execution completed successfully
  • Interval は出力行の番号です。出力される度にインクリメントされて行きます。
  • Ops は I/O 操作に関する統計情報です。Ops の rate は秒間の操作回数、resp は平均レスポンス時間です。
  • cpu% は CPU 使用率を表しています。total が CPU 使用率で sys はその内のシステム時間です。
  • read は読み出しに関する統計情報です。rate は毎秒の read 回数、resp は平均レスポンス時間です。
  • write は書き込みに関する統計情報です。rate は毎秒の write 回数、resp は平均レスポンス時間です。
  • mb/sec は毎秒のデータ転送量 (megabytes per second) です。read は読み出しの転送量、write は書き込みの転送量です。
  • xfer size は I/O のサイズです。単位は byte です。
  • avg_2-6 は、この行が 2 回目の出力から 6 回目の出力の平均であることを示しています。この行の read rate, write rate と mb/sec をテスト結果として採用すると良いでしょう。
  • ほぼ同じ内容が標準出力にも出力されます。そちらを見て頂いても構いません。

実際に使ってみる

Solaris の Raw デバイスのテスト

vdbench を使って Solaris の Raw デバイスの Sequential Write の性能を測定してみます。設定ファイルは以下の通りです。

 # cat conf/test01.conf
 * START "test01.conf" : sequential write - 8KB, 16KB, 24KB, 32KB
 sd=sd1,lun=/dev/rdsk/c0t2d0s2,size=733468426240
 wd=wd1,sd=sd1,rdpct=0,seekpct=0
 rd=rd1,wd=wd1,iorate=max,elapsed=180,interval=10,forxfersize=(8k,16k,24k,32k)
 * END

実行ログは以下の通りです。出力が長くなるので、一部重要な部分だけ載せています。

 # ./vdbench -f conf/test01 -o /var/tmp/output+
 ...
 Aug 17, 2009 interval        i/o   MB/sec   bytes   read     resp     resp     resp    cpu%  cpu%
                             rate  1024**2     i/o    pct     time      max   stddev sys+usr   sys
 ...
 16:43:16.030 avg_2-18   37145.06   290.20    8192   0.00    0.212    5.279    0.049    16.7  14.1
 ...
 16:46:17.017 avg_2-18   16963.02   265.05   16384   0.00    0.468   85.172    1.356     7.7   6.5
 ...
 16:49:18.013 avg_2-18   11330.82   265.57   24576   0.00    0.703   72.644    1.928     5.2   4.3
 ...
 16:52:19.015 avg_2-18    8746.64   273.33   32768   0.00    0.911  102.431    2.199     4.1   3.5

今回は単純に MB/sec の avg を結果として採用しました。まとめると以下の様になります。

 8KB write	16KB write	24KB write	32KB write
 -----------------------------------------------------------
 290MB/sec	265.05MB/sec	265.57MB/sec	273.33MB/sec

Linux の Raw デバイスのテスト

Solaris の場合と同じ様に Linux でも Sequential Write の性能を測定してみます。Linux では Solaris の /dev/rdsk/... に対応するデバイスファイルを手動で用意する必要があります。

 # ls /dev/raw
 ls: /dev/raw: No such file or directory      <-- raw デバイスはデフォルトでは存在しない
 # raw /dev/raw/raw1 /dev/sdc           <-- raw コマンドで raw デバイスを作成します
 /dev/raw/raw1:	bound to major 8, minor 32
 # ls /dev/raw
 ./  ../  raw1
 # ls -l /dev/raw
 total 0
 crw-------  1 root root 162, 1 Aug  6 00:13 raw1     <-- c で始まるのでキャラクタデバイス
 # fdisk -l /dev/sdc
 
 Disk /dev/sdc: 733.4 GB, 733468426240 bytes   <-- サイズは 733468426240 bytes
 255 heads, 63 sectors/track, 89172 cylinders
 Units = cylinders of 16065 * 512 = 8225280 bytes
 
 Disk /dev/sdc doesn't contain a valid partition table

設定ファイルと実行ログはこの様になります。

 # cat conf/test01.conf 
 * START "test01.conf" : sequential write - 8KB, 16KB, 24KB, 32KB
 sd=sd1,lun=/dev/raw/raw1,size=733468426240
 wd=wd1,sd=sd1,rdpct=0,seekpct=0
 rd=rd1,wd=wd1,iorate=max,elapsed=180,interval=10,forxfersize=(8k,16k,24k,32k)
 * END
 # ./vdbench -f conf/test01.conf -o /var/tmp/output+
 ...
 Aug 17, 2009 interval        i/o   MB/sec   bytes   read     resp     resp     resp    cpu%  cpu%
                             rate  1024**2     i/o    pct     time      max   stddev sys+usr   sys
 ...
 20:15:50.051 avg_2-18   35854.75   280.12    8192   0.00    0.222    6.433    0.053     8.6   7.3
 ...
 20:18:51.050 avg_2-18   17196.88   268.70   16384   0.00    0.464   76.286    1.312     4.2   3.6
 ...
 20:21:52.049 avg_2-18   11455.23   268.48   24576   0.00    0.697   68.371    1.885     2.9   2.4
 ...
 20:24:53.048 avg_2-18    8622.86   269.46   32768   0.00    0.927   80.978    2.256     2.3   2.0

結果をまとめると次の様になります。Sequential Write に関してはだいたい Solaris の場合と同程度の性能になっていることが分かります。

 8KB write	16KB write	24KB write	32KB write
 -----------------------------------------------------------
 280.12MB/sec	268.70MB/sec	268.48MB/sec	269.46MB/sec

Solaris のファイルシステムのテスト

次に vdbench を使ってファイルシステムの性能を測定してみます。全部で 50GB のファイルを Sequential Read します。ファイルシステムは ZFS を使用しました。

 # format
 Searching for disks...done
 
 c0t1d0: configured with capacity of 136.59GB
 
 
 AVAILABLE DISK SELECTIONS:
        0. c0t0d0 <DEFAULT cyl 17830 alt 2 hd 255 sec 63>
           /pci@0,0/pci8086,25f8@4/pci108e,286@0/disk@0,0
        1. c0t1d0 <Sun-STKRAIDINT-V1.0 cyl 17831 alt 2 hd 255 sec 63>
           /pci@0,0/pci8086,25f8@4/pci108e,286@0/disk@1,0
        2. c0t2d0 <DEFAULT cyl 44584 alt 2 hd 255 sec 126>
           /pci@0,0/pci8086,25f8@4/pci108e,286@0/disk@2,0
 Specify disk (enter its number): ^D
 # zpool create storage c0t2d0
 # mkdir /storage/test
 # cat conf/test10.conf     <-- 設定ファイル
 fsd=fsd1,anchor=/storage/test/,files=50,sizes=1g
 fwd=fwd1,fsd=fsd1,fileio=sequential,fileselect=sequential,xfersize=8k,operation=read,threads=8
 rd=rd1,fwd=fwd1,fwdrate=max,elapsed=600,interval=10,format=yes
 # ./vdbench -f conf/test10.conf -o /var/tmp/output+
 ...
 18:56:26.013 Interval ....Ops..... ...cpu%... ....read.... ...write.... ..mb/sec.. .xfer. ...mkdir... ...
 18:56:26.013            rate  resp total  sys   rate  resp   rate  resp read write   size  rate  resp  ...
 ...
 19:06:16.014 avg_2-60  39757   0.2  13.9 12.6  39757   0.2    0.0   0.0  310   0.0   8192   0.0   0.0   ...
 ...

テスト結果は 310MB/sec でした。iostat で測定したスループットも同じくらいでしたので純粋なストレージの性能が出ていると思われます。

最後に

今回は vdbench の使い方を解説しました。vdbench は定義できるシナリオの自由度が高く、動作するプラットフォームも多いので、様々な状況で役に立ちます。便利なツールですので、是非ご活用下さい。

投稿されたコメント:

コメント
  • HTML文法 不許可