HammerDB で RDBMS のベンチマークを取ってみる(MySQL編)

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ウィスキー、シガー、パイプをこよなく愛する大栗です。

前回のエントリで HammerDB を使って PostgreSQL のベンチマークを取る手順をまとめました。PostgreSQL 以外にも MySQL やその互換データベースをよく利用することがあるので、今回は MySQL 編ということで HammerDB での手順をまとめたいと思います。

PostgreSQL での手順を確認したい方は、以下のエントリを御覧ください。

HammerDB

HammerDB の詳細は前回の説明を参照ください。

やってみる

前回と同様の注意です。

注意
ベンチマーク結果は、データベース・ソフトウェアや提供環境により実施や公開が制限されている場合があります。例えば Oracle ではベンチマークテストの結果は公開を禁じられています。AWS では AWS Service Terms の 1.8 に準じる必要があります。

事前準備

ベンチマークの環境は以下としています。

  • HammerDB : version 4.3
  • クライアント環境
    • AMI : ami-08a8688fb7eacb171 (amzn2-ami-kernel-5.10-hvm-2.0.20220207.1-x86_64-gp2)
    • OS : Amazon Linux 2
    • MySQL Ver 8.0.28
  • データベース環境
    • PostgreSQL 13

また、クライアントからデータベースへのネットワーク接続が問題なく出来ることとします。

MySQL のリポジトリの設定をダウンロードします。

$ wget https://dev.mysql.com/get/mysql80-community-release-el7-5.noarch.rpm

ローカルファイルをインストールします。

$ sudo yum localinstall -y ./mysql80-community-release-el7-5.noarch.rpm

mysql-community-clientをインストールします。

$ sudo yum install -y mysql-community-client

HammerDB をダウンロードします。

$ wget https://github.com/TPC-Council/HammerDB/releases/download/v4.3/HammerDB-4.3-Linux.tar.gz

ダウンロードしたファイルを解凍します。

$ tar xvfz HammerDB-4.3-Linux.tar.gz

解凍したディレクトリへ移動します。

$ cd HammerDB-4.3

HammerDB の CLI を起動します。

$ ./hammerdbcli

librarycheckコマンドでライブラリのインストール状況をチェックします。出力される結果の中で、MySQL の内容がSuccessになっていることを確認します。

hammerdb>librarycheck
Checking database library for Oracle
・
・
・
Checking database library for MySQL
Success ... loaded library mysqltcl for MySQL
・
・
・

一旦 HammerDB CLI を終了します。

hammerdb>exit

TPROC-C の実施

TPC-C の派生ベンチマークである TPROC-C を実行してみます

MySQL にログインします。

$ mysql -h xxxxxxxxxxxx.example.com -u admin -p 
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 51
・
・

ベンチマーク用のデータベースtpccを作成します。

mysql> create database tpcc;
Query OK, 1 row affected (0.01 sec)

MySQL をログアウトします。

mysql> exit
Bye

HammerDB の CLI を起動します。

$ ./hammerdbcli

対象データベースを MySQL に設定し、ベンチマークを TPROC-C に設定します。

hammerdb>dbset db mysql
hammerdb>dbset bm TPROC-C

設定内容を確認します。この内容について必要な項目を設定していきます。

hammerdb>print dict
Dictionary Settings for MySQL
connection {
 mysql_host   = 127.0.0.1
 mysql_port   = 3306
 mysql_socket = /tmp/mysql.sock
}
tpcc       {
 mysql_count_ware       = 1
 mysql_num_vu           = 1
 mysql_user             = root
 mysql_pass             = mysql
 mysql_dbase            = tpcc
 mysql_storage_engine   = innodb
 mysql_partition        = false
 mysql_prepared         = false
 mysql_total_iterations = 10000000
 mysql_raiseerror       = false
 mysql_keyandthink      = false
 mysql_driver           = test
 mysql_rampup           = 2
 mysql_duration         = 5
 mysql_allwarehouse     = false
 mysql_timeprofile      = false
 mysql_async_scale      = false
 mysql_async_client     = 10
 mysql_async_verbose    = false
 mysql_async_delay      = 1000
 mysql_connect_pool     = false
}

