Подтвердить что ты не робот

Память растет бесконечно в пустом приложении 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.

4b9b3361

Ответ 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>

Остановите приложение на день или около того, затем вы можете изменить код и запустить приложение.