27461


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

[code]

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

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

## DB接続数

### PumaのDB接続数

[code]

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

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`

[code]

    Sidekiq.configure_server do |config|
      config.redis = { size: 25 }
    
        ・・・・・
    end
    
    Sidekiq.configure_client do |config|
      config.redis = { size: 1 }
    
        ・・・・・
    end
    
[/code]

`config/sidekiq.yml`

[code]

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

上記が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は上記の設定とどう関係しているのか？

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

<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の設定数が足りないとどのような状態になるのでしょうか？

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


CC BY-SA 3.0
2016-07-07T09:50:18.960
27419
2016-11-22T06:34:20.893
512
question
ruby-on-rails heroku sidekiq
DB接続の計算について Rails×Puma×Sidekiq×Redis×Heroku×PostgreSQL


色々と試した結果、なんとなく分かってきたような気がします。

### 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/を参考に](http://manuelvanrijn.nl/sidekiq-heroku-redis-
calc/%E3%82%92%E5%8F%82%E8%80%83%E3%81%AB)、  
RedisClientのsizeはPUSHする際のWebDynoのコネクション数？

Redis側の最大接続数から設定可能な数字を算出しているが、concurrencyの数はDBコネクションの制限に合わせて設定するものである。

理解があっているかの自信がないので、しばらく他の方の回答を待ちたいと思います。


CC BY-SA 3.0
2016-07-08T14:53:26.053
27461
2016-07-08T14:53:26.053
512
27419
answer