Вопрос по ruby-on-rails-3, heroku, ruby-on-rails – Память растет бесконечно в пустом приложении Rails

19

Я не могу понять, почему мое приложение 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

Я используюпо умолчанию 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 секунд. Вот что сообщает моя новая реликвия:

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

Вот и все, что нужно сделать. Память продолжает расти таким образом, пока не превысит ограничение Heroku 512 МБ. Код в этом приложении почти такой же, как и код, который я виделв учебнике я следовал, Я не понимаю, что я делаю неправильно.

Любое руководство будет с благодарностью.

РЕДАКТИРОВАТЬ (9/12): Если это уместно, я использую ruby 1.9.

Код, который я использую, чтобы попасть на сервер (C #):

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

РЕДАКТИРОВАТЬ (9/13): Попытаться отключить New Relic и посмотреть, все ли R14.

Было бы неплохо видеть код, который попадает на ваш сервер каждые 10 секунд. deefour
Извините за поздний ответ. В последнее время почти не было свободного времени. jakeonrails был прав. После обновления newrelic с помощью пакета bundle мои приложения rails больше не исчерпывают память. Они все еще доходят до ~ 300 МБ, после чего они снова падают вниз. user1650177
Попробуйте добавить Oink, чтобы следить за тем, что создается. RubyProf может занять некоторое время, но если вы сможете заставить его работать, это даст больше понимания. Как правило, память должна увеличиваться - это хорошо. Кроме того, предполагается, что он собирает мусор, когда его используют не так часто. maletor
Конечно. Добавлен. Как примечание, я решил сделать это потому, что довольно простое приложение, которое я написал, имело некоторую проблему и не хватило бы памяти после ~ 400 просмотров страниц. user1650177
Какая версия newrelic gem находится в вашем Gemfile.lock? Некоторое время назад были проблемы с памятью, которые можно было решить, запустив пакет обновления newrelic или вручную указав последнюю версию гема. jakeonrails

Ваш Ответ

2   ответа
4

Попытка удаления нового реликтового камня. У меня была такая же проблема на героку и виновником был новый реликтовый камень. Вы можете проверить свой текущий объект, который является памятью. Ниже код покажет вам количество объектов.

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}
ObjectSpace.count_objects будет производить аналогичный выход.
2

Как только память превысит (512 МБ) предел для heroku, он не сможет сразу же отключить память, перезапустив приложение или изменив код. Он будет продолжать расти и замедлять его дальше, сама герока убивает процесс, когда достигает порога памяти геройки (не уверенный, сколько это).

Существуют различные вещи, которые могли вызвать утечку памяти, вот несколько 1. Непрерывные исключения 2. Получение большого количества данных в одном запросе.

Тестирование на локальной машине не поможет, поскольку у вас не будет никаких ограничений памяти на вашей машине.

Выполните следующие действия, чтобы увидеть журнал heroku и выяснить, какие последние ошибки требуют времени.

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

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

Похожие вопросы