今(頃)から始めるvdbenchによる大規模ストレージベンチマーク

# 事のあらまし
4年前ですが部署異動となって今までのネットワーク業務からクラウド業務となり、
ストレージ機器の評価に関わることとなりました

#ストレージの性能評価について
性能を測るためにはベンチマークソフトを利用するのが一般的だと思われます
下記が特に有名どころでしょうか

- CrystalDiskMark
- hdparm
- bonnie++

しかしながら、現在私が担当しているのは**オールフラッシュストレージ（AFS)**なる
SSDドライブを利用した大規模ストレージの為、単体サーバだけ実行するベンチマークソフトでは
性能限界を見ることができない為、それ専用のソフトが必要になります

検証も時間が掛かることから下記を満たすソフトを探していました

- 同時に多数のサーバから負荷を掛けたい
- 長時間動かした際でも詳細なログを見たい(IOPSや遅延、揺らぎなど)
- 試験パターンを定義しておいて自動で行いたい

## vdbench
vdbenchはOracle社が公開しているストレージ評価用ソフトです
(2020/10/25 リンク生存確認)
http://www.oracle.com/technetwork/server-storage/vdbench-downloads-1901681.html

設定方法についてはNetAppさんが公開しているこちらの記事が大変助かりました
http://www.netapp.com/jp/communities/tech-ontap/tot-201505-flash-jp.aspx

~~めでたしめでたし~~
と、行かないのが検証です

今回EXT4のファイルシステム上でも結果が欲しいと要望があり、ベンチマークを行ったのですが
マルチホスト環境での日本語情報が無い事無い事...

> 普通にストレージ性能だけ欲しければRAWのベンチマークだけでOKです
> ファイルシステム部分はOS/サーバ(CPU/Memory)起因な所がありますので

vdbenchのPDFを読みつつ試行錯誤して無事にマルチホストでの実行が可能になった為、
自身の記録として此処に記します

## ストレージ(RAW方式)でのベンチマーク設定例
```
* *******************
* default paramater
* *******************
* 重複排除の設定値
dedupratio=1
dedupunit=8k
* 圧縮率の設定(SNIAと同じ5にした)
compratio=5

* *******************
* Host Definition
* *******************
* 1hostあたり4つのプロセス(jvms)
* rootでログインを行うため、公開鍵は予め各VMに仕込んでおいてください
host=default,user=root,shell=ssh,jvms=4,vdbench=/usr/local/vdbench
hd=vm1,system="192.0.2.1"
hd=vm2,system="192.0.2.2"
hd=vm3,system="192.0.2.3"
hd=vm4,system="192.0.2.4"

* ***********************
* Storage Definition
* ***********************
sd=default,openflags=directio
sd=sdb1,lun=/dev/sdb1
sd=sdc1,lun=/dev/sdc1
sd=sdd1,lun=/dev/sdd1
sd=sde1,lun=/dev/sde1

* ************************
* Workload Definition
* ************************
* Read/Writeの比率が異なるランダムアクセスのパターンを作成
* rdpctがRead率になるので減らせばWrite率が増える
* seekpct=100がrandomという、分かり辛い表現(普通逆じゃないのか?)
wd=wd_r100_w0_rnd100,sd=sd*,rdpct=100,seekpct=100

wd=wd_r80_w20_rnd100,sd=sd*,rdpct=80,seekpct=100

wd=wd_r50_w50_rnd100,sd=sd*,rdpct=50,seekpct=100

wd=wd_r20_w80_rnd100,sd=sd*,rdpct=20,seekpct=100

wd=wd_r0_w100_rnd100,sd=sd*,rdpct=0,seekpct=100

* ************************
* Run Definition
* ************************
* elapsedは1テストパターンあたりの実行時間(秒)
* -> 1mとすると1分にもできる(60と同じ効果)
* intervalは何秒単位で計測をするかの値

* この試験では6 pattern/threads * 5 pattern/xfersize * 5 workload * 60sec = 150min(2.5hour)
* が掛かる想定
rd=default,iorate=max,elapsed=60,interval=1,forxfersize=(4k,8k,16k,32k,64k),forthreads=(16,32,64,128,256,512)

rd=rd_r100_w0,wd=wd_r100_w0_rnd100

rd=rd_r80_w20,wd=wd_r80_w20_rnd100

rd=rd_r50_w50,wd=wd_r50_w50_rnd100

rd=rd_r20_w80,wd=wd_r20_w80_rnd100

rd=rd_r0_w100,wd=wd_r0_w100_rnd100
```

