質問: { 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_server`と`Sidekiq.configure_client`はそれぞれRedisへのデータPULLとPUSHをする。serverはPUSHも行う。 * concurrencyの値23はredisへの接続数の上限? * ここでSidekiqからDBへの接続はどのようになる?Dynoの数が上限? 以上がDBへの接続数に関する認識と質問です。 Redisへの接続数 ---------- ### Sidekiqからの接続数 先述の設定において、Redisへの接続の最大数はどのようになるのでしょうか。 * serverの設定の25とclientの設定の1の合計が接続の最大数? * concurrencyの23は上記の設定とどう関係しているのか? 設定値は以下のページでわからないなりに算出したものです。 ### SidekiqHerokuRedis calculatorにおける記述 先ほどのリンク()において、 `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の設定数が足りないとどのような状態になるのでしょうか? まとまりのない質問となってしまいましたが、 どうぞ宜しくお願いします。
回答: 色々と試した結果、なんとなく分かってきたような気がします。 ### DBコネクションについて WebDynoにおいて ワーカー×スレッド数が最大DB接続数である(web_max_connectionとする) (Pumaはスレッド数の合計分だけDB接続される) WorkerDynoにおいて Sidekiq自体のプロセス(1つ分)+sidekiq.ymlのconcurrency数が最大DB接続数である(worker_max_connection) database.ymlのpool数はweb_max_connectionかworker_max_connectionの大きい方を設定する。concurrencyを9とするとpoolの設定値は10となる。 connection poolはプロセスごとの設定?ここがわからない。 workerを5にしてもスレッド数が10の場合は、poolは10のままでよい? ### Redisコネクション http://manuelvanrijn.nl/sidekiq-heroku-redis-calc/を参考に、 RedisClientのsizeはPUSHする際のWebDynoのコネクション数? Redis側の最大接続数から設定可能な数字を算出しているが、concurrencyの数はDBコネクションの制限に合わせて設定するものである。 理解があっているかの自信がないので、しばらく他の方の回答を待ちたいと思います。