接続先のホスト名と接続ポートを設定します。

hammerdb>diset connection mysql_host xxxxxxxxxxxx.example.com
hammerdb>diset connection mysql_port 99999

ベンチマークを実行する際のユーザ名、パスワードを入力します。

hammerdb>diset tpcc mysql_user XXXXX
hammerdb>diset tpcc mysql_pass XXXXXXXXXXXXXXXX

先ほど作成したデータベースtpccを入力します。

hammerdb>diset tpcc mysql_dbase tpcc

warehouse を指定します。倉庫を表し、データベース全体のサイズを決める因子になっています。

hammerdb>diset tpcc mysql_count_ware 100

データロード時の同時実行数を指定します。

hammerdb>diset tpcc mysql_num_vu 4

設定した内容を確認します。

hammerdb>print dict
Dictionary Settings for MySQL
connection {
 mysql_host   = xxxxxxxxxxxx.example.com
 mysql_port   = 99999
 mysql_socket = /tmp/mysql.sock
}
tpcc       {
 mysql_count_ware       = 100
 mysql_num_vu           = 4
 mysql_user             = XXXXX
 mysql_pass             = XXXXXXXXXXXXXXXX
 mysql_dbase            = tpcc
 mysql_storage_engine   = innodb
 mysql_partition        = false
 mysql_prepared         = false
 mysql_total_iterations = 10000000
 mysql_raiseerror       = false
 mysql_keyandthink      = false
 mysql_driver           = test
 mysql_rampup           = 2
 mysql_duration         = 5
 mysql_allwarehouse     = false
 mysql_timeprofile      = false
 mysql_async_scale      = false
 mysql_async_client     = 10
 mysql_async_verbose    = false
 mysql_async_delay      = 1000
 mysql_connect_pool     = false
}

ベンチマーク用のスキーマとデータを作成します。

hammerdb>buildschema

データの作成が完了すると、以下のようなメッセージが表示されます。一度改行するとhammerdb>のプロンプトに戻ります。

Vuser 1:TPCC SCHEMA COMPLETE
Vuser 1:FINISHED SUCCESS
ALL VIRTUAL USERS COMPLETE

データを作成したときの仮想ユーザを削除します。

hammerdb>vudestroy

次にベンチマークの実施設定を行います。ベンチマークの実施時はドライバスクリプトの設定をtimedにします。

hammerdb>diset tpcc mysql_driver timed

クライアント側のタイムプロファイルを有効にします。

bash] hammerdb>diset tpcc mysql_timeprofile true [/bash]

dbset と diset で設定した内容をロードします

hammerdb>loadscript

仮想ユーザの構成を確認します。

hammerdb>print vuconf
Virtual Users = 5
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

設定項目を確認します。

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

ベンチマークを実行する同時実行ユーザー数を定義します。ここでは 8 にしています。

hammerdb>vuset vu 8

ログを出力する設定を行います。

hammerdb>vuset logtotemp 1

ログ名の設定

hammerdb>vuset unique 1

ログへのタイムスタンプ設定を行います。

hammerdb>vuset timestamps 1

実施した設定を確認します。

hammerdb>print vuconf
Virtual Users = 8
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 = 1

ベンチマークの実行ユーザを作成します。出力されるログのパスも表示されます。

hammerdb>vucreate
Vuser 1 created MONITOR - WAIT IDLE
Vuser 2 created - WAIT IDLE
Vuser 3 created - WAIT IDLE
Vuser 4 created - WAIT IDLE
Vuser 5 created - WAIT IDLE
Vuser 6 created - WAIT IDLE
Vuser 7 created - WAIT IDLE
Vuser 8 created - WAIT IDLE
Vuser 9 created - WAIT IDLE
Logging activated
to /tmp/hammerdb_1234ABCD5678EFGH1234ABCD.log
9 Virtual Users Created with Monitor VU

