2014-04-30 35 views
3

我在Heroku上有一個Rails 3.2 Ruby 1.9應用程序,它工作正常。我升級到2.1的Ruby和Rails 4.1,並很快開始越來越內存錯誤:如何升級Ruby和Rails後診斷內存泄漏?

錯誤R14(內存超出配額)

我設置的Heroku的選項,以顯示內存使用情況。這表明越來越多的應用隨着時間的推移,但目前還不清楚爲什麼:

源= web.1賽道= heroku.12 ...樣品#memory_total = 514.44MB樣品#memory_rss = 449.46MB樣品#memory_cache = 0.52MB樣品#memory_swap = 64.46MB樣品#memory_pgpgin = 142709pages樣品#memory_pgpgout = 27516pages

我看着對象空間看哪些類具有最實例和得到了以下結果頂部:

[模塊,1232],[MIME :: Type,1643],[Regexp,2334],[Hash,3002],[Class,3004],[Pr α,3363],[RubyVM ::的Env,3416],[陣列,25436],[RubyVM :: InstructionSequence,26490],[字符串,127601]

似乎有是一個非常大的數量的字符串,但我不確定通常會有多少人。我運行了ObjectSpace.garbage_collect,它將字符串減少了47485個實例,並影響了許多其他類的實例計數,例如:T_ARRAY(-16308)和:T_NODE(-19508)。

以上是否意味着String對象是泄漏的來源?我應該如何診斷它呢?

更新
我安裝了哼寶石來獲得額外的內存信息,並運行它在一塊原木。然而,它只是顯示的一切,用一噸的記憶:

- 總結 -
最差的要求:
70748 KB,靜#家
70748 KB,部分#顯示
40664 KB ,頁面顯示#

這也說明創建活動記錄的數量:

- 摘要 -
最差的要求:
1569,靜態#家
829,部分#顯示
817頁#表明

所以這是一個一般的內存泄漏,但我怎麼能找到呢?

+0

我懷疑問題是new_relic。我將等待確認。 –

+0

其實它是Ruby 2.1。 –

回答

1

刪除new_relic gem 3.7.3幫助了幾天,但然後內存問題重新啓動。將Ruby從2.1更改爲2.0可解決問題。看來獨角獸和Ruby 2.1並不好相處。

1

嘗試查看oink gem以調試您在開發環境中使用內存https://rubygems.org/gems/oink的位置。

另外看看你是否在db對象中擁有很多關聯的(has-many)db元素。他們可以讓你驚訝他們消耗多少內存

+0

好的,我添加了Oink,但我仍然不確定如何找到泄漏。 –

+0

現在按照oink的指示並運行你的應用程序幾次,看看哪個進程每次使用更多的內存 有時它不是內存泄漏,而是每次訪問它時都會不斷增長的對象。在我記憶中的最後一場噩夢中,我有一個與圖像具有has_many關係的對象。每次我添加一個新的圖像時,對象都會在下一次調用時加載它們。所以沒有花太多時間來超越記憶 – bobbdelsol