イフブロ

イフブロ

インフラエンジニアのブログ

AWS RDSのAuroraをパブリックから繋いだ時のパフォーマンス

CircleCIを使い始めました。 CircleCIでのCreateTableがローカルより遥かに遅いねという問題があり、 対策案として、AWSのRDSと繋いだら実は早いんじゃないか?というのを検討してみました。

結論から書くと、
RDSは同一リージョンのインスタンスと繋ぐと速いけどパブリックからのアクセスは遅かったです。
CircleCIからも遅いので、CircleCI Enterpriseにして、Auroraと繋ごうかと話をしています。

ここまで書いておいてですが、 CircleCIのインスタンスからRDSへのパフォーマンスを測りたかったのですが
役割分担等等あり、今回は以下3点での比較としました。

・ 自分の端末(日本) から 自分の端末上のMySQLDBへ
・ 自分の端末から Aurora(US-west2)へ
・ EC2(US-west2)から Aurora(US-west2)へ

以下は未検証です。
・ CircleCI(US-west1 or 2 or US-east) から Auroraへ 

自分の端末とEC2の端末は全くスペックが違うのですがAuroraが遅いのではなく、
NW周りが遅いんだろうという確証を取ろうとした作業です。
早くあたりを付けたかったので、精度はまったく良くないですが
結果として大きな開きが出たので、これでいいやと判断してます。

環境

  • 自分の端末
    VMWare上に立っているCpu 2コア / Mem 4GB
    (オーバーコミットで積んでいるのでもっと遅いと思います。)

  • EC2の端末
    c3.xlarge Cpu 4コア / Mem 7.5GB

  • AWS RDS
    Aurora db.r3.large 2コア / 15GB

検証方法

mysqlslapコマンドを使用しました。 パラメーターは軽め(誤差多め)の以下の値です。

mysqlslap \
  --no-defaults \
  --user=<username> \
  --password=<password>\
  --host=<hostname> \
  --port=<port> \
  --engine=innodb \
  --auto-generate-sql \
  --auto-generate-sql-load-type=mixed \
  --auto-generate-sql-add-autoincrement \
  --auto-generate-sql-write-number=1000 \
  --number-char-cols=3 \
  --number-int-cols=5 \
  --number-of-queries=10 \
  --concurrency=3 \
  --iterations=3

以下の様な結果となりました。

手法 Average Minimum Maximum
local to local 0.056 seconds 0.023 seconds 0.112 seconds
local to Aurora 9.922 seconds 5.934 seconds 13.024 seconds
EC2 to Aurora 0.016 seconds 0.009 seconds 0.031 seconds

スペックの低い、local to localの値も悪い値だとは思いますが、 local to Auroraは200倍程度悪い結果となりました。

NWコストがすごいね。っていうのがよくわかります。

CircleCIを設定している人からも、local to localと比べると10倍は違うと言っていましたので、 US to US間でもそこそこNWコストがかかるんだと思います。

同一リージョン/AZで測るときっちり性能が出ているので、 「RDSは同一リージョンのインスタンスと繋ぐと速いけどパブリックからのアクセスは遅かったです。 」という結論で概ね間違ってないかな。と至りました。

  • mysqlslapはclient側は全然負荷がないので、client側の性能差によるパフォーマンス差は(今回においては)殆どないと思います。
  • AWS Aurora側のパフォーマンスモニター上でも余裕しゃくしゃくでしたので、今回は純粋にNWコストと判断しています。