なからなLife

geekに憧れと敬意を抱きながら、SE、ITコンサル、商品企画、事業企画、管理会計、総務・情シス、再び受託でDB屋さんと流浪する人のブログです。

HammerDBをCLIで使うなど(6):自動でテストを繰り返す

TPC-Hの話に行く前に、自動化の件に触れておきたい

このHammerDBには、ベンチマークテストを繰り返し自動実行する「Autopilot」機能がついています。
「異なる数のユーザー数で、同じテストを繰り返す」というケースに対応するものです。

GUIだと「Autopilot」の「Option」から条件を設定するのですが、CLIについては、Autopilot関連を設定/確認するコマンドがありません!


AutopilotをCLIベースで使うためには、2つの方法があります。

1つは、hammerdb(.tcl)=GUI起動時に実行するものに「auto 自動実行ロジックをtclで書いたファイル」で実行する方法です。
3. Extending Autopilot


このドキュメントの例は、tclの中で、同時実行数のパターンを変えながら、config.xmlの条件で繰り返し実行するものになっています。
残念なことにxmlファイルの解説がどこにも見当たらないのですが、{HammerDB展開先}/config/の下に、各DBMS別のテンプレ(実際にGUI/CLIで呼び出されていそうなもの)があるので、これを参考にしろということだと思います。


お、おぅ。。。




諦めが早いので、今回はもう一つの方法を扱います。
HammerDB CLIの章の中で解説されている、「xmlファイル使わず、tclスクリプトの中で、hammerdbcliのコマンドを順次実行」という方法です。
8. CLI Scripting


平たく言えば「力技」なんですが、初めてtclを触る私でもわかるレベルなので。

さっそくですが、サンプルです。

公式ドキュメントについているサンプルは、以下のような仕様になっています。

  • 対Redis
  • TPC-C
  • Schema Buildはしてある前提
  • 1分ごとに経過表示
  • テストが完了するか、120秒経過したら終了する
  • 仮想ユーザーは「1」「2」「4」のパターンを実行する

これを、以下のように書き換えます。

  • MySQL
  • TPC-C
  • Schema Buildはしてある前提
  • 時間経過表示はしない
  • テストは完了させる。時間で切らない。
  • 仮想ユーザーは「1」「2」「4」「8」「16」のパターンを実行する
  • パーセンタイル出力しない。
  • その他の条件は、以前の記事のケースに準ずる。


で、スクリプトはこんなかんじ。

#!/usr/bin/tclsh
puts "SETTING CONFIGURATION"
dbset db mysql
dbset bm TPC-C
diset connection mysql_host localhost
diset tpcc mysql_user tpcc
diset tpcc mysql_pass tpcc
diset tpcc mysql_driver timed
vuset unique 1
vuset logtotemp 1
loadscript
print dict
puts "SEQUENCE STARTED"
foreach z { 1 2 4 8 16} {
puts "$z VU TEST"
vuset vu $z
vucreate
print vuconf
vurun
while { ![vucomplete] } { update }
vudestroy
after 5000
}
puts "TEST SEQUENCE COMPLETE"
exit

公式ドキュメントに載っているスクリプトからの、構造上の大きな変更点としては、時間経過の出力や、時間切れ終了をなくすので、runtimerプロシージャはまるっと消したところですかね。
で、runtimerプロシージャを読んでいたところは、完了(vucomplete=true)するまで無限ループさせるワンライナーに置き換え。

あとは、Redis用のdisetコマンドをMySQLに置き換えるだけ。


vu(Virtual User)=同時接続数を変えながら回すところは、foreach のところですね。
ここで受けた値を「vuset vu $z」で受けてvuを作成、実行して、終わったらvuを破棄して、、、の繰り返し。
同じ条件で3回やって真ん中の値を使いたいから{1 1 1}で、とかでもいいわけで。


起動引数受けたり、冒頭で変数配列としてvu数をセットできるようにしたほうが美しいとは思いますが、個人的にはとりあえずコレで十分。


後の条件は、loadscriptの前にインタラクティブにhammerdbcliのコマンドを叩くそのまんまを書いてあげればOKなので、わかりやすいですね。


エラーハンドリングも何もしてませんw
Virtual Userがコケるとうまく止まらないことがあるので、「素直にkill -9」してください。

いざ実行

hammerdbcliに上記tclスクリプトを読み込ませてあげればOKです。

hammerdb>soruce tclスクリプトファイル

あるいは

$ ./hammerdbcli < tclスクリプトファイル

こんな感じで、連続実行走らせて翌朝?ログファイルを確認すればOK、な環境ができました。

欲を言うと、ログファイルの出力は、任意のファイル名を指定できるようにしたいけど、コマンド上はサポートされてないんだよね。
だれか機能追加してー(他力本願

まとめ

  • tclスクリプトにhammardbcliコマンドを列挙することで操作が可能。
  • tclスクリプトのループを回す中で変数制御して、条件を変えながら連続テストが可能
  • それHammerDBの自動実行機能じゃなくね?(正解

こまけぇことはいいんだよ。


Tcl/Tkデスクトップリファレンス (Programming tools)

Tcl/Tkデスクトップリファレンス (Programming tools)

Tcl/Tkって、新しめの本でも2000年頃。。