今回は 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 には以下の特徴があります。使い勝手が良く動作も安定しておりますので、是非お試し下さい。
vdbench は http://blogs.sun.com/henk/entry/vdbench_a_disk_and_tape や http://www.sun.com/storage/white-papers/storage_bottlenecks.pdf でも紹介されておりますので、併せてご覧下さい。
vdbench のソースコードとバイナリは http://vdbench.sourceforge.net/ からダウンロードできます。2009 年 8 月現在の最新バージョンは 5.01 です。
ダウンロードしたファイルを展開するだけです
# mkdir /var/tmp/vdbench
# cp vdbench501.zip /var/tmp/vdbench
# cd /var/tmp/vdbench
# unzip vdbench501.zip
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.pdf をご覧下さい。
動作確認の意味も込めて、早速 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 -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: 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: 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.
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
vdbench は Raw デバイスにもファイルシステムにも I/O 負荷を掛ける事が出来ますが、まずは Raw デバイスに負荷を掛ける場合の設定ファイルの書き方を解説します。
まずは負荷生成対象のディスクの定義を行います。ディスクは 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
次にワークロード(どんな 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 は 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 は 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 は 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 は 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 のパラメータを設定します。ファイルシステムキャッシュ等の影響があるので、試験時間は長めに、データ量は実環境になるべく近く、テストする度にマウントし直す様にしてください。
前項まででご覧頂いた通り、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) というパラメータもあります。全てのパラメータはマニュアルに記載されていますので、ご確認下さい。
出力先に指定したディレクトリに 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
出力先に指定したディレクトリに 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
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 write16KB write24KB write32KB write
-----------------------------------------------------------
290MB/sec265.05MB/sec265.57MB/sec273.33MB/sec
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 write16KB write24KB write32KB write
-----------------------------------------------------------
280.12MB/sec268.70MB/sec268.48MB/sec269.46MB/sec
次に 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 は定義できるシナリオの自由度が高く、動作するプラットフォームも多いので、様々な状況で役に立ちます。便利なツールですので、是非ご活用下さい。