该 sidekiq文档说你应该增加你的AR池大小 到25个左右的连接。
production:
adapter: mysql2
database: foo_production
pool: 25
如果你使用的是Heroku。不能用 application.yml
. 相反,你需要使用 unicorn.rb
配置文件(如果你使用的是独角兽)。
after_fork do |server, worker|
if defined?(ActiveRecord::Base)
config = ActiveRecord::Base.configurations[Rails.env] ||
Rails.application.config.database_configuration[Rails.env]
config['reaping_frequency'] = ENV['DB_REAP_FREQ'] || 10 # seconds
config['pool'] = ENV['DB_POOL'] || 25
ActiveRecord::Base.establish_connection(config)
end
end
但每个测功机都有三个进程 我有一个web Dyno和一个worker Dyno。这是否意味着最大的池子大小是150?
后来,指南上说 我们应该包含一个初始化文件. 但它几乎与在 "我 "中的代码完全相同。unicorn.rb
文件。除了独角兽文件,我们还需要这个文件吗?
config = ActiveRecord::Base.configurations[Rails.env] ||
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(config)
我也有类似的问题,也找不到明确的答案!
像很多其他计算问题一样,我认为没有一个明确的答案,每个情况都不一样,取决于很多因素,比如Heroku配置、Rails配置、应用的配置文件、使用的Rails Web服务器等。
最好的选择可能是像克隆一样旋转生产或 叉叉 并尝试不同的配置与一致的负载,收集数据,然后做出明智的决定。
我相信,例如,如果你有3个Unicorn进程,那么你可能需要3个DB_POOL--尽管ActiveRecord会在需要的时候缓慢地启动这些连接。
我已经使用了以下配置 config/initializers/sidekiq.rb
来获取配置Sidekiq的数据库网址,类似这样。
Sidekiq.configure_server do |config|
# ...
database_url = ENV['DATABASE_URL']
if database_url
pool_size = Sidekiq.options[:concurrency] # one example of what this could be...
ENV['DATABASE_URL'] = "#{database_url}?pool=#{pool_size}" # only affects this process
ActiveRecord::Base.establish_connection
end
end
Sidekiq数据库池的大小和Web数据库池的大小应该是不一样的,也可能不一样。
require 'sidekiq'
Sidekiq.configure_server do |config|
ActiveRecord::Base.configurations['production']['pool'] = ENV["SIDEKIQ_DB_POOL_SIZE"] || 8
end
如果我们把Sidekiq的并发量设置为8,那么数据库池大小也必须设置为8。这样数据库才能同时为来自Sidekiq的8个线程服务。
这与Web服务器不同。假设我们使用的是Puma服务器,1个worker运行10个线程,数据库必须根据database.yml中的池配置为来自Puma服务器的10个线程提供服务。
因此,在我们的例子中,当服务于Sidekiq时,DB池将是8个,而当服务于应用服务器(在本例中是Puma)时,将是10个。