OLTPベンチマークTPC-CをMariaDBで実行する

# TL;DR

* OLTP(On-Line Transaction Processing) ベンチマーク[TPC-C Homepage](http://www.tpc.org/tpcc/)をMySQLで実行し，動作を確認します

# 実験概要

* クエリを発行するノードとして，EC2のt2.smallインスタンス(Amazon Linux2)を使用します
    * ベンチマーク実行用のインスタンスです
* [github.com/Percona-Lab/tpcc-mysql](https://github.com/Percona-Lab/tpcc-mysql)をダウンロードしてビルドし，動作することを確認します

# TPC-C概要

* TPC-Cは「複数の倉庫にある製品の輸送，販売に関する処理」を実施するものです
* 多数の（比較的小さな）処理をたくさん実行するときの性能指標が得られます

# データベース関連ツールのインストール

## MySQLクライアント(Mariadb)のインストール

```bash
# mariadb-5.5がインストールされる
sudo yum -y install git mysql mysql-devel gcc
```

## MariaDBサーバのインストールと起動

```bash
sudo yum install mariadb-server
sudo systemctl start  mariadb
sudo systemctl enable mariadb
```

# TPC-C MySQLベンチマークのセットアップ

* tpcc用のベンチマークプログラムを```git clone```してビルドします
    * データをデータベースに登録する```tpcc_load```と，ベンチマークを実行する```tpcc_start```が作られます

```bash
cd ~/
git clone https://github.com/Percona-Lab/tpcc-mysql
cd tpcc-mysql/src
make
# ~/tpcc-mysql/{tpcc_load,tpcc_start}が生成される
```

* 下記の手順で，ベンチマーク用のデータベースをMySQLに作成します

```bash
# データベースtpcc1000の作成
mysql -u root -e "create database tpcc1000;"
# テーブル群の作成
mysql -u root -D tpcc1000 < create_table.sql
# インデックスの作成
mysql -u root -D tpcc1000 < add_fkey_idx.sql
# データの登録
./tpcc_load -h 127.0.0.1 -d tpcc1000 -u root -p "" -w 1
```

* ```tpcc_load```のオプションはmysqlコマンドと似たようなものですが，```-w```オプションだけが特殊です
* ```-w```では，warehouse数（倉庫の数）を指定します
    * warehouse数は，データベースが占めるデータ量の数と直結します
    * 概ね$\textrm{warehouse}\times80$[MB]程度，ストレージを消費するようです(「[MySQLのベンチマークツール: tpcc-mysql と sysbench-tpcc の紹介](https://www.s-style.co.jp/blog/2018/03/1666/)」より)

# ベンチマークの実行

* ```tpcc_start```で，ベンチマークを実行します

```bash
./tpcc_start \
    -h 127.0.0.1 \
    -d tpcc1000 \
    -u root -p "" \
    -w 1 -c 32 \
    -r 10 \
    -l 120
```

* ```tpcc_start```のオプション(DB関連オプションを除く)は以下の通りです

|オプション|説明 |
|---|---|
| -w 1 | warehouse数 |
| -c 32 | (同時)接続数 |
| -r 10 | 計測までの慣らし運転(rampup)時間(秒) |
| -l 120 | 計測時間(秒) |

# 実行結果

* ```tpcc_start```コマンドの結果として，以下のような計測結果が表示されます

```shell
***************************************
*** ###easy### TPC-C Load Generator ***
***************************************
.....<snip>.....
MEASURING START.

  10, trx: 1311, 95%: 107.562, 99%: 149.105, max_rt: 338.485, 1316|366.395, 131|51.025, 132|677.307, 131|345.997
  20, trx: 1296, 95%: 109.939, 99%: 147.463, max_rt: 322.246, 1295|323.400, 130|53.439, 129|802.920, 130|277.230
  30, trx: 1300, 95%: 112.267, 99%: 148.304, max_rt: 176.109, 1303|295.950, 130|37.756, 130|295.869, 129|371.193
  40, trx: 1315, 95%: 109.709, 99%: 174.897, max_rt: 239.317, 1310|354.823, 132|27.944, 132|712.041, 133|261.713
  50, trx: 1312, 95%: 115.713, 99%: 167.268, max_rt: 220.338, 1325|276.190, 131|20.170, 130|431.076, 130|296.312
  60, trx: 1348, 95%: 115.194, 99%: 145.795, max_rt: 247.404, 1356|303.051, 135|29.486, 131|507.513, 134|305.737
  70, trx: 1313, 95%: 121.899, 99%: 163.359, max_rt: 329.632, 1301|291.882, 131|32.174, 136|2301.048, 133|246.819
  80, trx: 1330, 95%: 110.400, 99%: 135.891, max_rt: 202.760, 1329|266.710, 133|50.281, 132|373.180, 133|280.585
  90, trx: 1340, 95%: 109.709, 99%: 147.595, max_rt: 303.892, 1341|307.601, 134|46.056, 135|313.349, 134|260.212
 100, trx: 1317, 95%: 111.163, 99%: 154.188, max_rt: 246.919, 1326|283.833, 132|36.562, 130|458.566, 129|285.215
 110, trx: 1327, 95%: 113.517, 99%: 150.675, max_rt: 225.441, 1319|302.704, 132|37.690, 134|290.268, 136|275.329
 120, trx: 1322, 95%: 109.873, 99%: 173.178, max_rt: 479.994, 1318|307.102, 132|31.624, 132|807.850, 131|251.597

STOPPING THREADS................................

<Raw Results>
  [0] sc:147 lt:15684  rt:0  fl:0 avg_rt: 57.8 (5)
  [1] sc:3 lt:15836  rt:0  fl:0 avg_rt: 171.6 (5)
  [2] sc:1137 lt:446  rt:0  fl:0 avg_rt: 5.5 (5)
  [3] sc:164 lt:1419  rt:0  fl:0 avg_rt: 165.7 (80)
  [4] sc:2 lt:1581  rt:0  fl:0 avg_rt: 158.1 (20)
 in 120 sec.

<Raw Results2(sum ver.)>
  [0] sc:147  lt:15684  rt:0  fl:0
  [1] sc:3  lt:15836  rt:0  fl:0
  [2] sc:1137  lt:446  rt:0  fl:0
  [3] sc:164  lt:1419  rt:0  fl:0
  [4] sc:2  lt:1581  rt:0  fl:0

<Constraint Check> (all must be [OK])
 [transaction percentage]
        Payment: 43.49% (>=43.0%) [OK]
   Order-Status: 4.35% (>= 4.0%) [OK]
       Delivery: 4.35% (>= 4.0%) [OK]
    Stock-Level: 4.35% (>= 4.0%) [OK]
 [response time (at least 90% passed)]
      New-Order: 0.93%  [NG] *
        Payment: 0.02%  [NG] *
   Order-Status: 71.83%  [NG] *
       Delivery: 10.36%  [NG] *
    Stock-Level: 0.13%  [NG] *

<TpmC>
                 7915.500 TpmC
```

* **TpmC**が，1分間に処理できるPayment（支払い）処理数です
    * 一般的にベンチマークスコアとして使用されます
* ```response time```が全部NGになっているので，t2.smallでは接続数32の処理に耐えられないと言えます
    * ```-c 1```で計測した場合でも，New-Orderが70%で，NGでした（それ以外は95%以上）

# 今後の課題

* TPC-Cを別のDBMSで実行し，性能検証を行う

# 参考

* [TPC-C Homepage](http://www.tpc.org/tpcc/)
* [github.com/Percona-Lab/tpcc-mysql](https://github.com/Percona-Lab/tpcc-mysql)
* [MySQLのベンチマークツール: tpcc-mysql と sysbench-tpcc の紹介](https://www.s-style.co.jp/blog/2018/03/1666/)