なからなLife

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

HammerDBをCLIで使うなど(7):MySQLにTPC-Hを実行してみる

基本的な流れ

ここからは、分析系クエリのベンチマークTPC-H」です。
やりかたは、TPC-Cとほとんど同じなので、淡々と進めていきます。


TPC-Hは、定められた22本1セットの分析クエリ(要はMySQLがあまり得意としない複雑でデカイSQL)についての処理性能を見るベンチマークテストで、

  • 1セッションでどれだけ速いか(Power Test)
  • 複数セッションでどれだけ速いか(Throughput Test)

の結果から計算したスコアを、使用したスケールファクタ(データサイズ)毎に比較するスコア「QphH」を算出するものです。

ただし、HammerDBのドキュメント上にも、「完全なTPC-Hではないし、QphHを計算して比較することは勧めない」と書いてあります。

個人的には、22本それぞれのクエリついての処理時間を基準に、「このデータベース、およびその構成、チューニング状態は、どんなクエリを捌くのが得意/不得意か」というアタリをつけるのに使用しています。
で、DBの乗り換えをしたいお客さんの環境で走ってるSQLと比較して、「重めのSQLが走ってるけど、このへんは特に移植の際にひっかかりそうだなー」「XじゃなくてYのDBなら問題なさそうだなー」といったことを見る、って感じですね。


ここでは正式なQphHの算出方法などには踏み込まず、ツールとしてTPC-Hワークロードを実行するための手順について説明します。

対象DBMSベンチマークの選択

hammerdb>dbset db mysql
Database set to MySQL

hammerdb>dbset bm tpc-h
Benchmark set to TPC-H for MySQL

詳細パラメータの表示と設定

hammerdb>print dict
Dictionary Settings for MySQL
connection {
 mysql_host = 127.0.0.1
 mysql_port = 3306
}
tpch       {
 mysql_scale_fact          = 1
 mysql_tpch_user           = root
 mysql_tpch_pass           = mysql
 mysql_tpch_dbase          = tpch
 mysql_num_tpch_threads    = 1
 mysql_tpch_storage_engine = myisam
 mysql_total_querysets     = 1
 mysql_raise_query_error   = false
 mysql_verbose             = false
 mysql_refresh_on          = false
 mysql_update_sets         = 1
 mysql_trickle_refresh     = 1000
 mysql_refresh_verbose     = false
 mysql_cloud_query         = false
}


TPC-Cと、だいぶパラメータが変わっています。
GUIのメニュールートと微妙にマッチしてないので、GUIベースでしかパラメータの解説がない公式ドキュメントとの対応関係を見るのが少し大変でした。


tpchパラメータの意味は以下のとおりです。

名称 説明 初期値
mysql_scale_fact データのサイズです。 1
mysql_tpch_user テストに使用するユーザー。予め対象のMySQLに作成されている必要がある。 root
mysql_tpch_pass 接続先mysqlデータベースに接続するユーザーのパスワード。 mysql
mysql_tpch_dbase テストに使用するデータベース(スキーマ)名。 myisam
mysql_num_tpch_threads テストスキーマ構築を実行するユーザー数。 1
mysql_tpch_storage_engine テストに使用するテーブルのストレージエンジン。 myisam
mysql_total_querysets テストユーザーが1回ログインして、TPC-Hの1セット(22クエリ)を何回反復実行するか。 1
mysql_raise_query_error エラー発生時にテスト全体を中止する(true)か、次のクエリを継続するか(false)。 false
mysql_verbose 実行したクエリ自体も出力するモードのスイッチ。結果行も出るのですごい量になる。 false
mysql_refresh_on trueにするとTPC-Hのクセリセット実行ではなく、更新処理を実行する。 false
mysql_update_sets refresh_onがtrueのとき、更新処理を何回実行するか。 1
mysql_trickle_refresh refresh_onがtrueのとき、更新処理における挿入と削除の間隔を何ミリ秒あけるか。 1000
mysql_refresh_verbose refresh_onがtrueのときに更新処理を実行するユーザーの処理内容を出力するモードのスイッチ。 false
mysql_cloud_query TPC-H規定の22本のクエリセットとは別の13本のクエリセットが実行されるモードのスイッチ。 false

