我在Heroku上使用Sidekiq 4.1.2作为后台作业处理器(使用Heroku Redis 3.2.0)。
问题是,Sidekiq进程每分钟消耗更多内存,永不停机。有时只需要10分钟就可以从300Mb增长到2Gb(然后它会死掉,可怕)。 当然,我的第一个想法是“哦,看起来我已经搞砸了我的后台工作的内存管理!”。
我的后台作业的本质是它们需要很长时间才能完成,并且它们会创建大量对象,这些对象会保存到DB而不会再次使用。所以我在每1000个对象处理后添加了定期的手动垃圾收集器调用:GC.start
。
我在我的本地机器上测试了它并且松了一口气:带有10个线程的Sidekiq进程保持在500Mb以下。 然后我在Heroku上部署了这个代码,但是,唉,Sidekiq对内存的永不满足的渴望仍然存在:尽管定期手动启动垃圾收集器,但内存消耗只会增加而且永不减少。
因此,问题如下:同样的代码不会在我的机器上泄漏,但在Heroku上会泄漏。什么可能导致这种行为?我该怎么做才能确定它?
答案 0 :(得分:1)
这是:production
组中的宝石之一。我正在使用它进行性能分析,看起来它做得不好。我用类似的宝石替换它,现在没有内存泄漏。