スマートスタイル TECH BLOG

MySQLのベンチマークツール: tpcc-mysql と sysbench-tpcc の紹介

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 のベンチマークスクリプトになります。

参考

tpcc-mysql

インストール

必要なパッケージのインストールを行います

レポジトリをクローンしてソースコードを取得します

コンパイルします

tpcc-mysql ディレクトリ直下に tpcc_load と tpcc_start が作成されます。

テストデータのロード

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

テーブルを作成します

(オプション)外部キー制約をつけます

テーブル構成は以下のようになっています。

テストデータの投入

-w は warehouse、つまり倉庫の数です。この数値でデータサイズを調整することができます。

warehouse = 1 の各テーブルのレコード数は以下の通りです

テーブル名 レコード数
customer 30000
district 10
history 30000
item 100000
new_orders 9000
order_line 300716
orders 30000
stock 100000
warehouse 1

ベンチマークの実行

  • -c
    同時接続数を指定することができます。

  • -r
    ベンチマークを計測する前の助走時間(秒)を指定することができます。

  • -l
    ベンチマークの計測時間(秒)を指定することができます。

ベンチマークのスコアについて

ベンチマークの計測が終了すると結果が色々出力されますが、TPC-C では1分間に実行されるPayment処理数を 「TpmC」としてスコア化されます

sysbench-tpcc

インストール

まず、sysbench のインストールを行います。

git をインストールします。

レポジトリをクローンします。

テストデータのロード

接続設定や同時接続数、実行時間などは他のシナリオと共通です。
tpcc.lua のオプションは下記の通りです

  • --trx_level
    トランザクションの分離レベルを指定することができます。(デフォルト: RR)
    RC: READ-COMMITTED
    RR: REPEATABLE-READ
    SER: SERIALIZABLE

  • --mysql_table_options
    テーブルオプションを指定することができます。
    文字コードの指定や、圧縮の指定などが行うことができます。

  • --scale
    テストデータ量を決めるオプションです。(デフォルト: 100)
    tpcc-mysql では warehouse として指定していた倉庫の数になります。

  • --tables
    こちらもテストデータ量を決めるオプションですが、指定した個数分のテーブルが連番で作られます。(デフォルト: 1)

  • --mysql_storage_engine
    ストレージエンジンを指定することができます。(デフォルト: innodb)

  • --use_fk
    外部キー制約を設定するか指定することができます(デフォルト: 1 [有効])

ベンチマークの実行

テストデータ削除

ベンチマークのスコアについて

計測結果はsysbenchで共通しています

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をメインに開発が進んでいくと思われます。


MySQL

 

Return Top