タイトルの環境で、以下のエラーが発生したのですが、DB接続数の上限とPumaやSidekiqなどの設定値との関係をしっかり理解したいと思いまして質問しました。その他各機能の動作についても質問させていただきたいと思います。

An ActiveRecord::ConnectionTimeoutError
could not obtain a database connection within 5.000 seconds (waited 5.000 seconds)

メインは「PostgreSQL」DBへの接続数についてですが、Redisへの接続数についても合わせて整理させてください。

DB接続数

PumaのDB接続数

workers Integer(ENV['WEB_CONCURRENCY'] || 1)
threads_count = Integer(ENV['MAX_THREADS'] || 5)
threads threads_count, threads_count

Pumaを上記の設定ファイルで起動しています。環境変数は登録なしとして、workerが1、threadが5という場合においての接続数はどうなるのでしょうか。HerokuでのPumaが動くDynoは1つです。またPostgreSQLのDB接続最大可能数は20です。

  • database.ymlのpool設定を5とすると、1workerの1threadごとに、DB接続は最大でpoolの設定数の5となる?
  • Pumaのthreadはどのタイミングで増えるのか
  • workerが2になると1DynoにつきDB接続の最大値は10となる?

SidekiqのDB接続数

config/initializers/sidekiq.rb

Sidekiq.configure_server do |config|
  config.redis = { size: 25 }

    ・・・・・
end

Sidekiq.configure_client do |config|
  config.redis = { size: 1 }

    ・・・・・
end

config/sidekiq.yml

:verbose: false
:concurrency: 5
:pidfile: tmp/pids/sidekiq.pid
production:
  :concurrency: 23
:queues:
  - [default, 1]

上記がSidekiqの設定です。Sidekiqが動作するworkerのDynoは1つとします。

  • Sidekiq.configure_serverSidekiq.configure_clientはそれぞれRedisへのデータPULLとPUSHをする。serverはPUSHも行う。
  • concurrencyの値23はredisへの接続数の上限?
  • ここでSidekiqからDBへの接続はどのようになる?Dynoの数が上限?

以上がDBへの接続数に関する認識と質問です。

Redisへの接続数

Sidekiqからの接続数

先述の設定において、Redisへの接続の最大数はどのようになるのでしょうか。

  • serverの設定の25とclientの設定の1の合計が接続の最大数?
  • concurrencyの23は上記の設定とどう関係しているのか?

設定値は以下のページでわからないなりに算出したものです。

http://manuelvanrijn.nl/sidekiq-heroku-redis-calc/

SidekiqHerokuRedis calculatorにおける記述

先ほどのリンク(http://manuelvanrijn.nl/sidekiq-heroku-redis-calc/)において、

Note: You might also need to increase the pool size of your AR database.
See: Advanced Options - Concurrency
とあり、その先にYou can tune the amount of concurrency in your sidekiq process. By default, one sidekiq process creates 25 threadsとありますが、

Sidekiqのスレッドがデフォルト25というのがconcurrencyの設定ということでしょうか?ここで、DBの接続設定のpoolが出てくる関係性がわかりません。

database.ymlのpoolは最大thread数に合わせる?
その場合、pumaとsidekiqで多い方の数にあわせるのでしょうか?(ここの例ではpuma5, sidekiq23)

また、本題の接続エラーはPostgreSQLの最大接続数20を超えた時に出るとして、poolの設定数が足りないとどのような状態になるのでしょうか?

まとまりのない質問となってしまいましたが、
どうぞ宜しくお願いします。