我有一个Rails系统,每隔半小时,完成以下操作:
Measurement
的记录MeasurementWorker.perform_async(m.id)
系统运行良好,有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。
理想情况下,这些值应该设置为什么?我可以使用什么公式来计算它们? (例如最大数据库连接数=独角兽工人×Sidekiq并发数×N )
答案 0 :(得分:3)
在我看来,你的游泳池配置100没有生效。每个进程最多需要50个,所以将100改为50.我不知道你是否使用Heroku,但是配置池大小是非常困难的。
在mysql内部,您的最大连接数应如下所示:
((Unicorn processes) * 1) + ((sidekiq processes) * 50)
Unicorn是单线程的,除非您出于某种原因在Rails应用程序中启动自己的线程,否则永远不需要多个连接。
答案 1 :(得分:1)
我确信sidekiq @MikePerham的创建者不仅适合修复你的sidekiq问题,而且作为一个ruby开发人员,两件事情都很突出。
如果您通过ruby进行大量数据库操作,可以将其中一些数据库作为triggers推送到数据库中吗?你当然还可以通过sidekiq进程在appside上启动它们。 :)
第二个半小时对我说通过cron运行的rake任务。希望你也这样做。 FWIW我通常使用Whenever gem来创建我必须放入运行应用程序的用户的crontab中的cron行。请注意,它设计用于在脚本化部署中自动创建crontask,但在非脚本化部署中,您仍然可以利用它来为您提供必须通过whenever命令粘贴到crontab中的行。
你还提到这是用于测量。
您是否考虑过利用elasticsearch和searchkick gem之类的内容?这是一个复杂的设置,请务必防火墙上安装ES的服务器。但是,随着您的成长,这可能会使您的代码更易于管理。它还为您提供了一个几乎免费的分析和更多语言不可知的良好搜索机制,例如: Bloodhound,Java。 :) Plus kibana为您提供了一个很好的ES记录窗口