2012-09-12 8 views
19

No puedo entender por qué mi aplicación Rails (alojada en Heroku (cedro)) sigue asignando más y más memoria. Si no supiera algo mejor, diría que es una pérdida de memoria en Ruby/Rails, pero como soy completamente nuevo en Ruby/Rails, siento que me falta algo completamente obvio.La memoria crece indefinidamente en una aplicación de Rails vacía

estoy usando valores por defecto Rails generados por rails new y piedras preciosas por completo hasta a la fecha:

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 

estoy usando el default newrelic config. Tengo cero modelos y un controlador, nothing_controller.rb, que se generó utilizando rails generate controller nothing:

class NothingController < ApplicationController 
    def index 
    end 
end 

Suprimí public/index.html y añadido un vacío views/nothing/index.html.erb. La única otra cosa que hice para la aplicación generada era añadir una ruta a routes.rb:

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

cometí, empujó a Heroku, a continuación, escribió un guión rápido que cargar mi página de Heroku cada 10 segundos. Esto es lo que mi nueva reliquia informa:

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

Eso es todo lo que hay que hacer. La memoria simplemente sigue aumentando así hasta que pasa el límite de Heroku de 512 MB. El código en esta aplicación es bastante similar al código que he visto in the tutorial I followed. No entiendo lo que estoy haciendo mal.

Cualquier orientación sería muy apreciada.

EDITAR (9/12): En caso de que sea relevante, estoy usando ruby ​​1.9.

Código

que estoy usando para golpear el servidor (C#):

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

EDITAR (9/13): El ir a probar a desactivar New Relic y ver si todavía R14S.

+0

Ver el código que llega a su servidor cada 10s estaría bien. – deefour

+0

Claro. Adicional. Como nota al margen, la razón por la que decidí hacer esto fue porque una aplicación bastante básica que escribí tenía algún problema y se quedaría sin memoria después de ~ 400 visitas a la página. – user1650177

+0

Prueba agregar Oink para monitorear lo que se está creando una instancia. RubyProf puede llevar algo de engaño, pero si logras que funcione, eso te dará más información. Generalmente, se supone que la memoria aumenta, esto es bueno. Además, se supone que es basura recolectada cuando no se usa con tanta frecuencia. – maletor

Respuesta

2

Una vez que la memoria excede (512 MB) el límite en heroku, no se apagará la memoria inmediatamente al reiniciar la aplicación o al cambiar el código. Seguirá creciendo y ralentizándolo aún más, heroku mismo mata el proceso cuando alcanza el umbral de memoria de heroku (no estoy seguro de cuánto es).

Hay varias cosas que pueden haber causado las pérdidas de memoria, a continuación se enumeran las 1. Se han producido excepciones continuas 2. Obteniendo muchos datos en una sola solicitud.

Probarlo en la máquina local no ayudará ya que no tendrá ninguna restricción de memoria en su máquina.

Haga lo siguiente para ver el registro de heroku y calcular cuáles son los últimos errores de los elementos que toman tiempo.

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

Detenga la aplicación por un día o así puede cambiar el código e iniciar la aplicación.

4

Intentando eliminar la gema newrelic. Tuve el mismo problema en heroku y el culpable fue la gema newrelic. Puede verificar su objeto actual que es memoria. A continuación, el código muestra el recuento de objetos.

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' producirá un resultado similar. – srt32

Cuestiones relacionadas