OLTPベンチマークTPC-CをAmazon (Serverless) Auroraで実行する

# TL;DR

* OLTP(On-Line Transaction Processing) ベンチマークTPC-C Homepageを **Amazon Aurora** で実行し，動作を確認します
    * MySQL(5.6互換，Serverless )設定で検証します
    * いくつかの記事(「参考」参照)の続編です．この記事から読み始めることもできます

# 準備

「[AWS AuroraにMariaDBクライアントから接続して使用する](https://qiita.com/myoshimi/items/eda6df62ae9aaa98bb1d)」にもとづき，Auroraのと仮想マシンのセットアップを行います

* RDBMSの準備
    * Auroraデータベースをセットアップし，以下の情報を取得します
        * エンドポイント「XXXXXXX.ap-northeast-1.rds.amazonaws.com」（データベース作成後に得られる）
        * ユーザ名とパスワード（データベース作成時に入力する）
* VM (EC2)の準備
    * インスタンスタイプt2.smallのVMをセットアップします

以降は，VMにsshログインして作業を進めます

# ベンチマーク実行準備

「[AWS AuroraにMariaDBクライアントから接続して使用する](https://qiita.com/myoshimi/items/eda6df62ae9aaa98bb1d)」「[OLTPベンチマークTPC-CをMariaDBで実行する](https://qiita.com/myoshimi/items/4205ad940214a1f48552)」を組み合わせてベンチマークの実行準備を行います．

## tpcc-mysqlの修正

* [重要] [tpcc-mysql](https://github.com/Percona-Lab/tpcc-mysql)では，データベース用の文字列長さが **51** に設定されているので，auroraのエンドポイントの文字列長よりも短く，```tpcc_load``` コマンドで，エンドポイントが正しく設定できない部分を修正します
    * 文字列長に関する定数（define文）の値を変更するだけなので，修正は簡単です

```bash
cd ~/
git clone https://github.com/Percona-Lab/tpcc-mysql
cd tpcc-mysql/src
sed -i -e "s/#define DB_STRING_MAX 51/#define DB_STRING_MAX 255/" load.c
make
# ~/tpcc-mysql/{tpcc_load,tpcc_start}が生成される
```

## ベンチマーク用データベースの作成

```bash
# データベースtpcc1の作成
mysql -h <auroraエンドポイント> \
      -u <aurora DBユーザ> \
      -P <aurora DBユーザパスワード> \
      -e "create database tpcc1;"
# テーブル群の作成
mysql -h <auroraエンドポイント> \
      -u <aurora DBユーザ> \
      -P <aurora DBユーザパスワード> \
      -D tpcc1 < create_table.sql
# インデックスの作成
mysql -h <auroraエンドポイント> \
      -u <aurora DBユーザ> \
      -P <aurora DBユーザパスワード> \
      -D tpcc1 < add_fkey_idx.sql
# データの登録
./tpcc_load -h <auroraエンドポイント> \
            -u <aurora DBユーザ> \
            -p <aurora DBユーザパスワード> \
            -d tpcc1 -w 1
# ...DATA LOADING COMPLETED SUCCESSFULLY.
```

## ベンチマークの実行

* ```tpcc_start```コマンドで，ベンチマークを実行します
    * tpcc_loadとは異なり，こちらはエンドポイントの文字列長で問題は発生しなかったです
    * tpcc-mysqlのmain.cでは```#define DB_STRING_MAX 128```になっていました

```bash
./tpcc_start \
    -h <auroraエンドポイント> \
    -u <aurora DBユーザ> \
    -p <aurora DBユーザパスワード> \
    -d tpcc1 -w 1
    -c 1 -r 10 -l 120
```

# 実行結果

## ```-c 1```の場合

```shell
MEASURING START.

  10, trx: 33, 95%: 241.504, 99%: 245.807, max_rt: 248.727, 32|63.307, 3|18.245, 3|345.180, 3|737.953
  20, trx: 30, 95%: 254.492, 99%: 260.816, max_rt: 260.854, 31|48.672, 4|17.724, 3|346.313, 3|765.782
  30, trx: 31, 95%: 247.802, 99%: 272.304, max_rt: 272.311, 29|51.514, 2|18.448, 3|344.197, 3|750.870
  40, trx: 30, 95%: 248.098, 99%: 249.962, max_rt: 249.995, 30|45.507, 4|17.851, 3|350.044, 3|746.999
  50, trx: 34, 95%: 244.925, 99%: 248.544, max_rt: 248.561, 30|49.317, 3|18.302, 4|363.639, 3|811.291
  60, trx: 30, 95%: 246.396, 99%: 246.765, max_rt: 246.792, 36|47.719, 3|18.150, 3|346.681, 3|727.066
  70, trx: 32, 95%: 247.802, 99%: 248.544, max_rt: 248.566, 29|44.937, 3|14.164, 2|336.694, 3|766.074
  80, trx: 25, 95%: 245.145, 99%: 249.663, max_rt: 249.696, 29|47.287, 3|17.808, 4|339.882, 4|752.747
  90, trx: 33, 95%: 248.098, 99%: 251.614, max_rt: 251.591, 28|47.763, 3|17.595, 3|350.695, 2|766.190
 100, trx: 28, 95%: 244.340, 99%: 246.691, max_rt: 246.711, 35|46.657, 2|14.183, 3|336.299, 3|762.605
 110, trx: 33, 95%: 249.439, 99%: 253.352, max_rt: 253.326, 30|50.681, 3|17.812, 2|353.200, 3|727.593
 120, trx: 29, 95%: 247.431, 99%: 265.940, max_rt: 265.957, 29|47.153, 4|19.142, 4|346.152, 4|781.243

STOPPING THREADS.

<Raw Results>
  [0] sc:0 lt:368  rt:0  fl:0 avg_rt: 193.5 (5)
  [1] sc:0 lt:368  rt:0  fl:0 avg_rt: 43.1 (5)
  [2] sc:0 lt:37  rt:0  fl:0 avg_rt: 17.7 (5)
  [3] sc:0 lt:37  rt:0  fl:0 avg_rt: 368.8 (80)
  [4] sc:0 lt:37  rt:0  fl:0 avg_rt: 766.8 (20)
 in 120 sec.

<Raw Results2(sum ver.)>
  [0] sc:0  lt:368  rt:0  fl:0
  [1] sc:0  lt:368  rt:0  fl:0
  [2] sc:0  lt:37  rt:0  fl:0
  [3] sc:0  lt:37  rt:0  fl:0
  [4] sc:0  lt:37  rt:0  fl:0

<Constraint Check> (all must be [OK])
 [transaction percentage]
        Payment: 43.45% (>=43.0%) [OK]
   Order-Status: 4.37% (>= 4.0%) [OK]
       Delivery: 4.37% (>= 4.0%) [OK]
    Stock-Level: 4.37% (>= 4.0%) [OK]
 [response time (at least 90% passed)]
      New-Order: 0.00%  [NG] *
        Payment: 0.00%  [NG] *
   Order-Status: 0.00%  [NG] *
       Delivery: 0.00%  [NG] *
    Stock-Level: 0.00%  [NG] *

<TpmC>
                 184.000 TpmC
```

## ```-c 32```の場合

```bash
MEASURING START.

  10, trx: 208, 95%: 296.466, 99%: 421.431, max_rt: 528.576, 208|1813.405, 21|18.645, 22|377.452, 20|784.370
  20, trx: 210, 95%: 292.937, 99%: 357.672, max_rt: 403.166, 214|2043.776, 21|18.481, 20|357.584, 21|761.866
  30, trx: 207, 95%: 310.267, 99%: 422.441, max_rt: 478.308, 205|1809.737, 21|21.657, 21|351.681, 21|794.313
  40, trx: 223, 95%: 289.797, 99%: 474.894, max_rt: 585.522, 225|1741.429, 22|18.436, 22|367.418, 23|774.429
  50, trx: 197, 95%: 283.618, 99%: 397.655, max_rt: 450.444, 203|1854.789, 20|18.116, 20|415.999, 19|749.997
  60, trx: 181, 95%: 415.295, 99%: 710.524, max_rt: 881.388, 173|2278.647, 18|19.590, 19|1081.117, 18|788.312
  70, trx: 198, 95%: 323.836, 99%: 380.308, max_rt: 421.085, 201|1866.792, 20|25.030, 19|406.934, 19|777.312
  80, trx: 214, 95%: 267.057, 99%: 357.780, max_rt: 380.895, 210|1582.016, 21|17.584, 21|376.898, 22|801.318
  90, trx: 210, 95%: 295.403, 99%: 359.713, max_rt: 370.218, 211|1639.290, 21|19.564, 22|349.812, 21|822.758
 100, trx: 196, 95%: 277.654, 99%: 367.769, max_rt: 372.826, 193|1730.746, 20|19.379, 19|337.562, 20|725.766
 110, trx: 214, 95%: 267.537, 99%: 387.085, max_rt: 414.882, 219|1609.627, 21|19.107, 21|365.882, 21|759.442
 120, trx: 214, 95%: 272.467, 99%: 355.750, max_rt: 388.047, 215|1661.604, 22|18.813, 23|357.841, 22|748.135

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

<Raw Results>
  [0] sc:0 lt:2472  rt:0  fl:0 avg_rt: 174.0 (5)
  [1] sc:0 lt:2477  rt:0  fl:0 avg_rt: 1418.2 (5)
  [2] sc:0 lt:248  rt:0  fl:0 avg_rt: 13.8 (5)
  [3] sc:0 lt:249  rt:0  fl:0 avg_rt: 309.0 (80)
  [4] sc:0 lt:247  rt:0  fl:0 avg_rt: 588.5 (20)
 in 120 sec.

<Raw Results2(sum ver.)>
  [0] sc:0  lt:2472  rt:0  fl:0
  [1] sc:0  lt:2477  rt:0  fl:0
  [2] sc:0  lt:248  rt:0  fl:0
  [3] sc:0  lt:249  rt:0  fl:0
  [4] sc:0  lt:247  rt:0  fl:0

<Constraint Check> (all must be [OK])
 [transaction percentage]
        Payment: 43.51% (>=43.0%) [OK]
   Order-Status: 4.36% (>= 4.0%) [OK]
       Delivery: 4.37% (>= 4.0%) [OK]
    Stock-Level: 4.34% (>= 4.0%) [OK]
 [response time (at least 90% passed)]
      New-Order: 0.00%  [NG] *
        Payment: 0.00%  [NG] *
   Order-Status: 0.00%  [NG] *
       Delivery: 0.00%  [NG] *
    Stock-Level: 0.00%  [NG] *

<TpmC>
                 1236.000 TpmC
```

# 若干の考察

* TpmCスコアのみ，比較してみました．

|Platform| connection | TpmC |
|---|---|---:|
| Mariadb (local) | 32 | 7915.5 |
| TiDB(local) | 1 | 957.5 |
| aurora (Serverless) | 1 | 184.0 |
| aurora (Serverless) | 32 | 1236.0 |
| aurora (Serverless) | 128 | 982.5 |
| aurora (Serverless) | 256 | 1163.0 |

* スコアについて
    * ローカルで実行するMariaDBが圧倒的にスコアが高く，条件が合えば（メモリが十分で，外部環境がボトルネックにならず，負荷が予測できるのであれば），現在でも選択肢として有用です
* auroraは単発のトランザクション処理にはあまり強くなさそうです
    * ただし，コネクション数を大きくするとスコアが伸びることから，負荷が予測できないサービスに対しては用途がありそうです
    * クラウドの負荷状況に応じてなのか，実行ごとにスコアが若干変動します

# 参考

* [OLTPベンチマークTPC-CをMariaDBで実行する](https://qiita.com/myoshimi/items/4205ad940214a1f48552)
* [OLTPベンチマークTPC-CをTiDBで実行する](https://qiita.com/myoshimi/items/b965956278b1d6a6ca1d)
* [AWS AuroraにMariaDBクライアントから接続して使用する](https://qiita.com/myoshimi/items/eda6df62ae9aaa98bb1d)