実行ユーザのステータスを確認します。各ユーザのステータスがWAIT IDLEになっていることを確認します。

hammerdb>vustatus
1 = WAIT IDLE
2 = WAIT IDLE
3 = WAIT IDLE
4 = WAIT IDLE
5 = WAIT IDLE
6 = WAIT IDLE
7 = WAIT IDLE
8 = WAIT IDLE
9 = WAIT IDLE

ベンチマークを実行します。

hammerdb>vurun
Vuser 1:RUNNING
Vuser 1:Initializing xtprof time profiler
Vuser 1:Beginning rampup time of 2 minutes
・
・
・

ALL VIRTUAL USERS COMPLETEが表示されるとベンチマークの完了です。TEST RESULTの行に結果が出力されます。また時間情報が出力されたログのパスも出力されています。

結果にはNOPMTPMがあります。NOPM は New Orders per Minute の略で、新規発注処理を1分間に何回できたかを表しています。TPC-C の場合は分間の新規発注処理数を tpmC で表しますが、HammerDB では 厳密には TPC-C に準拠していないため使用できません。そのため NOPM という指標を使用しています。TPM は Transactions per Minute の略で、オンライン トランザクション カウンターに表示される値で異なるデータベース間では比較できません。

Vuser 1:Test complete, Taking end Transaction Count.
Vuser 1:8 Active Virtual Users configured
Vuser 1:TEST RESULT : System achieved 99999 NOPM from 99999 MySQL TPM
Vuser 1:Gathering timing data from Active Virtual Users...
Vuser 9:FINISHED SUCCESS
Vuser 7:FINISHED SUCCESS
Vuser 5:FINISHED SUCCESS
Vuser 3:FINISHED SUCCESS
Vuser 4:FINISHED SUCCESS
Vuser 8:FINISHED SUCCESS
Vuser 2:FINISHED SUCCESS
Vuser 6:FINISHED SUCCESS
Vuser 1:Calculating timings...
Vuser 1:Writing timing data to /tmp/hdbxtprofile.log
Vuser 1:FINISHED SUCCESS
ALL VIRTUAL USERS COMPLETE

ログの中身を確認します。各実行ユーザの結果詳細が出力されており、一番最後に各オペレーションの全体結果が出力されます。

$ cat /tmp/hdbxtprofile.log
MySQL Hammerdb Time Profile Report @ Sat Feb 12 05:14:55 UTC 2022
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
>>>>> VIRTUAL USER 2 : ELAPSED TIME : 999999ms
>>>>> PROC: NEWORD
・
・
・
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
>>>>> SUMMARY OF 8 ACTIVE VIRTUAL USERS : MEDIAN ELAPSED TIME : 999999ms
>>>>> PROC: NEWORD
CALLS: 999999   MIN: 9.999ms    AVG: 9.999ms    MAX: 999.999ms  TOTAL: 9999999.999ms
P99: 99.999ms   P95: 9.999ms    P50: 9.999ms    SD: 9999.999    RATIO: 99.999%
>>>>> PROC: PAYMENT
CALLS: 999999   MIN: 9.999ms    AVG: 9.999ms    MAX: 999.999ms  TOTAL: 9999999.999ms
P99: 99.999ms   P95: 9.999ms    P50: 9.999ms    SD: 9999.999    RATIO: 99.999%
>>>>> PROC: DELIVERY
CALLS: 999999   MIN: 9.999ms    AVG: 9.999ms    MAX: 999.999ms  TOTAL: 9999999.999ms
P99: 99.999ms   P95: 9.999ms    P50: 9.999ms    SD: 9999.999    RATIO: 99.999%
>>>>> PROC: OSTAT
CALLS: 999999   MIN: 9.999ms    AVG: 9.999ms    MAX: 999.999ms  TOTAL: 9999999.999ms
P99: 99.999ms   P95: 9.999ms    P50: 9.999ms    SD: 9999.999    RATIO: 99.999%
>>>>> PROC: SLEV
CALLS: 999999   MIN: 9.999ms    AVG: 9.999ms    MAX: 999.999ms  TOTAL: 9999999.999ms
P99: 99.999ms   P95: 9.999ms    P50: 9.999ms    SD: 9999.999    RATIO: 99.999%
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

