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

ora*_*ges 1 ruby newrelic sidekiq ruby-on-rails-4

我有一个 sidekiq 工人排队大约 15 - 20 个不同类型工人的工作。当我转到 New Relic 的事务时,排队的每个工作人员甚至在执行之前需要 4-6 秒。我的 ActiveRecord 池为 25,Sidekiq 以 20 并发运行,有 1 个 Unicorn 进程。

我在 rails 控制台中对这个 worker 进行了基准测试,代码不到 2 秒(它做了一些繁重的处理)。有了这个奇怪的 4-6 秒延迟,New Relic 会在 6 到 8 秒执行时获取该工人的交易。

我使用 NewRelic::Agent::MethodTracer 完成了慢速工作器的执行方法,分组代码块试图更好地了解可能如此慢的原因,但 New Relic 仍然在它之前 4 -6 秒显示工作器到达任何分组块。

perform 方法中所有带有跟踪器的分组代码块每个都在 100 毫秒以下。

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

我的应用程序在 Rails 4.1.4、Ruby 2.0、Postgres、Unicorn、Nginx 和 Redis 上运行

Mik*_*ham 5

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