DBT-2によるベンチマーク手順

DBT-2とはTPC-Cライクなオープンソースのベンチマークソフトで、OLTP系の負荷を擬似的に作り出すように設計されている。細かい更新系の処理を測定したい時には便利なベンチマークツールである。しかしながら、DBT-2の実行手順は多少面倒くさく、さらにREADMEには偽の(?)情報まで含まれている上にDBT-2の実行手順はあまりWeb上では解説されていない。そこで、今日は簡単ではあるがDBT-2によるベンチマークのやり方を紹介しよう。(以下の例では利用するデータベースをMySQL、DBT-2のバージョンを0.40であると仮定している。)

1. ダウンロード

次のページからDBT-2をダウンロードしよう。
http://osdldbt.sourceforge.net/

2. 補助パッケージのインストール

以下のperlパッケージ類はconfigureスクリプトでは「足りないよ」と言ってくれないので、自分でCPANなどを利用してインストールしよう。


shell> sudo cpan Statistics::Descriptive
shell> sudo cpan Test::Parser
shell> sudo cpan Test::Reporter


3. コンパイル

何の変哲もなくconfigureおよびmake、make installを実行する。ただし--with-mysqlオプションは必須である。


shell> ./configure --with-mysql=/usr/local/mysql [options] && make
shell> sudo make install


4. データの生成とロード

データの生成とDBへのローディングは2ステップで行う。それぞれdatagenコマンドとbuild_db.shスクリプトを利用する。build_db.shスクリプトはソースコードのscriptsディレクトリ以下に含まれている。(その他の各種スクリプトもソースコードにそのまま含まれているよ!)


shell> datagen -w 10 -d /var/tmp/dbt2 --mysql
shell> scripts/mysql/build_db.sh \
-w 10 -d dbt2 -f /var/tmp/dbt2 -s /tmp/mysql.sock \
-h localhost -u user -p password -e INNODB


-wオプションは倉庫の数を指定する。倉庫が多ければ多いほど品数=データが増えるのだが、データがキャッシュに収まるかどうかでベンチマークの結果が大きく異なるので、測定したい部位によって-wオプションの値を変化させよう。(ディスクの速度を測定したければ倉庫の数は巨大にして、メモリの速度ならデータはメモリいっぱいいっぱいに収まるように、CPUならば小さめに)例えば-w 10の時は各テーブルのサイズは次のようになる。


mysql> select table_name,sum(data_length) from tables where table_schema='dbt2'
-> group by table_name with rollup;
+------------+------------------+
| table_name | sum(data_length) |
+------------+------------------+
| customer | 200081408 |
| district | 16384 |
| history | 25755648 |
| item | 11026432 |
| new_order | 4702208 |
| orders | 22626304 |
| order_line | 314572800 |
| stock | 381648896 |
| warehouse | 16384 |
| NULL | 960446464 |
+------------+------------------+
10 rows in set (0.54 sec)


5. ベンチマークの実行

ベンチマークそのものはrun_workload.shスクリプトで実行する。例えば次のように。


shell> export USE_PGPOOL=0
shell> export LD_LIBRARY_PATH=/usr/local/mysql/lib
shell> scripts/run_workload.sh -c 16 -d 600 -n -w 10 -s 10 -u user -x password


USE_PGPOOLという環境変数が設定されていないとエラーになってしまう。毎回指定するのが面倒ならスクリプト中に書いてしまってもいい。このコマンドによって、-dオプションで指定されている秒数だけベンチマークが実行され、結果がscripts/outputディレクトリに生成される。-nオプションは各スレッドが待ち時間なしでリクエストを送ることを意味するオプションで、データベースの性能の限界値を知りたい時には必須のオプションである。

各オプションの意味は次の通り。

  • -c ... 同時実行スレッド数
  • -d ... ベンチマーク期間
  • -n ... 思考時間なし
  • -w ... 倉庫の数
  • -s ... スレッドを作成するまでの待ち時間(あまり意味なし。1でOK)
  • -u ... MySQLユーザ名
  • -x ... MySQLパスワード
  • -l ... MySQL TCP/IPポート番号
  • -H ... MySQLサーバホスト名

もしDBT-2を実行中に次のようなエラーが出る場合がある。


Can't use an undefined value as an ARRAY reference at
/usr/local/share/perl/5.10.0/Test/Parser/Dbt2.pm line 521.


このエラーはTest/Parser/Dbt2.pmに問題があることを示すものではなく、ベンチマークが正常に行われなかったことを示す。例えばLD_LIBRARY_PATHの指定が間違っている時などに出るエラーであるので、まずはベンチマーク中にSHOW PROCESSLISTの出力などを見て、リクエストが正常に送られているかどうかを見てみよう。

実アプリケーションにおける性能値とはあまり関係ないのでDBT-2の結果にはさほど意味はないが、チューニングパラメータを変更した時などにどの程度性能が上がるか?ということを調べるにはこの手のベンチマークツールは有用である。もしDBT-2を使ったことがないなら、是非試して見よう!!