基本的な流れ
ここからは、分析系クエリのベンチマーク「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ワークロードも実行できる。
こんな調子で、PostgreSQLとOracleも見ていきますよ。
- 作者: 樋口剛,篠田典良,谷口慶一郎,大沼由弥,豊島正規,三村益隆,笹田耕一,牧大輔,大原壯太,門松宏明,鈴木恭介,新倉涼太,末永恭正,久保田祐史,池田拓司,竹馬光太郎,はまちや2,竹原,粕谷大輔,泉征冶
- 出版社/メーカー: 技術評論社
- 発売日: 2019/08/24
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る