Heroku 上的 Sidekiq 内存泄漏

Sidekiq memory leak on Heroku

我在 Heroku 上使用 Sidekiq 4.1.2 作为后台作业处理器(使用 Heroku Redis 3.2.0)。

问题是,Sidekiq 进程每分钟都在消耗更多的内存,而且永远不会宕机。有时只需要 10 分钟就可以从 300Mb 增长到 2Gb(然后就死掉了,太可怕了)。 当然,我第一个想到的是"Oh, looks like I've screwed up my background job's memory management!"。

我的后台作业的性质是它们需要很长时间才能完成,并且会创建很多对象,这些对象会保存到数据库中,不会再次使用。所以我添加了定期手动垃圾收集器调用:GC.start 在每处理 1000 个对象之后。

我在我的本地机器上测试了它并松了一口气:10 个线程的 Sidekiq 进程保持在 500Mb 以下。 然后我在 Heroku 上部署了这段代码,但是,唉,Sidekiq 对内存的永不满足的渴望仍然存在:内存消耗只会增加而不会减少,尽管垃圾收集器会定期手动启动。

因此,问题如下:相同的代码在我的机器上没有泄漏,但在 Heroku 上却泄漏了。什么可能导致这种行为?我应该怎么做才能确定它?

它是 :production 组中的 gem 之一。我用它来分析,看起来它做得很差。我用类似的 gem 替换了它,现在没有内存泄漏了。