説明する機会があったので、ついでにメモしておこう的な
間違ってたら教えてください
最大接続数で詰み
DBには最大接続数というのがあります
コネクションを張れる最大の数ですね
たとえばAWSのAuroraだとこの辺に書いてあります
無闇にRailsをスケールアウトしても、結局このDBの最大接続数が限界になって詰んでしまう、ということがあります
それくらい考えてスケールしろよっていうツッコミは置いておいてください…
設定
Pumaの設定
puma.rb
の話です
WEB_CONCURRENCY
でworker数≒(子)プロセス数になります
ECSで使うインスタンスのリソースにあわせて設定するべきですが、今回はテストなので2にしてみましょうか
4でもいい気がするけど
RAILS_MAX_THREADS
でスレッド数の上限を設定できます
Pumaはマルチスレッドなので〜云々っていうけどJRubyとかではなく普通のRubyなのでこれをあんまり増やしても意味ないんですね
とはいえ恩恵を受けられる部分もないこともないので、8とかにしてみましょうか
コネクションプールの設定
今度は database.yml
の話です
実はデフォルトだとこれもスレッド数と同じ RAILS_MAX_THREADS
を見ているので、先ほど設定した 8になります
まあ意図的にこれをスレッド数とわける必要はないと思います
試算
では実際に試算してみましょう
たとえばECSのリソースは2CPUとかで、1インスタンス1タスクだったとして
1タスク=2Pumaワーカー
1Pumaワーカー=8スレッド=8コネクション
1タスク=1インスタンス=8コネクションx2Pumaワーカー=16コネクション
DBに対して、1タスク(1インスタンス)が最大で16コネクション張ることが想定できます
冒頭のリンクだと、Aurora MySQLの db.t2.medium
はデフォルト最大90コネクションなので、このECSクラスタ内でタスクをオートスケールさせるなら、5タスク(=最大80コネクション)までにしておくのがよさそう、というのがわかりました
以上
負荷が高くなってオートスケールの設定を入れようと思ったら、ちゃんとDB側の接続数も考えてスケールさせないといけませんね、という話でした