この記事を見て、結果に疑問を持ったので、AuroraとRDS MySQL 5.7のベンチマークを取ってみました。
動作環境
- サーバ
- Aurora 5.6.10a / db.r3.large / SingleAZ
- MySQL 5.7.10 / db.r3.large / SingleAZ
- io1 / 100GB / 1000iops
- 設定はそれぞれ以下を変更
sync_binlog = 0innodb_flush_log_at_trx_commit = 2
- クライアント
- 4.1.17-22.30.amzn1.x86_64 / c4.2xlarge
- sysbench 0.4.12
- サーバとクライアントはすべて同じAZ
- 並列数を高くできるように以下の値を増やした
- max_connections
- max_prepared_stmt_count
- nofile
テストスクリプト
--oltp-table-size=100000000-
--num-threadsは1,000〜8,000
初期データの投入
# !/bin/bash
MYSQL_HOST=...
sysbench \
--test=oltp \
--db-driver=mysql \
--oltp-table-size=100000000 \
--mysql-host=$MYSQL_HOST \
--mysql-user=sbtest \
--mysql-password=sbtest \
--mysql-db=sbtest \
--mysql-table-engine=innodb \
prepare
ベンチマーク
# !/bin/bash
MYSQL_HOST=...
sysbench \
--test=oltp \
--db-driver=mysql \
--oltp-table-size=100000000 \
--num-threads=$N \
--mysql-host=$MYSQL_HOST \
--mysql-user=sbtest \
--mysql-password=sbtest \
--mysql-db=sbtest \
--mysql-table-engine=innodb \
--oltp-read-only=off \
--max-requests=0 \
--max-time=60 \
run
検証方法
- データのメモリへの載り具合でだいぶスループットが変わってくるので、Aurora・RDSともに
num-threads=100の状態でスループットが頭打つまでsysbenchを実行 - 1,000〜8,000まで500きざみで並列数を増やしていく
- 一つの並列数で5回試行し、中央値を取る
結果
2016/04/18 Aurora vs MySQL 5.7 sysbench
| 並列数 | Aurora (r3.large) | RDS MySQL 5.7 (r3.large) |
|---|---|---|
| 1000 | 9,132 | 8,900 |
| 1500 | 9,001 | 8,565 |
| 2000 | 8,849 | 8,069 |
| 2500 | 8,709 | 8,112 |
| 3000 | 8,490 | 8,134 |
| 3500 | 8,344 | 7,950 |
| 4000 | 8,160 | 6,192 |
| 4500 | 7,992 | 4,580 |
| 5000 | 7,603 | 3,408 |
| 5500 | 7,658 | 3,084 |
| 6000 | 7,480 | N/A |
| 6500 | 7,267 | N/A |
| 7000 | 7,091 | N/A |
| 7500 | 6,745 | N/A |
| 8000 | 6,481 | N/A |
所感
- Auroraが本領を発揮するのはクライアントが多い場合っぽい
-
oltp-read-only=onにするとまた結果が変わりそう - いままでPreparedStatementを使わないベンチマークをやっていたんですが、「並列性が高い」というAuroraの特性はどちらもあんまり変わらず
- 複数行取得するクエリが多かったんですが、一行だけ取得するクエリが多い場合でもまた結果変わりそう