MySQLのベンチマークツールはいくつかあり、前回はsysbenchを紹介させていただきましたが、今回は tpcc-mysql と 同様のシナリオを sysbench で実行できる sysbench-tpcc を紹介させていただきます。
tpcc-mysql と sysbench-tpcc
TPC(Transaction Processing Performance Council)は非営利団体によるデータベースのベンチマークの定義を行なっており、その中のシナリオの一つが「TPC-C」です。複数の販売区域と倉庫を持つ卸売り業者を模したもので、現実に近いシナリオとなっているのが特徴です。
tpcc-mysqlとsysbench-tpccもこの「TPC-C」のシナリオに基づいてMySQL向けに作成されたベンチマークツールです。
tpcc-mysqlはC言語で実装されていますが、sysbench-tpcc は sysbench 1.0 から Lua スクリプトでシナリオを作成することができるようになったため、sysbench 実行できる TPC-C のベンチマークスクリプトになります。
参考
- TPC-Homepage V5
- Percona-Lab/tpcc-mysql
- Percona-Lab/sysbench-tpcc
- sysbench 1.0 でオリジナルのベンチマークシナリオを作成する
tpcc-mysql
インストール
必要なパッケージのインストールを行います
1 |
$ sudo yum install -y gcc make git mysql-devel |
レポジトリをクローンしてソースコードを取得します
1 |
$ git clone https://github.com/Percona-Lab/tpcc-mysql.git |
コンパイルします
1 2 |
$ cd tpcc-mysql/src $ make |
tpcc-mysql ディレクトリ直下に tpcc_load と tpcc_start が作成されます。
テストデータのロード
ベンチマーク用のデータベースを作成します
1 |
$ mysql -u root -p -e "create database tpcc" |
テーブルを作成します
1 |
$ mysql -u root -p tpcc < create_table.sql |
(オプション)外部キー制約をつけます
1 |
$ mysql -u root -p tpcc < add_fkey_idx.sql |
テーブル構成は以下のようになっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
mysql> show tables; +----------------+ | Tables_in_tpcc | +----------------+ | customer | | district | | history | | item | | new_orders | | order_line | | orders | | stock | | warehouse | +----------------+ 9 rows in set (0.00 sec) |
テストデータの投入
1 |
$ ./tpcc_load -h localhost -u root -p password -d tpcc -w 1 |
-w
は warehouse、つまり倉庫の数です。この数値でデータサイズを調整することができます。
warehouse = 1 の各テーブルのレコード数は以下の通りです
テーブル名 | レコード数 |
---|---|
customer | 30000 |
district | 10 |
history | 30000 |
item | 100000 |
new_orders | 9000 |
order_line | 300716 |
orders | 30000 |
stock | 100000 |
warehouse | 1 |
ベンチマークの実行
1 |
$ ./tpcc_start -h localhost -u root -p password -d tpcc -w 1 -c 1 -r 10 -l 120 |
-c
同時接続数を指定することができます。-r
ベンチマークを計測する前の助走時間(秒)を指定することができます。-l
ベンチマークの計測時間(秒)を指定することができます。
ベンチマークのスコアについて
ベンチマークの計測が終了すると結果が色々出力されますが、TPC-C では1分間に実行されるPayment処理数を 「TpmC」としてスコア化されます
1 2 |
<TpmC> 4009.000 TpmC |
sysbench-tpcc
インストール
まず、sysbench のインストールを行います。
1 2 |
$ curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash $ sudo yum -y install sysbench |
git をインストールします。
1 |
$ sudo yum install -y git |
レポジトリをクローンします。
1 |
$ git clone https://github.com/Percona-Lab/sysbench-tpcc.git |
テストデータのロード
1 |
$ ./tpcc.lua --mysql-host=127.0.0.1 --mysql-user=root --mysql-db=sbt --tables=1 --scale=10 prepare |
接続設定や同時接続数、実行時間などは他のシナリオと共通です。
tpcc.lua
のオプションは下記の通りです
1 2 3 4 5 6 7 8 9 10 |
$ ./tpcc.lua help sysbench 1.0.11 (using bundled LuaJIT 2.1.0-beta2) tpcc.lua options: --trx_level=STRING Transaction isolation level (RC, RR or SER) [RR] --mysql_table_options=STRING Extra table options, if MySQL is used. e.g. 'COLLATE latin1_bin' [] --scale=N Scale factor (warehouses) [100] --tables=N Number of tables [1] --mysql_storage_engine=STRING Storage engine, if MySQL is used [innodb] --use_fk=N Use foreign keys [1] |
--trx_level
トランザクションの分離レベルを指定することができます。(デフォルト: RR)
RC: READ-COMMITTED
RR: REPEATABLE-READ
SER: SERIALIZABLE-
--mysql_table_options
テーブルオプションを指定することができます。
文字コードの指定や、圧縮の指定などが行うことができます。 -
--scale
テストデータ量を決めるオプションです。(デフォルト: 100)
tpcc-mysql では warehouse として指定していた倉庫の数になります。 -
--tables
こちらもテストデータ量を決めるオプションですが、指定した個数分のテーブルが連番で作られます。(デフォルト: 1)
1 2 3 4 5 6 7 8 |
mysql> show tables like 'customer%'; +------------------------------+ | Tables_in_sbtest (customer%) | +------------------------------+ | customer1 | | customer2 | | customer3 | +------------------------------+ |
--mysql_storage_engine
ストレージエンジンを指定することができます。(デフォルト: innodb)-
--use_fk
外部キー制約を設定するか指定することができます(デフォルト: 1 [有効])
ベンチマークの実行
1 |
$ ./tpcc.lua --mysql-host=127.0.0.1 --mysql-user=root --mysql-db=sbt --tables=1 --scale=10 run |
テストデータ削除
1 |
$ ./tpcc.lua --mysql-host=127.0.0.1 --mysql-user=root --mysql-db=sbt --tables=1 --scale=10 cleanup |
ベンチマークのスコアについて
計測結果はsysbenchで共通しています
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
SQL statistics: queries performed: read: 32301 write: 19491 other: 3008 total: 54800 transactions: 1503 (150.15 per sec.) queries: 54800 (5474.60 per sec.) ignored errors: 8 (0.80 per sec.) reconnects: 0 (0.00 per sec.) General statistics: total time: 10.0057s total number of events: 1503 Latency (ms): min: 0.83 avg: 6.65 max: 41.70 95th percentile: 20.74 sum: 9998.00 Threads fairness: events (avg/stddev): 1503.0000/0.00 execution time (avg/stddev): 9.9980/0.00 |
TPC-C では 1分間に実行されるPayment処理数を「TpmC」としてスコア化していますが、sysbench-tpcc では現状、全てのトランザクション処理をカウントしているためTPC-Cとしてのスコアがないため注意が必要です。
ベンチマークで実行されるクエリ
MySQLの「long_query_time」を0秒に指定して、ベンチマーク実行中に発行されるクエリを取得しました。下記は tpcc-mysql の結果ですが、おそらく sysbench-tpcc でも同様だと思われます。
種別によるクエリの割合は以下の通りです。
種別 | 割合 |
---|---|
SELECT | 61% |
UPDATE | 22% |
INSERT | 16% |
DELETE | 1% |
個々のクエリの実行回数と実行例です。
実行されるクエリは19種類とかなり多彩でした。
ベンチマークのテストデータとしてはテーブル数は比較的多く、外部キー制約も使うことができるので、JOINを使ったクエリが多いのかと思っていましたが、意外と1つだけという結果でした。
実行回数 | クエリ |
---|---|
125836 | SELECT count(*) FROM stock WHERE s_w_id = 1 AND s_i_id = 24582 AND s_quantity < 12 |
63166 | SELECT s_quantity, s_data, s_dist_01, s_dist_02, s_dist_03, s_dist_04, s_dist_05, s_dist_06, s_dist_07, s_dist_08, s_dist_09, s_dist_10 FROM stock WHERE s_i_id = 26374 AND s_w_id = 1 FOR UPDATE |
63166 | UPDATE stock SET s_quantity = 6 WHERE s_i_id = 89515 AND s_w_id = 1 |
63166 | INSERT INTO order_line (ol_o_id, ol_d_id, ol_w_id, ol_number, ol_i_id, ol_supply_w_id, ol_quantity, ol_amount, ol_dist_info) VALUES (3901, 10, 1, 9, 45877, 1, 5, 31.915802001953125, ‘c1jAaquYaer8ycPxTfuX5t5S’) |
63236 | SELECT i_price, i_name, i_data FROM item WHERE i_id = 32994 |
6320 | UPDATE order_line SET ol_delivery_d = ‘2017-11-24 07:41:20’ WHERE ol_o_id = 3166 AND ol_d_id = 1 AND ol_w_id = 1 |
6316 | SELECT c_discount, c_last, c_credit, w_tax FROM customer, warehouse WHERE w_id = 1 AND c_w_id = w_id AND c_d_id = 5 AND c_id = 2553 |
6318 | SELECT c_first, c_middle, c_last, c_street_1, c_street_2, c_city, c_state, c_zip, c_phone, c_credit, c_credit_lim, c_discount, c_balance, c_since FROM customer WHERE c_w_id = 1 AND c_d_id = 4 AND c_id = 2959 FOR UPDATE |
6320 | UPDATE customer SET c_balance = c_balance + 1478.6199951171875 , c_delivery_cnt = c_delivery_cnt + 1 WHERE c_id = 2174 AND c_d_id = 8 AND c_w_id = 1 |
6318 | INSERT INTO history(h_c_d_id, h_c_w_id, h_c_id, h_d_id, h_w_id, h_date, h_amount, h_data) VALUES(4, 1, 2811, 4, 1, ‘2017-11-24 07:40:30’, 2108, ‘K5WONgxjYiClxY9’) |
6318 | UPDATE warehouse SET w_ytd = w_ytd + 4963 WHERE w_id = 1 |
6320 | UPDATE orders SET o_carrier_id = 8 WHERE o_id = 3273 AND o_d_id = 8 AND o_w_id = 1 |
6320 | SELECT SUM(ol_amount) FROM order_line WHERE ol_o_id = 3139 AND ol_d_id = 8 AND ol_w_id = 1 |
6316 | INSERT INTO orders (o_id, o_d_id, o_w_id, o_c_id, o_entry_d, o_ol_cnt, o_all_local) VALUES(3819, 7, 1, 1976, ‘2017-11-24 07:40:29’, 9, 1) |
6316 | UPDATE district SET d_next_o_id = 3956 + 1 WHERE d_id = 5 AND d_w_id = 1 |
6318 | UPDATE district SET d_ytd = d_ytd + 970 WHERE d_w_id = 1 AND d_id = 1 |
6320 | DELETE FROM new_orders WHERE no_o_id = 2930 AND no_d_id = 8 AND no_w_id = 1 |
4126 | SELECT count(c_id) FROM customer WHERE c_w_id = 1 AND c_d_id = 8 AND c_last = ‘CALLYABLEANTI’ |
6316 | SELECT d_next_o_id, d_tax FROM district WHERE d_id = 9 AND d_w_id = 1 FOR UPDATE |
まとめ
今回はTPC-Cのシナリオが実行できるtpcc-mysqlとsysbench-tpccを紹介しました。
sysbench-tpccについてはTpmCのスコアが取れないなど、まだまだ不十分なところもありますが、tpcc-mysqlのIssue対応を見ると今後はsysbench-tpccをメインに開発が進んでいくと思われます。