【问题标题】:Memory consumpton inside sidekiq workersidekiq worker 内部的内存消耗
【发布时间】:2016-09-08 07:29:51
【问题描述】:
  1. 在sidekiq worker中加载多个Models会导致内存泄漏吗?它会被垃圾回收吗?

例如:

class Worker
  include Sidekiq::Worker

  def perform
    Model.find_each do |item|

    end
  end
end
  1. 在工作人员内部使用ActiveRecord::Base.connection 会导致问题吗?还是此连接自动关闭?

【问题讨论】:

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


【解决方案1】:

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

在我有问题的代码中,我漫不经心地加载了一大堆模型,其中包含一个大而肥的贪婪查询(数十万个实例)。

我很简单地修复了我的工人/代码。对于我的实例,我将我的 DB 调用从 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 :),但不是因为工人!

【讨论】:

  • OP 已经使用find_eachfind_in_batches(1000) { |batch| batch.each ... 基本相同
  • 对不起,是的。我将编辑我的帖子...我更喜欢 find_in_batches,因为您可以控制批量大小(相对于 find_each,它获取默认值 1000)。
猜你喜欢
  • 1970-01-01
  • 2016-05-02
  • 2014-12-21
  • 2010-10-12
  • 1970-01-01
  • 2011-10-03
  • 2012-11-24
  • 2013-10-08
  • 1970-01-01
相关资源
最近更新 更多