ようへいの日々精進XP

よかろうもん

EC2 と RDS で MySQL ベンチマークを取ってみた

はじめに

  • EC2 上に MySQL 5.5 系のサーバーと MySQL Cluster のサーバーを構築して mysqlslapベンチマークを取ってみた
  • ついでに RDS でも同じようなベンチマークを取ってみた
  • 尚、MySQL Cluster は複数台構成ではなく一台構成(複数台構成は別途検証を行う)

参考


構成

以下のような構成でベンチマークを行った。

f:id:inokara:20140104093844p:plain

MySQLMySQL-Cluster に関しては EC2 インスタンス上に構築して同一ホスト上から mysqlslap を実行した。。RDS に関してはリモートホストの端末からmysqlslap を実行した。


準備

ベンチマークを取得する環境

ベンチマークを取得する環境は以下の通り。

MySQL バージョン インスタンスタイプ 備考
MySQL-Cluster-7.3 m1.medium MySQL 5.6.14-ndb-7.3.3-cluster-gpl
MySQL 5.5 m1.medium MySQL 5.5.34
RDS m1.medium MySQL 5.6.13 or MySQL 5.5.8 を選択

ベンチマークスクリプト(というほどでもないけど)

ベンチマークには mysqlslap を利用する。

/usr/bin/mysqlslap --no-defaults --concurrency=50 --iterations=1 --number-int-cols=2 --number-char-cols=3 \
--auto-generate-sql --engine=innodb --auto-generate-sql-add-autoincrement --auto-generate-sql-load-type=key --auto-generate-sql-write-number=1000 \
--number-of-queries=100000 --host=localhost --port=3306 --user=root --csv=/tmp/bench_result.csv

上記のようなスクリプトを利用する。主なパラメータは以下のような感じ。詳細はこちら

パラメータ 備考
iterations 3 テストの試行回数
concurrency 50 並列度(シミュレートするクライアントの数)
number-int-cols 2 使用する INT 型カラムの数
number-char-cols 3 使用する VARCHAR 型カラムの数
auto-generate-sql-write-number 1000 各スレッドで実行する行挿入の回数を指定
number-of-queries 10000 各クライアントのクエリー数

User Data を使って構築からベンチマークまで一発で

EC2インスタンスを起動する際に User Data を起動するインスタンスにパラメータとして渡すことが出来るのでそれを利用して AMI からの構築からベンチマークの取得まで一気に実行してしまう。以下のようなシェルスクリプトをそれぞれ書いてみた。

それぞれを保存して以下のようにして awscli を使って以下のようにインスタンスを起動する。(※スクリプト内で MySQLroot のパスワードを行っていないが、実際の運用ではちゃんとパスワードの設定をするように!)

id=`aws ec2 run-instances --image-id ami-xxxxxxx --count 1 --instance-type m1.medium --key-name ${key} --security-group-ids sg-xxxxxxx --subnet-id subnet-xxxxxxx --associate-public-ip-address --user-data file://path/to/script |jq '.Instances[]|.InstanceId' | sed 's/"//g'`
aws ec2 create-tags --resources $id --tags Key=Name,Value=${instance_name}

--user-data file://path/to/script で上記で作成したシェルスクリプトを渡している。また、インスタンスの名前を付けておきたいのでインスタンスID を取得後に create-tags でタグを設定している。

RDS の場合

RDS は手動でインスタンスを立ち上げる。awscli を使っても作成可能なので別の機会に試してみる。

MySQL 5.6.13 の設定。

f:id:inokara:20140103103036p:plain

MySQL 5.5.8 の設定。

f:id:inokara:20140103103043p:plain

上記のような設定。


ベンチマーク結果

以下のような結果となった。(3 回試行結果の平均値)

read

MySQL バージョン 結果(sec) 備考
MySQL-Cluster-7.3 292.00
MySQL 5.5 309.7 MySQL 5.5.34
RDS 計測なう MySQL 5.6.13
RDS 計測なう MySQL 5.5.8

key

MySQL バージョン 結果(sec) 備考
MySQL-Cluster-7.3 19.88
MySQL 5.5 17.94 MySQL 5.5.34
RDS 22.20 MySQL 5.6.13
RDS 21.82 MySQL 5.5.8

write

MySQL バージョン 結果(sec) 備考
MySQL-Cluster-7.3 35.06
MySQL 5.5 31.62 MySQL 5.5.34
RDS 48.17 MySQL 5.6.13
RDS 39.35 MySQL 5.5.8

あれれれのれ。EC2 上の MySQLMySQL-Cluster は特にチューニングも行っていないインストール仕立ての状態なので、ちゃんとチューニングされている(という認識でいる)RDS の方が良い結果が出るのではと予想していたが意外な結果となった。

おまけで奮発して RDSdb.m2.4xlarge を使ってベンチマークを取ってみた。

回数 read write
1 435.873 24.091
2 482.095 20.121
3 473.345 22.222
平均 463.77 22.14

ん、期待したほどでは無い...。


最後に

  • ベンチマークの結果は意外な結果となったけど User Data の使い方等知ることが出来て良かった
  • 引き続き、RDSMySQL-Cluster について調べていく
  • 個人で検証するには課金がドキドキ