sidekiq docs say you should increase your AR pool size到大约25个连接。
production:
adapter: mysql2
database: foo_production
pool: 25
如果您使用的是Heroku,you can't use 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
但每个Dyno运行3个进程。我有一个网络Dyno和一个工人Dyno。这是否意味着最大池大小将为150? 2 * 3 * 25?
后来,指南说we should include an initializer file。但它几乎与unicorn.rb
文件中的代码完全相同。除了unicorn文件之外,我们还需要这个吗?
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)
答案 0 :(得分:0)
我有类似的问题和问题找到明确的答案!
像许多其他计算问题一样,我认为没有确定的答案,每种情况都不同,并且依赖于许多因素,例如Heroku配置,Rails配置,应用程序配置文件,使用的Rails Web服务器等。
最好的选择可能是启动克隆或fork the Heroku app之类的制作,尝试使用一致负载的不同配置,收集数据然后做出明智的决定。
我相信,例如,如果你有3x Unicorn进程,那么你可能需要3x 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
答案 1 :(得分:0)
Sidekiq数据库池大小和Web数据库池大小应该不相同,也可以不相同。
template <typename T>
void fun(T&& x);
int i;
fun(i); // deduce<int&>(int& &&) -> deduce<int&>(int&)
fun(5); // deduce<int>(int&&)
如果将Sidekiq并发设置为8,则数据库池大小也必须设置为8。这样数据库就可以同时服务于Sidekiq的8个线程。
这与Web服务器不同。假设我们使用的Puma服务器有1个运行10个线程的工作程序,则数据库必须根据database.yml中的池配置为来自Puma服务器的10个线程提供服务。
因此,在我们的示例中,为Sidekiq服务时,数据库池将为8,而为应用程序服务器(在本例中为Puma)时,数据库池将为10。