先に結論
pumaは worker * スレッド
の数だけコネクションを使う
しかし、ActiveRecordのコネクションプールの数はデフォルトで 5
なので大抵不足する
コネクションが不足すると、DBへの接続リクエストは待ち状態に
待ち状態のまま一定時間が経過すると、ActiveRecord::ConnectionTimeoutError
が発生
なので、ActiveRecordのコネクションプールを増やす必要がある
コネクションプールとは?
予め(今回の場合は)DBに接続しておいて、必要に応じてその接続を貸し与える仕組み
ActiveRecordのコネクションプールを増やす方法
config/database.yml
の connection_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サーバの性能に差をつけなければ心配はなさそう
参考
- Concurrency and Database Connections in Ruby with ActiveRecord | Heroku Dev Center
- だいたいこれ読めばOK。あとで翻訳したい…!
- PumaとUnicornで最近自分が理解したこと // Speaker Deck
- PumaでActiveRecordのErrorが出てハマった話 - 月曜日までに考えておきます
- Rails4.2のコネクションプールの実装を理解する - Akatsuki Hackers Lab | 株式会社アカツキ(Akatsuki Inc.)
- nginx+puma+rails の worker,thread,connection pool 数の目安 - Qiita