Amazon Auroraと同じbenchmark testをGoogle Cloud SQLでやってみた

**※この発言は個人の見解であり、所属する組織の公式見解ではありません**

# 測定結果
とりあえず結果を知りたい人・時間がない人向けのまとめ。
ポイントは以下。
 - CloudSQLは通常業務であれば全然使えるパフォーマンス
 - read onlyの測定でCloud SQL Proxyを経由したらパフォーマンスが上がった。
 - read writeの測定ではCloud SQL Proxyの経由ありなしではパフォーマンスは変わらななかった。
 - ~~Amazon Auroraの方が全然パフォーマンスがよい。~~

| | transactions(tps) | read/write requests(rps) |
|---|---:|---:| 
| read only (Cloud SQL Proxyなし) | 5969.48 | 59844.80 |
| read only (Cloud SQL Proxyあり) | 8010.22 | 80102.26 |
| read write (Cloud SQL Proxyなし) | 2894.55 | 11578.44 |
| read write (Cloud SQL Proxyあり) | 2955.41 | 11821.88 |

# あらまし
Amazon AuroraよりGoogleCloudSQLの方が早いんやで、というGoogle社の[blogエントリ](https://cloudplatform.googleblog.com/2016/08/Cloud-SQL-Second-Generation-performance-and-feature-deep-dive.html)を見て、ほんまかいなと思い検証。
あわせてCloudSQL Proxy経由での性能も評価した。
ちなみに本件、自腹で検証しているのでGCPの利用料金のことを考えると胃が痛いです。

# 実施内容
今回ベンチマークテストの方法はAmazon Web Services社のホワイトペーパである[Amazon Aurora Performance Assessment](https://d0.awsstatic.com/product-marketing/Aurora/RDS_Aurora_Performance_Assessment_Benchmarking_v1-2.pdf)を元に極力近くなるよう環境構築をGoogleCloudPlatform上に構築した。

ホワイトペーパではr3.8xlarge x 4台のVMからAmazon Aurola r3.8xlargeにsysbenchを実行している為、今回構築した測定環境ではn1-highcpu-32 x 4台のVMからGoogleCloudSQLv2の最高のマシンスペックであるdb-n1-highmem-16にsysbenchを実行した。
なお今回の測定ではsysbenchで大量のmemoryは不要と判断しn1-highmem-32ではなく、n1-highcpu-32を選択しています。

### instance type のスペック比較
| instance type | vCPU | memory(GiB) |
|---|---:|---:|
| r3.8xlarge | 32 | 244 |
| n1-highcpu-32 | 32 | 28 |
| db-n1-highmem-16 | 16 | 104 |

~~CloudSQLにdb-n1-highmem-32のスペックがない時点で負けてるじゃねーかと思った。~~
**うちはうち、よそはよその精神で。**

# 環境構築
## Cloud SQL Instance構築

gcloud sql コマンドから`MYSQL_5_7`のinstanceを構築できないのでCloudConsoleで構築。
弄ったのは以下。

```
Version: MYSQL_5_7
tier: db-n1-highmem-16
binaryLogEnabled: false
```

Storageはデフォルトの`SSD 10GB (auto scale: false)`としています。
今回のテストではデータは5GB弱であり、メモリ(innodb_buffer_pool)に乗ること、disk access速度はディスク容量で変わるものの、初期はバーストがかかり、バーストがかからなくなった頃には全て読み込んでいるいるであろうという判断をしています。

## database作成

```
export MYSQL_IP=<CloudSQLのIP>
mysql -uroot -h"${MYSQL_IP}" -e "CREATE DATABASE IF NOT EXISTS sbtest"
mysql -uroot -h"${MYSQL_IP}" -e "GRANT ALL ON sbtest.* TO 'sysbench'@'%' IDENTIFIED BY 'sysbench'"
```

## test用のdata作成

```
sysbench \
--test=tests/db/oltp.lua \
--mysql-host="${MYSQL_IP}" \
--mysql-port=3306 \
--mysql-user=sysbench \
--mysql-password=sysbench \
--mysql-db=sbtest \
--mysql-table-engine=innodb \
--oltp-table-size=25000 \
--oltp-tables-count=250 \
--db-driver=mysql \
prepare
```

## benchmark client(VM)の構築
ホワイトペーパの手順がyumを使用していたので、合わせる為`centos-7`を使用しています。
machine-typeは`n1-highcpu-32`を使用しています。
また、以下をinstallしています。

```
yum install bzr
yum install automake
yum install libtool
yum install mysql-devel
yum install mysql

# sysbenchのinstall
cd /src/sysbench
bzr branch lp:sysbench
cd sysbench
./autogen.sh
./configure
make
mkdir -p /srv/sysbench/src
```

また、cloud_sql_proxyを[この手順](http://qiita.com/kumanoryo/items/ef3fbec70b4138ffe1c2)でinstall、設定しています。

# testの実施
MSQL_IPをCloudSQLのIPおよびCloud SQL Proxy使用時は`127.0.0.1`を指定して実施しています。

## read only
ホワイトペーパと同様に4台から一斉に実施したところ、毎回1-２台応答が返ってこない現象となったので、比較的安定する3台でベンチを実施する形で測定した。

```
sysbench \
--test=tests/db/oltp.lua \
--mysql-host=${MYSQL_IP} \
--oltp-tables-count=250 \
--mysql-user=sysbench \
--mysql-password=sysbench \
--mysql-port=3306 \
--db-driver=mysql \
--oltp-table-size=25000 \
--mysql-db=sbtest \
--max-requests=0 \
--oltp_simple_ranges=0 \
--oltp-distinct-ranges=0 \
--oltp-sum-ranges=0 \
--oltp-order-ranges=0 \
--max-time=600 \
--oltp-read-only=on \
--num-threads=500 \
run
```

## read write
read onlyの時以上にnum-threadsが大きくなっていて3台でも測定が安定しなかった為、2台でベンチを実施する形で測定した。

```
/sysbench \
--test=tests/db/oltp.lua \
--mysql-host=${MYSQL_IP} \
--oltp-tables-count=250 \
--mysql-user=sysbench \
--mysql-password=sysbench \
--mysql-port=3306 \
--db-driver=mysql \
--oltp-table-size=25000 \
--mysql-db=sbtest \
--max-requests=0 \
--max-time=600 \
--oltp_simple_ranges=0 \
--oltp-distinct-ranges=0 \
--oltp-sum-ranges=0 \
--oltp-order-ranges=0 \
--oltp-point-selects=0 \
--num-threads=1000 \
--rand-type=uniform \
run
```

# 計測結果
今回、私自身がAmazon Auroraの測定をしていないので、Amazon Auroraの数値はここには載せません。
もし比較するのであれば、[ホワイトペーパ](https://d0.awsstatic.com/product-marketing/Aurora/RDS_Aurora_Performance_Assessment_Benchmarking_v1-2.pdf)をご参照ください。

## read only (Cloud SQL Proxy なし)

sysbnech client 1
![image](https://qiita-image-store.s3.amazonaws.com/0/51208/2cd4be39-ef2f-5b80-f440-0ab117ac1d4d.png)

sysbench client 2
![image](https://qiita-image-store.s3.amazonaws.com/0/51208/6aa92f52-97f6-c5eb-7be6-53523c76d203.png)

sysbench client 3
![image](https://qiita-image-store.s3.amazonaws.com/0/51208/37dc0d68-8b1c-9207-61ef-aa343f234def.png)

## read only (Cloud SQL Proxy あり)
意外にもCloud SQL Proxyを経由すると数値が良くなった。
オーバヘッドがあると思ってたけどこれには驚き。

sysbench client 1
![image](https://qiita-image-store.s3.amazonaws.com/0/51208/0dd04f58-3b2e-0722-d8d0-27d880c4d57c.png)

sysbench client 2
![image](https://qiita-image-store.s3.amazonaws.com/0/51208/0dafe74e-626f-98f1-2d2c-5ccfb0313f83.png)

sysbench client 3
![image](https://qiita-image-store.s3.amazonaws.com/0/51208/6b6d6d10-0970-94b6-5cf3-415dc84c928b.png)

## read write (Cloud SQL Proxy なし)
sysbench client 1
![image](https://qiita-image-store.s3.amazonaws.com/0/51208/70c3dd98-61db-492f-79a9-1850890ee94c.png)

sysbench client 2
![image](https://qiita-image-store.s3.amazonaws.com/0/51208/430b712d-e8a9-3293-fd19-45824d5cd405.png)

## read write (Cloud SQL Proxy あり)
~~測定不能。Cloud SQL Porxyの動作が正しくないように見受けられるので、調査をすすめる。~~
調査したところ、cloud_sql_proxyのMax open filesの値がOSデフォルト(1024)だった為に発生していたので、[cloud_sql_proxy起動時の設定を見直して](http://qiita.com/kumanoryo/items/ef3fbec70b4138ffe1c2#max-open-files%E8%A8%AD%E5%AE%9A)再度計測した。
Cloud SQL Proxyなしの場合と比較すると微増ではあるが、誤差の範囲内なのでreadと比較してCloud SQL Proxyを経由することによるパフォーマンスの恩恵はなさそう。

sysbench client 1
![image](https://qiita-image-store.s3.amazonaws.com/0/51208/44b7b485-63eb-a867-9e96-a8233e2cd4a1.png)

sysbench client 2
![image](https://qiita-image-store.s3.amazonaws.com/0/51208/1339ac99-7c7b-813d-6ab0-f052f755e7fc.png)

# まとめ
1. Cloud SQLにAmazon Auroraと同じパラメータでベンチマークテストを実施しようとしても、正常に実施できない。
num-threadsを減らすなり、VM台数を減らす必要がある。
ということから現状は性能においてAmazon Aurora > Cloud SQLと判断できる。
1. とはいえCloud SQLは32vCPUのinstanceがまだないので、これから本気だせばワンチャンある？
1. Cloud SQL Proxyを経由させるとreadのパフォーマンスが上がる。~~ただしwriteのtestを実施したところエラーが発生したので、Cloud SQL Proxyを本番投入するのはまだ早そう。~~
1. Cloud SQL Proxyを経由させてもread/writeベンチマークテスト時のパフォーマンスは変わらない。
1. Cloud SQL Proxy、そろそろ本番投入を考えてみてもいいのでは。

# 最後にもう一度
**※この発言は個人の見解であり、所属する組織の公式見解ではありません**