Память растет бесконечно в пустом приложении Rails
Я не могу понять, почему мое приложение Rails (размещенное на Heroku (кедре)) продолжает выделять все больше и больше памяти. Если бы я не знал ничего лучше, я бы сказал, что это утечка памяти в Ruby/Rails, но поскольку я совершенно новичок в Ruby/Rails, я чувствую, что у меня что-то совершенно очевидно.
Я использую значения по умолчанию Rails, сгенерированные rails new
, и полностью обновленные драгоценные камни:
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, а затем написал быстрый script, который будет загружать мою страницу Heroku каждые 10 секунд. Об этом сообщает моя Новая реликвия:
![http://i.imgur.com/djZZn.png]()
Вот и все. Память просто продолжает расти, пока она не преодолеет предел Heroku 512 МБ. Код в этом приложении в значительной степени совпадает с кодом, который я видел в учебнике, которое я последовал. Я не понимаю, что я делаю неправильно.
Всем приветствуется любое руководство.
EDIT (9/12): Если это актуально, я использую ruby 1.9.
Код, который я использую, чтобы попасть на сервер (С#):
using (var wc = new WebClient())
for (;; Thread.Sleep(10000))
wc.DownloadString("http://vast-earth-9859.herokuapp.com/");
РЕДАКТИРОВАТЬ (9/13): попытаться отключить новую реликвию и посмотреть, все ли она R14.
Ответы
Ответ 1
Попытка удалить новый реликвий. У меня была одна и та же проблема на героку, и виновником был новый реликвий.
Вы можете проверить свой текущий объект, который является памятью. Ниже приведен код подсчета объектов.
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
Как только объем памяти превысит (512 МБ) лимит на heroku, он не сразу потеряет память, перезапустив приложение или изменив код. Он будет продолжать расти и замедлять его дальше, сам героику убивает процесс, когда он достигает порога памяти герою (не уверен, насколько это заметно).
Существуют различные вещи, которые могли вызвать утечку памяти, следуя нескольким
1. Непрерывные исключения, брошенные
2. Получение большого количества данных в одном запросе.
Тестирование на локальном компьютере не поможет, так как у вас не будет ограничения на вашем компьютере.
Выполните следующие действия, чтобы увидеть журнал героя и укажите, какие последние ошибки относятся к элементам времени.
heroku logs -a <application name> -n<number of lines>
Остановите приложение на день или около того, затем вы можете изменить код и запустить приложение.