工作人员完成后,Sidekiq不会释放内存 [英] Sidekiq not deallocating memory after workers have finished

查看:226
本文介绍了工作人员完成后,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]告诉我,垃圾收集器也在工作. /p>

即使在工作人员完成后,例如我记录了 [完成] ,不再有工作人员忙,内存也没有释放.是什么原因呢?我可以为此做些什么吗?写一个终结器?

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

我正在使用Ruby 2.0.0,并使用Ruby MRI.


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

撰写Sidekiq的

解决方案

迈克·佩勒姆在这里解决了此问题:Yajl, thus a C binding. I need it because it seems the only fast JSON parser that properly implements streamed reading and writing.

解决方案

Mike Perham who wrote Sidekiq addressed this here: http://www.mikeperham.com/2009/05/25/memory-hungry-ruby-daemons/

tl;dr version: MRI will not give the memory back, the most you can do is control the heap, and to do that, Ruby Enterprise Edition was suggested.

Don't know that any of this helps, but that is the situation - straight from the horse's mouth.

这篇关于工作人员完成后,Sidekiq不会释放内存的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