本番運用しているRDSのパフォーマンスが最近悪くなっている。
スロークエリを確認すると、処理時間が非常に遅いときがある。(Procedure)
とあるProcedure処理が以前は15分くらいで完了していたのだが、遅い時には100分近くかかっている。。。
処理内容は変えていないのに。。。
CPU使用率を比較してみる
グラフの凡例
- 青線:正常
- 赤線:処理時間が遅い時
正常時は処理が終わるとCPU使用率は下がっていた。
しかし、処理時間が遅い時は負荷が上がっている時間が短く、CPU使用率も下がりきっていない。
処理時間が遅いのはCPUがサボっているかららしい(笑)
なぜ、違う動きをしているのか?
実際に処理した件数はどうなっているのか?
IOPSを比較してみる
書き込み(WriteIOPS)
正常時には次の処理が走っているが、それ以外に大きな差はなさそう。
読み込み(ReadIOPS)
Amazon EBS ボリュームとパフォーマンス
色々と調べたところこのページに行き着きました。
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/EBSVolumeTypes.html#EBSVolumeTypes_gp2
超ざっくりまとめると...
- ボリュームサイズによりベースラインパフォーマンスが決まる
- バーストすることで最大3,000 IOPSまで一時的に性能をあげられる
- バーストするにはクレジットバランスを消費する
- クレジットバランスは初期に配られる
- クレジットバランスはバーストしない間に補充される
- クレジットバランスを使い切った場合のパフォーマンスはベースラインにとどまる
自分の環境に当てはめる
私の環境はボリュームタイプが「汎用SSD」、ボリュームサイズが「100GiB」なので
ベースラインパフォーマンスは300 IOPSとなっています。
どうやらクレジットバランスを使い切ったため300 IOPSしか性能が出ていなかったようです。。。
ちなみに残クレジットバランスの確認方法はわかりませんでした。(あったら教えてください)
対応方法
対応方法として以下になると思います。
私は後者(処理間隔を空けること)で対応しています。
- ボリュームサイズを増やす。 ※後から減らせないので要注意!
- クレジットバランスが補充されるまで待つ
まとめ
INDEXやら色々調べてみてもわからず、この結論に行くまでに時間がかかりました。
普段、意識していない部分だと思うので何かのヒントになれば幸いです。