我有一个侧边站的工人,排队约15 - 20个不同类型的工人的工作。当我转到New Relic的事务时,排队的每个工作线程在执行之前都要花费4-6秒。我的ActiveRecord池是25,Sidekiq20并发运行,有1个独角兽进程。
我在rails控制台中对这个worker进行了基准测试,代码的运行时间不到2秒(它做了一些繁重的处理)。有了这个奇怪的4-6秒的延迟,New Relic在6-8秒的执行中获得了这个worker的事务。
我用NewRelic::Agent::MethodTracer检查了slow worker的执行方法,分组的代码块试图更好地了解什么会这么慢,但New Relic仍然显示worker在到达任何分组块之前有4 -6秒的时间。
在perform方法中,所有带有跟踪器的分组代码块都在100ms以下。
我不确定是什么原因导致每个工作人员4到6秒的停顿--在运行sidekiq作业时,内存使用率通常在50 - 60%左右(1 gig时有2个数字海洋水滴),磁盘I/O和CPU始终不会达到60%以上。
我的应用程序运行在Rails 4.1.4、Ruby 2.0、Postgres、Unicorn、Nginx和Redis上
发布于 2014-07-15 12:12:06
您已经测试过单线程操作非常快,但是当一堆作业并行执行时,它真的很慢。当作业正在争夺对共享资源的独占访问时,这是典型的情况。
发布于 2014-07-15 19:19:39
您是否正在使用分析器测量执行时间?我们也在这里查看排队时间。这是这种差异最可能的解释。然而,为了真正准确地了解正在发生的事情,还需要更多的信息。
如果你想更深入地了解你的Sidekiq工作,我建议你安装Sidekiq插件,你可以在这里找到:http://newrelic.com/plugins/steven-eksteen/131
如果您有任何进一步的问题,请联系我们的support.newrelic.com,我们将准备好您的帐户信息,以帮助您。
https://stackoverflow.com/questions/24748969
复制相似问题