【问题标题】:Sidekiq Worker takes a really long time to execute after being queued (4 - 6 seconds)Sidekiq Worker 在排队后需要很长时间才能执行(4 - 6 秒)
【发布时间】:2014-07-15 19:19:38
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: ruby ruby-on-rails-4 sidekiq newrelic


    【解决方案1】:

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

    【讨论】:

    • 我只是将并发性从 20 降低到 5,实际上停顿的时间更少了。我的应用程序确实要求工作人员尽可能快地执行,因为它将数据发送回用户。您是否建议在并发计数较低的多台服务器上运行更多的 sidekiq 进程(例如,4 个 sidekiq 进程,每个进程有 5 个并发),而不是我当前的设置(1 个 sidekiq 进程,25 个并发)。我认为这样我可以降低进程执行的延迟,同时仍然有大约 20 个作业同时进行
    • 如果您不想追踪潜在的并发问题,听起来最好。
    【解决方案2】:

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

    如果您想更深入地了解您的 Sidekiq 工作,我建议您安装 Sidekiq 插件,您可以在这里找到:http://newrelic.com/plugins/steven-eksteen/131

    如果您有任何其他问题,请通过 support.newrelic.com 与我们联系,我们将在此准备好您的帐户信息,以便为您提供帮助。

    【讨论】:

    • 我安装了这个插件并正在监控数据,我现在没有得到任何东西(sidekiq 3.0.2),但会就此联系支持
    猜你喜欢
    • 2018-08-19
    • 2012-12-03
    • 2011-03-14
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多