Sidekiq 在工作人员完成后不会解除分配内存



我有大约六个执行JSON爬网Sidekiq工作线程。根据端点的数据集大小,它们在 1 分钟到 4 小时之间完成。特别是,观看需要 4 小时的长篇,随着时间的推移,我看到记忆力略有增加。

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

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

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

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

即使在工作线程完成之后,例如,我记录了 [Done] 并且没有工作线程再忙,内存也不会解除分配。这是什么原因呢?我能对此做些什么吗?写一个终结器?

目前唯一的解决方案:重新启动Sidekiq进程。

我使用的是Ruby 2.0.0并使用Ruby MRI。


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

编写Sidekiq的Mike Perham在这里解决了这个问题: http://www.mikeperham.com/2009/05/25/memory-hungry-ruby-daemons/

dr 版本:MRI 不会把内存还回去,你最多能做的就是控制堆,为此,建议使用 Ruby 企业版。

不知道这些是否有任何帮助,但情况就是这样——直接从马的嘴里说出来。

最新更新