2016-05-27 31 views
0

我在Heroku上使用Sidekiq 4.1.2作爲後臺作業處理器(使用Heroku Redis 3.2.0)。Heroku上的Sidekiq內存泄露

問題是,Sidekiq進程每分鐘都會消耗更多的內存並永不停止。有時從300Mb增長到2Gb只需要10分鐘(然後它會死亡,非常可怕)。 當然,我的第一個想法是「哦,看起來我搞砸了我的後臺作業的內存管理!」。

我的後臺作業的本質是,他們需要很長時間才能完成,他們創建了很多對象,這些對象被保存到數據庫並且不再使用。所以我已經添加了定期的手動垃圾收集器調用:每處理1000個對象之後都會有GC.start

我在本地機器上測試過它,並放心:帶有10個線程的Sidekiq進程停留在500Mb以下。 然後我在Heroku上部署了這個代碼,但是,唉,Sidekiq對內存的貪得無厭仍然存在:儘管定期手動啓動垃圾收集器,但內存消耗只會增加而不會減少。

因此,問題如下:相同的代碼不會在我的機器上泄漏,但在Heroku上泄漏。什麼可能導致這種行爲?我該怎麼做才能查明它?

+0

你確定代碼是線程安全的嗎?可以值得看一下https://github.com/mperham/sidekiq/wiki/Problems-and-Troubleshooting – DMH

+0

你在Heroku上運行Ruby 2.1嗎? –

+0

前幾天我遇到了類似的問題,這讓我認爲它是sidekiq,但它最終導致我的資產加載,導致大量泄漏。我會說如果它在你的本地工作,那麼你的生產配置中有一些東西。這在某種程度上導致了這個問題。對我而言,資產得到了預編譯,因此訂單發生了變化。對你而言,這將是另一回事,但從這種思維模式中接近它可能會對你有所幫助。 – bkunzi01

回答

1

這是:production組中的寶石之一。我使用它來進行分析,看起來它做得不好。我用相似的寶石取代了它,現在沒有內存泄漏。