📚
RailwayのHobbyプランでスロークエリが発生した原因と対処法
アプリは動くのに、DBだけやたら遅い…?
GW中まとまった休みがあったので、せっかくなら個人開発してみようと思い立ち作ってみたはいいものの、DB周りの処理だけ異常に遅いことに気づきました。
コードやクエリを疑ってみた
まずはアプリケーションコードに原因があると思い、Laravel の DB::listen() を AppServiceProvider に仕込んで、実行クエリの所要時間をログ出力するようにしました。
確認してみると、POST時のクエリが 1秒〜3秒 と明らかに遅い。
クエリ自体はシンプルで、インデックスも貼ってあり、重い処理はしていません。
本当の原因は「物理的な距離」だった
クエリにもコードにも問題が見当たらず、手がかりを探してネットを漁っていたところ、こんな記事を見つけました:
you're on the Hobby plan meaning your database is located in US-West1.
どうやら、RailwayのHobbyプランではデータベースがUS-WESTに強制配置されるようです。
一方、私はアプリケーションサーバをアジア圏のRegionに設定していたため、アプリとDBの物理距離が遠すぎて遅延が発生していたというわけです。
アプリのRegionをUS-WESTに合わせたら即解決
アプリ側のRegionを同じく US-WEST にして再デプロイしてみたところ…
何ということでしょう。
クエリ実行時間が以前の約10分の1にまで改善されました。
まとめと学び
- アプリが重い=コードが悪いと考えがちだが、インフラの設計ミスが原因のこともある
- アプリとDBのRegionは必ず合わせるべし(そうしないと通信距離の分だけ遅くなる)
Discussion