2012-09-12 49 views
19

我不明白爲什麼我的Rails應用程序(託管在Heroku(雪松))繼續分配越來越多的內存。如果我不知道更好,我會說這是Ruby/Rails中的內存泄漏,但由於我對Ruby/Rails完全陌生,因此我覺得我錯過了一些完全明顯的東西。內存在一個空的Rails應用程序中無限增長

我使用rails new產生Rails的默認值,並完全跟上時代的寶石:

source 'https://rubygems.org' 

gem 'rails', '3.2.8' 

group :development do 
    gem 'sqlite3' 
end 

group :assets do 
    gem "sass-rails", "~> 3.2.5" 
    gem "coffee-rails", "~> 3.2.2" 
    gem "uglifier", "~> 1.3.0" 
end 

gem "jquery-rails", "~> 2.1.2" 

group :production do 
    gem 'newrelic_rpm' 
    gem "pg", "~> 0.14.1" 
end 

我使用的是default newrelic config。我具有零種模式和一個控制器,nothing_controller.rb,其使用rails generate controller nothing生成:

class NothingController < ApplicationController 
    def index 
    end 
end 

我刪除public/index.html和加入的空views/nothing/index.html.erb。我沒有到生成的應用程序的唯一的另一件事是添加路由到routes.rb

Nothing::Application.routes.draw do 
    root :to => "nothing#index" 
end 

我承諾,它被推到Heroku的,然後寫了一個快速腳本,將載入我的Heroku頁每10秒。這就是我的New Relic的報道:

http://i.imgur.com/djZZn.png

這一切就是這麼簡單。內存只是繼續增加,直到它超過Heroku的限制512MB。這個應用程序中的代碼與我見過的代碼幾乎相同in the tutorial I followed。我不明白我做錯了什麼。

任何指導將不勝感激。編輯(9/12):如果它是相關的,我使用紅寶石1.9。我使用擊中服務器(C#)

代碼:

using (var wc = new WebClient()) 
    for (;; Thread.Sleep(10000)) 
    wc.DownloadString("http://vast-earth-9859.herokuapp.com/"); 

EDIT(9/13):去嘗試禁用New Relic的,看它是否仍然R14s。

+0

看到每10秒鐘擊中你的服務器的代碼會很好。 – deefour

+0

當然。添加。作爲一個方面說明,我決定這麼做的原因是因爲我寫的一個基本的應用程序有一些問題,並且在大約400次頁面瀏覽後會耗盡內存。 – user1650177

+0

嘗試添加Oink來監視實例化的內容。 RubyProf可能會有一些挫折,但如果你能使它起作用,那將提供更多的洞察力。一般來說,記憶應該會增加 - 這很好。此外,它應該是垃圾收集時,它不經常使用。 – maletor

回答

2

當內存超過(512 MB)heroku的限制時,它不會立即通過重新啓動應用程序或更改代碼來降低內存。它會繼續增長並進一步放慢速度,當heroku本身達到heroku的內存閾值時(不知道它有多少),heroku本身會殺死這個進程。

有很多事情可能導致內存泄漏,以下是幾個 1.拋出的連續異常 2.在單個請求中獲取大量數據。

在本地計算機上測試不會有幫助,因爲您的計算機上沒有任何內存限制。

請執行以下操作以查看heroku日誌並確定哪些項目需要花費時間才能找到最新的錯誤。

heroku logs -a <application name> -n<number of lines> 

停止申請一天左右,然後你可以更改代碼並啓動應用程序。

4

嘗試去除newrelic寶石。我在heroku上有同樣的問題,罪魁禍首是新奇的寶石。 你可以檢查你當前的內存對象。下面的代碼顯示了對象數量。

ObjectSpace.each_object.with_object(Hash.new(0)){|obj, h| h[obj.class] +=1 }.select{|k,v| puts "#{k} => #{v}" if k == String || k == Array || k == Hash} 
+2

'ObjectSpace.count_objects'將產生一個類似的輸出。 – srt32

相關問題