後半のパラメータの説明は、公式ドキュメントの以下の場所に対応しています。
上記は抜粋超訳なので、正確な解説を見たい場合に参照してください。
5. Configuring Driver Script Options


cloud_query(Oracle MySQL PostgreSQLで使えるオプション)が、なぜこの13のSQLなのか、まったく理解できてないです。なぜそのSQLが「cloud」なのか、も含めて。。。
TPC-Hのドキュメント読んでも見つけられなかったです。
おしえてエロい人。(古い


なお、スケールファクタは、およそデータサイズと一致するのですが、あくまで、純粋データサイズ(フラットファイル出力時)としてのギガバイトなので、RDBMSおよび設定によって格納方法、格納効率が違いますから、多めに領域を確保して置く必要があります。

MySQL5.7のデフォルト環境でScaleFactor=1の環境を作ると、MyISAMで1.6GB、InnoDBで2.3GBくらいになります。
こういうの、MySQLだとスキーマディレクトリの配下をls -lhすれば概算サイズがわかるからラクだよね。




スキーマ作成

テストで流す前に必要なスキーマ作成、及び、テストデータの投入を実行します。

hammerdb>buildschema
....
ALL VIRTUAL USERS COMPLETE

処理が完了しても、データ生成のために立ち上がったクライアントプロセスは起動したままになります。
次の処理の前に、スキーマ作成用のユーザーセッションが完了しているか確認するコマンドを投げて確認し、完了ステータスになっていたら、そのセッションは一度破棄しておきます。

hammerdb>vustatus
1 = FINISH SUCCESS

hammerdb>vudestroy
Destroying Virtual Users
Virtual Users Destroyed
vudestroy success

hammerdb>vustatus
No Virtual Users found

テストスクリプトのロード

ここから先はMySQLと同じですので、さらっと流します。

hammerdb>loadscript
Script loaded, Type "print script" to view

テスト実行用クライアント(Virtual User)の設定

ワークロードを実行するために接続する同時実行ユーザー数を確認・調整します。

Throughput Testに使用するvuの数は、スケールファクタに応じてどの数を指定すべきか、TPC-Hの規定があり、HammerDBのドキュメントにも記述されています。
2. Running the Power and Throughput Test and Calculating the Geometric Mean

Scale Factor S(Streams=Virtual User)
1 2
10 3
30 4
100 5
300 6
1000 7
3000 8
10000 9
30000 10
100000 11


今回は、こんな設定で。

hammerdb>print vuconf
Virtual Users = 1
User Delay(ms) = 500
Repeat Delay(ms) = 500
Iterations = 1
Show Output = 1
Log Output = 0
Unique Log Name = 0
No Log Buffer = 0
Log Timestamps = 0

hammerdb>vuset
Usage: vuset [vu|delay|repeat|iterations|showoutput|logtotemp|unique|nobuff|timestamps] value

hammerdb>vuset logtotemp 1

hammerdb>vuset unique 1

hammerdb>print vuconf
Virtual Users = 1
User Delay(ms) = 500
Repeat Delay(ms) = 500
Iterations = 1
Show Output = 1
Log Output = 1
Unique Log Name = 1
No Log Buffer = 0
Log Timestamps = 0

テスト実行用クライアント(Virtual user)の起動

設定に従ってクライアント(Virtual user)を起動します

hammerdb>vucreate
Vuser 1 created - WAIT IDLE
Logging activated
to /tmp/hammerdb_5D6C8B16591803E273433353.log
1 Virtual Users Created

テストの実行

hammerdb>vurun

で実行し、終わるまで待ちます。

実行結果の出力例

1セット22本のSQLの実行結果なので、省略せずに見ていきましょう。

hammerdb>vurun
RUNNING - MySQL TPC-H
Vuser 1:RUNNING
Vuser 1:Executing Query 14 (1 of 22)

Vuser 1:query 14 completed in 0.782 seconds
Vuser 1:Executing Query 2 (2 of 22)
Vuser 1:query 2 completed in 0.313 seconds
Vuser 1:Executing Query 9 (3 of 22)
Vuser 1:query 9 completed in 4.372 seconds
Vuser 1:Executing Query 20 (4 of 22)
Vuser 1:query 20 completed in 0.441 seconds
Vuser 1:Executing Query 6 (5 of 22)
Vuser 1:query 6 completed in 4.366 seconds
Vuser 1:Executing Query 17 (6 of 22)
Vuser 1:query 17 completed in 0.862 seconds
Vuser 1:Executing Query 18 (7 of 22)
Vuser 1:query 18 completed in 55.747 seconds
Vuser 1:Executing Query 8 (8 of 22)
Vuser 1:query 8 completed in 10.883 seconds
Vuser 1:Executing Query 21 (9 of 22)
Vuser 1:query 21 completed in 3.173 seconds
Vuser 1:Executing Query 13 (10 of 22)
Vuser 1:query 13 completed in 5.55 seconds
Vuser 1:Executing Query 3 (11 of 22)
Vuser 1:query 3 completed in 3.789 seconds
Vuser 1:Executing Query 22 (12 of 22)
Vuser 1:query 22 completed in 0.307 seconds
Vuser 1:Executing Query 16 (13 of 22)
Vuser 1:query 16 completed in 0.581 seconds
Vuser 1:Executing Query 4 (14 of 22)
Vuser 1:query 4 completed in 0.787 seconds
Vuser 1:Executing Query 11 (15 of 22)
Vuser 1:query 11 completed in 0.257 seconds
Vuser 1:Executing Query 15 (16 of 22)
Vuser 1:query 15 completed in 2.762 seconds
Vuser 1:Executing Query 1 (17 of 22)
Vuser 1:query 1 completed in 27.34 seconds
Vuser 1:Executing Query 10 (18 of 22)
Vuser 1:query 10 completed in 2.328 seconds
Vuser 1:Executing Query 19 (19 of 22)
Vuser 1:query 19 completed in 0.302 seconds
Vuser 1:Executing Query 5 (20 of 22)
Vuser 1:query 5 completed in 4.481 seconds
Vuser 1:Executing Query 7 (21 of 22)
Vuser 1:query 7 completed in 3.412 seconds
Vuser 1:Executing Query 12 (22 of 22)
Vuser 1:query 12 completed in 4.83 seconds
Vuser 1:Completed 1 query set(s) in 138 seconds
Vuser 1:FINISHED SUCCESS
ALL VIRTUAL USERS COMPLETE
                          TPC-H Driver Script

こんな感じで、SQLは1~22がランダムに実行されて、それぞれの実行時間と、全体の実行時間が表示されます。
vuが1のまま、複数回実行しても、実行順序は同じだったりしますが、vuを2以上にしたとき、それぞれのvuでの実行順序は異なるようにできています。

mysql_total_querysetsを2以上にすると、上記処理が繰り返されます。

まとめ

  • TPC-HのPower Test(1セッションでどれだけ速く処理できるか)、Throughput Test(複数セッションでどれだけ速く処理できるか)の両方に対応している。
  • TPC-Hのスコア「QphH」が欲しい場合、Power Test、Throughput Testの両方の結果から算出する必要があるが、1回で両方を実行する機能はないため、スコアは手元で計算が必要。
  • よくわからない?その他13クエリでの分析SQLワークロードも実行できる。


こんな調子で、PostgreSQLOracleも見ていきますよ。

WEB+DB PRESS Vol.112

WEB+DB PRESS Vol.112

  • 作者: 樋口剛,篠田典良,谷口慶一郎,大沼由弥,豊島正規,三村益隆,笹田耕一,牧大輔,大原壯太,門松宏明,鈴木恭介,新倉涼太,末永恭正,久保田祐史,池田拓司,竹馬光太郎,はまちや2,竹原,粕谷大輔,泉征冶
  • 出版社/メーカー: 技術評論社
  • 発売日: 2019/08/24
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログを見る