【发布时间】:2015-02-15 00:18:31
【问题描述】:
我有一个 Rails 系统,其中每半小时完成一次:
- 网络上其他地方有 15 个客户端
- 服务器为每个客户端创建一个名为
Measurement的记录 - 测量记录被配置,然后通过Sidekiq异步运行,使用
MeasurementWorker.perform_async(m.id) - 与客户端的连接是通过赛璐珞演员和 WebSocket 客户端完成的
- 每次测量在运行时都会创建一些存储在数据库中的事件记录
系统在 5 个客户端上运行良好,但现在我 15 岁,当我同时启动它们时,许多测量不再运行,出现以下错误:
2015-02-04T07:30:10.410Z 35519 TID-owd4683iw MeasurementWorker JID-15f6b396ae9e3e3cb2ee3f66 INFO: fail: 5.001 sec
2015-02-04T07:30:10.412Z 35519 TID-owd4683iw WARN: {"retry"=>false, "queue"=>"default", "backtrace"=>true, "class"=>"MeasurementWorker", "ar
gs"=>[6504], "jid"=>"15f6b396ae9e3e3cb2ee3f66", "enqueued_at"=>1423035005.4078047}
2015-02-04T07:30:10.412Z 35519 TID-owd4683iw WARN: could not obtain a database connection within 5.000 seconds (waited 5.000 seconds)
2015-02-04T07:30:10.412Z 35519 TID-owd4683iw WARN: /home/webtv/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/activerecord-4.1.4/lib/active_
record/connection_adapters/abstract/connection_pool.rb:190:in `block in wait_poll'
....
现在,我的生产环境是这样的:
config/sidekiq.yml
production:
:verbose: false
:logfile: ./log/sidekiq.log
:poll_interval: 5
:concurrency: 50
config/unicorn.rb
...
worker_processes Integer(ENV["WEB_CONCURRENCY"] || 3)
timeout 60
...
config/database.yml
production:
adapter: postgresql
database: ***
username: ***
password: ***
host: 127.0.0.1
pool: 50
postgresql.conf
max_connections = 100 # default
如您所见,我已将 Sidekiq 的并发数增加到 50,以满足大量可能的并发测量。我已将数据库池设置为 50,这对我来说已经有点过分了。
我应该补充一点,服务器本身非常强大,配备 8 GB RAM 和四核 Xeon E5-2403 1.8 GHz。
理想情况下这些值应该设置为多少?我可以使用什么公式来计算它们? (例如最大数据库连接数 = Unicorn workers × Sidekiq 并发数 × N)
【问题讨论】:
标签: ruby-on-rails postgresql sidekiq