LoginSignup
4
5

More than 3 years have passed since last update.

ECS+Rails(Puma)がDBの最大接続数で詰んだときの計算

Posted at

説明する機会があったので、ついでにメモしておこう的な
間違ってたら教えてください :bow_tone1:

最大接続数で詰み

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側の接続数も考えてスケールさせないといけませんね、という話でした

4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5