Sidekiq在工人完成后没有释放内存

Gua*_*Joe 30 ruby memory-leaks memory-management out-of-memory sidekiq

我有大约六个执行JSON爬行的Sidekiq工作者.根据端点的数据集大小,它们在1分钟到4小时之间完成.特别是,观看长达4小时的长时间,我看到随着时间的推移,内存会略有增加.

这不是问题,直到我想再次安排相同的工作人员工作.内存没有被释放并堆积起来,直到我遇到Linux OOM Killer,摆脱了我的Sidekiq进程.

内存泄漏?我在ObjectSpace中观察了不同对象的数量:

ObjectSpace.each_object.inject(Hash.new(0)) { |count, o| count[o.class] += 1 }
Run Code Online (Sandbox Code Playgroud)

那里没有真正的增加,哈希,数组等的集合保持不变,垃圾收集器一扫而空,并gc.stat[:count]告诉我,垃圾收集器也在工作.

即使在工作人员完成之后,例如我得到[完成]记录并且没有工人正忙,但内存不会被释放.这是什么原因?我可以对此做点什么吗?写一个终结者?

目前唯一的解决方案:重启Sidekiq进程.

我在Ruby 2.0.0上使用Ruby MRI.


对于JSON解析,我使用Yajl,因此是C绑定.我需要它,因为它似乎是唯一能够正确实现流式读写的快速JSON解析器.

dig*_*ist 11

撰写Sidekiq的Mike Perham在此发表了讲话:http://www.mikeperham.com/2009/05/25/memory-hungry-ruby-daemons/

tl; dr版本: MRI不会给内存回来,你可以做的最多就是控制堆,为此,建议使用Ruby Enterprise Edition.

不知道这有什么帮助,但就是这种情况 - 直接来自马的嘴巴.

  • 我知道,旧线程,但想知道你是否知道这仍然适用于Ruby 2.1和它的新GC? (9认同)
  • 同样,MRI也没有回忆.这是一个关键问题,我希望我早些时候知道它. (2认同)