2010-12-16 600 views
14

Cuando corrocarriles lentos pila

servidor de rieles

o

-T rastrillo

o algún otro script de rieles, se necesita una gran cantidad de tiempo, aproximadamente 1 minuto. ¿Cuál es la mejor manera de determinar qué es exactamente tan lento? ¿Cómo se puede mejorar la velocidad?

rieles v 3.0.3 es correr a través de rubí 1.9.2 (RVM) - Linux

+1

¿En qué plataforma estás? Linux? ¿Mac? Además, defina "mucho tiempo" ... ¿20 segundos? ¿2 minutos? –

+0

Sí, estoy empezando el tutorial de Rails con una instalación limpia de Rails 3.1.1 en Windows 7 y 'rake -T' tarda 11 segundos en ejecutarse. –

Respuesta

15

que me está molestando también, ya que he cambiado a Rails 3.

Para su segunda pregunta: He encontrado al profundizar en el marco de trabajo, los inicializadores tardan la mitad del tiempo de una simple llamada de rake o rails antes de que realmente comience a realizar su tarea.

Si pones estas líneas simples de temporización en el circuito de llamadas de inicializador en $GEM_PATH/gems/railties-3.0.3/lib/rails/initializable.rb (o de lengüeta de que si se quiere):

def run_initializers(*args) 
    return if instance_variable_defined?(:@ran) 
    t0 = Time.now 
    initializers.tsort.each do |initializer| 
    t = Time.now 
    initializer.run(*args)   
    puts("%60s: %.3f sec" % [initializer.name, Time.now - t]) 
    end 
    puts "%60s: %.3f sec" % ["for all", Time.now - t0] 
    @ran = true 
end 

EDIT: O, para railties 4.2.1:

def run_initializers(group=:default, *args) 
    return if instance_variable_defined?(:@ran) 
    t0 = Time.now 
    initializers.tsort.each do |initializer| 
    t = Time.now 
    initializer.run(*args) if initializer.belongs_to?(group) 
    puts("%60s: %.3f sec" % [initializer.name, Time.now - t]) 
    end 
    puts "%60s: %.3f sec" % ["for all", Time.now - t0] 
    @ran = true 
end 

... puede seguir lo que sucede. En mi sistema, que es una MacBook de 2.4 Core 2 Duo, los inicializadores tardan unos 7 segundos.

Hay algunas que son especialmente lentas en mi sistema. Cuando puedo filtrar todo lo alto debajo de un segundo, me sale este resultado en mi sistema:

   load_active_support: 1.123 sec 
active_support.initialize_time_zone: 1.579 sec 
         load_init_rb: 1.118 sec 
       set_routes_reloader: 1.291 sec 

Estoy seguro de que alguien (¿soy yo?) Va a tomar algún tiempo para empezar por ahí y optimizar.

+1

[Rails 1.9.3-p327] (http://rubyinstaller.org/) mejora este _un lot_. – lambinator

+2

@lambinator ¿Te refieres a ** Ruby ** 1.9.3-p327? – evanrmurphy

0

Utilicé la sugerencia de robokopp aquí para descubrir que la mayoría del tiempo se usaba en los pasos build_middleware_stack y load_config_initializers para mí. Esto se debe a que estoy usando la gema omniauth que agrega middlewares y quizás tiene pasos pesados ​​de inicialización. Estoy en Rails 3.1.rc1, y mi inicialización toma casi 13 segundos (estoy en rubí 1.9.2p180).

Incluso para la nueva aplicación de rieles 3.1.rc1, la inicialización demora ~ 3.6 segundos, con un tiempo máximo tomado por load_config_initializers.

Así que sugiero que busques gemas/tu propio código que tenga inicializadores pesados ​​o agregue demasiados middlewares.

1

Una solución que uso para esto es precargar el entorno de rieles con rails-sh. De esta manera, solo el primer comando de rails/rake es lento y el resto es bastante rápido. Escribió una respuesta más completa en this question.

Otra forma que he probado más recientemente y que es compatible con la primera es instalar un ruby ​​parcheado (con rvm o rubyenv o de origen) y ajustar las variables de entorno (ver la respuesta de @ stwienert). El parche Falcon y los parches railsexpress parecen obtener un rendimiento significativo en ruby ​​1.9. Consulte rvm/rubyenv sobre cómo instalar rubíes reparados con ellos.

13

Nuestros rieles tiempo de arranque 3.1 fue casi un 1 minuto (teniendo un montón de piedras preciosas)

Luego nos enteramos de algunas de Ruby 1.9.3 opciones de ajuste en Reddit: http://www.reddit.com/r/ruby/comments/wgtqj/how_i_spend_my_time_building_rails_apps/c5daer4

export RUBY_HEAP_MIN_SLOTS=800000 
export RUBY_HEAP_FREE_MIN=100000 
export RUBY_HEAP_SLOTS_INCREMENT=300000 
export RUBY_HEAP_SLOTS_GROWTH_FACTOR=1 
export RUBY_GC_MALLOC_LIMIT=79000000 

poner esto en su entorno de shell/profile/bashrc, y listo.

Hemos impulsado nuestra puesta en marcha de 1 minuto a 9 segundos