TPROC-H の実施

TPC-H の派生ベンチマークである TPROC-H を実行してみます

MySQL にログインします。

$ mysql -h xxxxxxxxxxxx.example.com -u admin -p 
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 51
・
・

ベンチマーク用のデータベースtpccを作成します。

mysql> create database tpch;
Query OK, 1 row affected (0.01 sec)

MySQL をログアウトします。

mysql> exit
Bye

HammerDB の CLI を起動します。

$ ./hammerdbcli

対象データベースを PostgreSQL に設定し、ベンチマークを TPROC-H に設定します。

hammerdb>dbset db mysql
hammerdb>dbset bm TPROC-H

設定内容を確認します。この内容について必要な項目を設定していきます。

hammerdb>print dict
Dictionary Settings for MySQL
connection {
 mysql_host   = 127.0.0.1
 mysql_port   = 3306
 mysql_socket = /tmp/mysql.sock
}
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 = innodb
 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
}

接続先のホスト名と接続ポートを設定します。

hammerdb>diset connection mysql_host xxxxxxxxxxxx.example.com
hammerdb>diset connection mysql_port 99999

ベンチマークを実行する際のユーザ名、パスワードを入力します。

hammerdb>diset tpch mysql_tpch_user XXXXX
hammerdb>diset tpch mysql_tpch_pass XXXXXXXXXXXXXXXX

先ほど作成したデータベースtpchを入力します。

hammerdb>diset tpch mysql_tpch_dbase tpch

mysql_scale_fact を指定します。データのサイズです。以下の値のいずれかを入力します。

1, 10, 30, 100, 300, 1000, 3000, 10000, 30000, 100000

hammerdb>diset tpch mysql_scale_fact 100

データロード時の同時実行数を指定します。

hammerdb>diset tpch mysql_num_tpch_threads 4

設定した内容を確認します。

hammerdb>print dict
Dictionary Settings for MySQL
connection {
 mysql_host   = xxxxxxxxxxxx.example.com
 mysql_port   = 99999
 mysql_socket = /tmp/mysql.sock
}
tpch       {
 mysql_scale_fact          = 4
 mysql_tpch_user           = XXXXX
 mysql_tpch_pass           = XXXXXXXXXXXXXXXX
 mysql_tpch_dbase          = tpch
 mysql_num_tpch_threads    = 4
 mysql_tpch_storage_engine = innodb
 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
}

ベンチマーク用のスキーマとデータを作成します。

hammerdb>buildschema

データの作成が完了すると、以下のようなメッセージが表示されます。一度改行するとhammerdb>のプロンプトに戻ります。

Vuser 1:Workers: 0 Active 4 Done
Vuser 1:GATHERING SCHEMA STATISTICS
Vuser 1:TPCH SCHEMA COMPLETE
Vuser 1:FINISHED SUCCESS
ALL VIRTUAL USERS COMPLETE
TPROC-H Driver Script

データを作成したときの仮想ユーザを削除します。

hammerdb>vudestroy

dbset と diset で設定した内容をロードします

hammerdb>loadscript

仮想ユーザの構成を確認します。

hammerdb>print vuconf
Virtual Users = 5
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

ベンチマークを実行する同時実行ユーザー数を定義します。ここでは 1 にしています。

hammerdb>vuset vu 1

ログを出力する設定を行います。

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

ベンチマークの実行ユーザを作成します。出力されるログのパスも表示されます。

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

実行ユーザのステータスを確認します。各ユーザのステータスがWAIT IDLEになっていることを確認します。

hammerdb>vustatus
1 = WAIT IDLE

ベンチマークを実行します。

