2010-12-16 87 views
14

當我運行慢Rails堆棧

軌服務器

耙-T

或其他一些軌道腳本,它需要大量的時間約1分鐘。 什麼是確定究竟如此緩慢的最佳方式? 速度如何提高?

Rails的v是3.0.3運行低谷紅寶石1.9.2(RVM) - Linux的

+1

您在哪個平臺上工作? Linux呢?蘋果電腦?另外,請定義「很多時間」... 20秒? 2分鐘? – 2010-12-16 14:32:51

+0

是的,我剛剛在Windows 7上啓動了Rails教程,並安裝了Rails 3.1.1,'rake -T'需要11秒才能執行! – 2011-10-30 01:21:44

回答

15

正在打擾我也,因爲我已經切換到Rails 3

你的第二個問題:我發現通過挖掘框架,初始化程序在實際開始執行任務之前,需要花費大約一次簡單的rake或rails調用的一半時間。

如果你把這些簡單的計時線到初始呼叫的$GEM_PATH/gems/railties-3.0.3/lib/rails/initializable.rb循環(或者,如果你喜歡背馱式吧):

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 

編輯:或者,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 

...你可以跟進會發生什麼。在我的系統上,這是一款2.4 Core 2 Duo MacBook,初始化程序大約需要7秒。

有一些在我的系統上特別慢。當我全部過濾掉低於第二,我得到我的系統上這個結果:

   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 

我相信有人(是我嗎?)還需要一段時間,開始有和優化。

+1

[Rails 1.9.3-p327](http://rubyinstaller.org/)改進了這個_a lot_。 – lambinator 2012-12-05 16:54:34

+2

@lambinator你的意思是** Ruby ** 1.9.3-p327? – evanrmurphy 2013-09-20 21:14:47

0

我用robokopp的提示來發現大部分時間都在build_middleware_stackload_config_initializers步驟中用於我。這是因爲我使用的是添加中間件的gem,可能有很多初始化步驟。我在Rails 3.1.rc1上,我的初始化需要將近13秒(我在Ruby 1.9.2p180上)。

即使對於全新的rails 3.1.rc1應用程序,初始化也需要3.6秒,最大耗時load_config_initializers

因此,我建議你尋找寶石/你自己的代碼有重型初始化或添加太多的中間件。

1

我使用的一種解決方法是預加載軌道環境,使用rails-sh。這樣,只有第一個rails/rake命令很慢,其餘的都很快。在this question寫了一個更全面的答案。

我最近嘗試的另一種方法是與第一種方法兼容的是安裝補丁ruby(使用rvm或rubyenv或源代碼)並調整環境變量(請參閱@stwienert的答案)。獵鷹補丁和railsexpress補丁似乎在紅寶石1.9中顯示出顯着的性能。查看rvm/ruby​​env關於如何安裝補丁的紅寶石。

13

我們的Rails 3.1的啓動時間幾乎一分鐘(有很多的寶石)

然後,我們發現了在Reddit上的一些紅寶石1.9.3優化選項: 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 

把這個在你的shell環境/ profile/bashrc中,你就完成了。

我們將啓動時間從1分鐘提高到了9秒