## ファイルシステムでのベンチマーク設定例
```
* *******************
* default paramater
* *******************
* 重複排除の設定値
dedupratio=1
dedupunit=8k
* 圧縮率の設定(SNIAと同じ5にした)
compratio=5

* *******************
* Host Definition
* *******************
* 1hostあたり4つのプロセス(jvms)
* rootでログインを行うため、公開鍵は予め各VMに仕込んでおいてください
host=default,user=root,shell=ssh,jvms=4,vdbench=/usr/local/vdbench
hd=vm1,system="192.0.2.1"
hd=vm2,system="192.0.2.2"
hd=vm3,system="192.0.2.3"
hd=vm4,system="192.0.2.4"

* ***********************
* Filesystem Definition
* ***********************
* /mnt/sd{b,c,d,e}1 というドライブをマウントさせている
* そこに深さ2階層、5フォルダ、各フォルダ100ファイル、
* 生成ファイルの組み合わせ(サイズ,個数,...)を記述している
* -> この場合、1ドライブに128.712g (138,202,972,160) のファイルが生成された
* shared=yesはMulti-hostでベンチマークを動かす場合必須の模様(これが分からなくて嵌った)
fsd=default,depth=2,width=5,files=100,sizes=(128k,30,1m,40,10m,15,100m,10,1g,5),shared=yes
fsd=sdb1,anchor=/mnt/sdb1/vdbench
fsd=sdc1,anchor=/mnt/sdc1/vdbench
fsd=sdd1,anchor=/mnt/sdd1/vdbench
fsd=sde1,anchor=/mnt/sde1/vdbench

* ************************
* Filesystem Workload Definition
* ************************
* xfersizeは実際の環境でのブロックサイズを参考とする
* ここでは適当に想定して組み合わせを作った
fwd=default,operation=read,fileio=(random,shared),xfersize=(4k,20,8k,30,16k,30,32k,10,64k,10),threads=32

* その後Read/Writeの比率が異なるランダムアクセスのパターンを作成
* rdpctがRead率になるので減らせばWrite率が増える
fwd=wd_r100_w0_rnd100,fsd=sd*,rdpct=100

fwd=wd_r80_w20_rnd100,fsd=sd*,rdpct=80

fwd=wd_r50_w50_rnd100,fsd=sd*,rdpct=50

fwd=wd_r20_w80_rnd100,fsd=sd*,rdpct=20

fwd=wd_r0_w100_rnd100,fsd=sd*,rdpct=0

* ************************
* Run Definition
* ************************
* elapsedは1テストパターンあたりの実行時間(秒)
* -> 1mとすると1分にもできる(60と同じ効果)
* intervalは何秒単位で計測をするかの値
rd=default,fwdrate=max,elapsed=60,interval=1,openflags=O_DSYNC

* Multi-hostで利用するにあたり、既存のベンチマーク用ファイルを削除し
* その後改めて今回試験を行い為のファイルを作成する
* こうすることで上に記述したfsdの値を変更してもベンチマークが行える
# clean up
rd=cleanup,fwd=wd_r0_w100_rnd100,operation=write,format=(clean,only)
# make file
rd=restart,fwd=wd_r0_w100_rnd100,operation=write,format=(restart,only)

rd=rd_r100_w0,fwd=wd_r100_w0_rnd100

rd=rd_r80_w20,fwd=wd_r80_w20_rnd100

rd=rd_r50_w50,fwd=wd_r50_w50_rnd100

rd=rd_r20_w80,fwd=wd_r20_w80_rnd100

rd=rd_r0_w100,fwd=wd_r0_w100_rnd100
```

# 注意
- このベンチマーク設定は私の検証での値です。この為、他の環境では適さない可能性が高いです
- また、AFSの検証には様々なノウハウが必要となり、ただ動かすだけでは正常な結果を得られない場合が有ります(これが分からず苦労した)
- メーカが出しているPoCを全信頼しちゃ駄目だよ!