我在RoR4 Heroku应用程序上配置Puma(多线程+多核服务器)需要一些帮助.Heroku上的文档并不是最新的.我遵循了这个:配置的并发和数据库连接,没有提到集群的配置,所以我不得不同时使用这两种类型(线程和多核).
我目前的配置:
./Procfile
web: bundle exec puma -p $PORT -C config/puma.rb
Run Code Online (Sandbox Code Playgroud)
./config/puma.rb
environment production
threads 0,16
workers 4
preload_app!
on_worker_boot do
ActiveRecord::Base.connection_pool.disconnect!
ActiveSupport.on_load(:active_record) do
config = Rails.application.config.database_configuration[Rails.env]
config['reaping_frequency'] = ENV['DB_REAP_FREQ'] || 10 # seconds
config['pool'] = ENV['DB_POOL'] || 5
ActiveRecord::Base.establish_connection
end
end
Run Code Online (Sandbox Code Playgroud)
问题:
a)我是否需要像Unicorn一样的before_fork/after_fork配置,因为群集工作者是分叉的?
b)如何根据我的应用程序调整我的线程数 - 将它放下的原因是什么?/在什么情况下它会有所作为?是不是已经优化了0:16?
c)Heroku数据库允许500个连接.根据线程,工作线程和动态计数,DB_POOL的值是多少? - 并行工作时,每个dyno的每个工作线程的每个线程是否都需要唯一的DB连接?
一般来说:我的配置应该如何看待并发性和性能?
我无法弄清楚Heroku上的并发性是如何工作的,以及如何:concurrency为Sidekiq 设置最佳值
这是设置 -
Puma Web Server
2 workers
5 threads
Heroku Dynos
8 web dynos
2 "worker" dynos (These will run Sidekiq, not to be confused with Puma Workers)
DB Connections
120 Max Connections Allowed by Postgres
5 Active Record Pool Size (default)
?? Sidekiq :concurrency value
Run Code Online (Sandbox Code Playgroud)
每个Puma工作者都可以使用默认的5个ActiveRecord DB连接(这对于每个有5个线程的连接很好).由于每个Web Dyno中有2个这样的Puma工作者,因此每个Web Dyno最多可以消耗10个连接.在所有8个Web dynos中,它们占用了80个连接
这将留下120 - 80 = 40个连接将被运行Sidekiq的2个dynos使用.假设每个dyno上都运行一个Sidekiq进程(这是真的吗?),每个Sidekiq进程最多可以使用20个连接(即设置:concurrency 20)
那个逻辑是正确的,还是我误解了这些过程如何在dynos上运行?
Sidekiq进程是否受到ActiveRecord连接池限制为5的任何限制?如果是,听起来像设置为20是没用的,因为它一次最多只能使用5个连接.
谢谢您的帮助!