AuroraとRDS MySQL 5.7のsysbench


この記事を見て、結果に疑問を持ったので、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 = 0
      • innodb_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の特性はどちらもあんまり変わらず
  • 複数行取得するクエリが多かったんですが、一行だけ取得するクエリが多い場合でもまた結果変わりそう