在sidekiq工作者内存消耗

时间:2016-05-12 12:46:09

标签: ruby-on-rails ruby background-process sidekiq

  1. 在sidekiq worker中加载多个Models会导致内存泄漏吗?是垃圾收集了吗?
  2. 例如:

    class Worker
      include Sidekiq::Worker
    
      def perform
        Model.find_each do |item|
    
        end
      end
    end
    
    1. 在工作人员中使用ActiveRecord::Base.connection会导致问题吗?或者此连接会自动关闭?

1 个答案:

答案 0 :(得分:1)

我认为你遇到了一个问题,我也遇到了“工人” - 实际的问题是代码,而不是Sidekiq的任何方式,形状或形式。

在我有问题的代码中,我毫不思考地加载了一大堆模型,这些模型具有大而肥胖的贪婪查询(数十万个实例)。

我很简单地修复了我的工作人员/代码。对于我的实例,我将我的数据库调用从all转换为使用find_in_batches,并为该批次提取较少数量的对象。

Model.find_in_batches(100) do |record| 
# ... I like find_in_batches better than find_each because you can use lower numbers for the batch size
# ... other programming stuff 

一旦我这样做了,一段时间后会耗尽Sidekiq的工作(盒子上的内存耗尽)已经运行了find_in_batches 5个月没有我甚至不得不重新启动Sidekiq ......好吧,在我部署或完成维护的过去5个月里,我可能已经重新启动了Sidekiq,但不是因为工人!