hammerdb>vurun
Vuser 1:RUNNING
Vuser 1:Executing Query 14 (1 of 22)
・
・
・
Vuser 1:Completed 1 query set(s) in 99999 seconds
Vuser 1:Geometric mean of query times returning rows (22) is 999.99999
Vuser 1:FINISHED SUCCESS
ALL VIRTUAL USERS COMPLETE
TPROC-H Driver Script

ログの中身を確認します。各クエリの実行時間が出力されています。TPC-H では QphH@Size という 1時間当たりの複合クエリのパフォーマンスを指標にしたものを使用しますが、HammerDB では派生の TPROC-H を使用しているため使用できません。結果を評価するにはクエリの実行時間を個別に比較するなどが良いかもしれません。

$ cat /tmp/hammerdb_ABCD1234EFGH5678IJKM1234.log
Hammerdb Log @ Sun Feb 13 13:42:14 UTC 2022
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
Vuser 1:Executing Query 14 (1 of 22)
Vuser 1:query 14 completed in 0.999 seconds
Vuser 1:Executing Query 2 (2 of 22)
Vuser 1:query 2 completed in 0.999 seconds
Vuser 1:Executing Query 9 (3 of 22)
Vuser 1:query 9 completed in 0.999 seconds
Vuser 1:Executing Query 20 (4 of 22)
Vuser 1:query 20 completed in 0.999 seconds
Vuser 1:Executing Query 6 (5 of 22)
Vuser 1:query 6 completed in 0.999 seconds
Vuser 1:Executing Query 17 (6 of 22)
Vuser 1:query 17 completed in 0.999 seconds
Vuser 1:Executing Query 18 (7 of 22)
Vuser 1:query 18 completed in 0.999 seconds
Vuser 1:Executing Query 8 (8 of 22)
Vuser 1:query 8 completed in 0.999 seconds
Vuser 1:Executing Query 21 (9 of 22)
Vuser 1:query 21 completed in 0.999 seconds
Vuser 1:Executing Query 13 (10 of 22)
Vuser 1:query 13 completed in 0.999 seconds
Vuser 1:Executing Query 3 (11 of 22)
Vuser 1:query 3 completed in 0.999 seconds
Vuser 1:Executing Query 22 (12 of 22)
Vuser 1:query 22 completed in 0.999 seconds
Vuser 1:Executing Query 16 (13 of 22)
Vuser 1:query 16 completed in 0.999 seconds
Vuser 1:Executing Query 4 (14 of 22)
Vuser 1:query 4 completed in 0.999 seconds
Vuser 1:Executing Query 11 (15 of 22)
Vuser 1:query 11 completed in 0.999 seconds
Vuser 1:Executing Query 15 (16 of 22)
Vuser 1:query 15 completed in 0.999 seconds
Vuser 1:Executing Query 1 (17 of 22)
Vuser 1:query 1 completed in 0.999 seconds
Vuser 1:Executing Query 10 (18 of 22)
Vuser 1:query 10 completed in 0.999 seconds
Vuser 1:Executing Query 19 (19 of 22)
Vuser 1:query 19 completed in 0.999 seconds
Vuser 1:Executing Query 5 (20 of 22)
Vuser 1:query 5 completed in 0.999 seconds
Vuser 1:Executing Query 7 (21 of 22)
Vuser 1:query 7 completed in 0.999 seconds
Vuser 1:Executing Query 12 (22 of 22)
Vuser 1:query 12 completed in 0.999 seconds
Vuser 1:Completed 1 query set(s) in 99 seconds
Vuser 1:Geometric mean of query times returning rows (22) is 0.99999

さいごに

前回に引き続き HammerDB の使い方をまとめたエントリです。今回は MySQL を対象としています。一般的な素の MySQL では TPC-H の様なデータ分析クエリが苦手であるためスケールファクタを大きくしすぎると全然クエリが終わらないと言ったことが起こるかもしれないためデータ量を調整する必要があります。MySQL のインタフェースでデータ分析クエリを多用する必要がある場合は、Aurora MySQL Parallel Query、MariaDB Columnstore、MySQL HeatWave などの使用を検討したほうが良いかと思います。