kasei_sanのブログ

かせいさんのIT系のおぼえがきです。胡乱の方はnoteとtwitterへ

nginx+pumaでRailsで動かす場合コネクションプールの数を増やさないと `ConnectionTimeoutError` が発生するよ

先に結論

pumaは worker * スレッド の数だけコネクションを使う

しかし、ActiveRecordのコネクションプールの数はデフォルトで 5

なので大抵不足する

コネクションが不足すると、DBへの接続リクエストは待ち状態に

待ち状態のまま一定時間が経過すると、ActiveRecord::ConnectionTimeoutError が発生

なので、ActiveRecordのコネクションプールを増やす必要がある

コネクションプールとは?

予め(今回の場合は)DBに接続しておいて、必要に応じてその接続を貸し与える仕組み

ActiveRecordのコネクションプールを増やす方法

config/database.ymlconnection_pool で設定

production:
  <<: *default
  database: <%= ENV['DB_NAME'] %>
  username: <%= ENV['USERNAME'] %>
  password: <%= ENV['PASSWORD'] %>
  host: <%= ENV['HOSTNAME'] %>
  port: <%= ENV['PORT'] %>%
  connection_pool: <%= ENV['MAX_CONNECTION_POOL'] || 5 %>

コネクションプールの数は、いくつが良いの?

puma の thread 数と同数とする。 database.yml に設定された pool の数はプロセスごとに確保される値なので、thread数を設定すれば十分。

ただし、 同時接続数が、DBの最大コネクション数を超えないこと

ElasticBeanstalkの場合

pumaのスレッド数は32

posgreSQLの最大コネクション数っていくつ?

RDSの(posgreSQL)の場合

DBInstanceClassMemory / 12582880 らしい

  • m1.smallで145とか
  • ElasticBeanstalkの場合、
    • pumaのworker数はコア数と同一なので、よっぽどアプリサーバとDBサーバの性能に差をつけなければ心配はなさそう

参考