Ruby Sidekiq Worker在排队后需要很长时间执行(4-6秒)

Ruby Sidekiq Worker在排队后需要很长时间执行(4-6秒),ruby,ruby-on-rails-4,sidekiq,newrelic,Ruby,Ruby On Rails 4,Sidekiq,Newrelic,我有一个sidekiq的工人,他排着大约15-20个不同类型工人的工作。当我转到NewRelic的事务时,排队的每个工作人员都需要4-6秒才能执行。我的ActiveRecord池是25,Sidekiq是以20并发运行的,有一个Unicorn进程 我在rails控制台中对这个worker进行了基准测试,代码不到2秒(它进行了一些繁重的处理)。通过这种奇怪的4-6秒延迟,NewRelic在6-8秒执行时接收到了这个工作者的事务 我用NewRelic::Agent::MethodTracer检查了慢速

我有一个sidekiq的工人,他排着大约15-20个不同类型工人的工作。当我转到NewRelic的事务时,排队的每个工作人员都需要4-6秒才能执行。我的ActiveRecord池是25,Sidekiq是以20并发运行的,有一个Unicorn进程

我在rails控制台中对这个worker进行了基准测试,代码不到2秒(它进行了一些繁重的处理)。通过这种奇怪的4-6秒延迟,NewRelic在6-8秒执行时接收到了这个工作者的事务

我用NewRelic::Agent::MethodTracer检查了慢速工作程序的perform方法,分组的代码块试图更好地了解什么可能会如此缓慢,但NewRelic仍然在到达任何分组的块之前4-6秒向工作程序显示

执行方法中带有跟踪器的所有分组代码块均小于100 ms

我不确定是什么原因导致每个工作人员暂停4到6秒——在运行sidekiq作业时,内存的使用率通常在50-60%左右(2个数字海洋液滴,1 gig),磁盘I/O,CPU在整个时间内不会超过60%


我的应用程序运行在Rails 4.1.4、Ruby 2.0、Postgres、Unicorn、Nginx和Redis上,你已经测试过单线程操作的速度非常快,但是当一组作业并行执行时,速度非常慢。当作业为独占访问共享资源而斗争时,这是典型的情况。

您已经测试过单线程操作非常快,但是当一组作业并行执行时,它非常慢。当作业争夺对共享资源的独占访问时,这是典型的情况。

您是否正在使用探查器测量执行时间?我们也在看这里的排队时间。这是对这种差异最可能的解释。然而,要真正准确地了解正在发生的事情,需要更多的信息

如果你想更深入地了解你的Sidekiq工作,我建议你安装Sidekiq插件,你可以在这里找到:


如果您有任何进一步的问题,请访问support.newrelic.com与我们联系,我们将随时准备好您的帐户信息,以帮助您。

您是否正在使用探查器测量执行时间?我们也在看这里的排队时间。这是对这种差异最可能的解释。然而,要真正准确地了解正在发生的事情,需要更多的信息

如果你想更深入地了解你的Sidekiq工作,我建议你安装Sidekiq插件,你可以在这里找到:


如果您有任何进一步的问题,请访问support.newrelic.com与我们联系,我们将随时准备好您的帐户信息以帮助您。

我安装了此插件并正在监控数据,我现在没有任何信息(sidekiq 3.0.2)但是,我会联系支持部门。我安装了这个插件,正在监控数据,我现在没有收到任何信息(sidekiq 3.0.2),但是我会联系支持部门。我只是将并发度从20降低到了5,实际上暂停的时间更少了。我的应用程序确实需要工作人员尽可能快地执行,因为它会将数据发送回用户。您是否建议在多台服务器上以较低的并发数运行更多的sidekiq进程(例如,4个sidekiq进程,每个进程有5个并发),而不是我当前的设置(1个sidekiq进程,25个并发)。我认为这样可以减少进程执行的延迟,同时仍然有大约20个作业在ConcurrentSounds上工作。如果您不想跟踪潜在的并发性问题,那么这样的声音最好。我只是将并发性从20降低到了5,实际上暂停的时间更少。我的应用程序确实需要工作人员尽可能快地执行,因为它会将数据发送回用户。您是否建议在多台服务器上以较低的并发数运行更多的sidekiq进程(例如,4个sidekiq进程,每个进程有5个并发),而不是我当前的设置(1个sidekiq进程,25个并发)。我认为这样可以降低进程执行的延迟,同时仍然有大约20个作业在ConcurrentSounds上工作。如果您不想跟踪潜在的并发性问题,那么这样做是最好的。