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

时间:2013-09-24 09:58:12

标签: ruby memory-management memory-leaks out-of-memory sidekiq

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

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

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

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

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

即使工人完成,例如我记录了 [完成] 并且没有工作人员正忙,内存未被释放。这是什么原因?我可以对此做点什么吗?写一个终结者?

唯一当前解决方案:重新启动Sidekiq流程。

我使用Ruby 2.0.0并使用Ruby MRI。


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

1 个答案:

答案 0 :(得分:10)

撰写Sidekiq的人写道:[{3}}

tl; dr版本: MRI不会返回内存,你可以做的最多就是控制堆,为此,建议http://www.mikeperham.com/2009/05/25/memory-hungry-ruby-daemons/

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