2010-08-17 64 views
18

更新2這是Ruby 1.9.2加載文件的已知錯誤/功能。 http://twitter.com/#!/rails/status/72801149769621504Rails 3應用程序服務器啓動時間很長

更新:這開始是一個問題,但經過一段時間的工作後,我認爲它可能無法解決。我想我會張貼這個以防其他人看到相同的東西,並且想知道在rails和bundler裏面發生了什麼。

是否有其他人在他們的Rails 3應用程序中看到很長的加載時間?我將定時器放在environment.rb,application.rb,boot.rb和railties/lib/rails/initializable.rb中。時間以秒爲單位測量,經過時間是自上次記錄時間以來的時間。生產加載時間需要更長的時間。部分原因是硬件較少,也來自eager_load! (也許來自Thin vs Mongrel)。看起來Bundler正在佔用大量的加載時間,我想這是可以預料的。我測試了dev和prod中的一個應用程序,以及dev中的一個空白應用程序。我測試了2款應用服務器,只是爲了查看它是否是Thin導致的。我也看到Passenger in prod中的類似事情(這使得2.2.15中的產卵行爲無法使用)。我對邊緣Rails進行了測試,dev中的性能稍微差一點14.5s和14.2s。如果我刪除了我的測試依賴關係,它會節省2-3秒,但這對我運行測試時無效。我猜這對於所有我的Thin實例重啓並等待5分鐘都有點煩人,並且在我的測試運行之前還等待了15秒,但由於我在Rails 3中獲得的生產力,這是一個可接受的折衷。如果有人有任何問題有助於加快速度的想法,我十分耳熟能詳。以下是測試結果:

注:我在小於3秒加載在開發中(雖然我已經轉換代碼引擎的一點點,並添加HAML的Rails 2.3的應用程序和自招至twitter_oauth寶石Rails3中)

**使用Rails 3RC和Ruby 1.9.2rc2

PROD薄壁進行所有的測試 - 的CentOS 5.5,Rackspace的雲服務器實例2GB
測試應用程序#1與24 gem依賴

 
start env.rb - Total=0 
    start app.rb - 0.00110546 elapsed. Total=0.001180052 
    start boot.rb - 0.000600488 elapsed. Total=0.00178644  
    end boot.rb - 0.7935529 elapsed. Total=0.795507318 
    start require rails/all - 0.000189127 elapsed. Total=0.795701199 
    end require rails/all - 1.086998364 elapsed. Total=1.882735263 
    start Bundler require - 0.000109708 elapsed. Total=1.88285043 
    end Bundler require - 8.955853243 elapsed. Total=10.838746673 
    end app.rb - 0.062975913 elapsed. Total=10.901753753 
    # /railties-3.0.0.rc/lib/rails/initializable.rb 
    start run initializers - 0.000145906 elapsed. Total=10.901910186 
    load_environment_config - 0.116689774 elapsed. Total=11.018632298 
    initialize_cache - 0.246161343 elapsed. Total=11.320543397 
    active_record.initialize_database - 0.080047485 elapsed. Total=11.400961893 
    bootstrap_hook - 1.034189984 elapsed. Total=12.451309104 
    active_support.initialize_time_zone - 1.969821814 elapsed. Total=14.448777651 
    action_controller.set_configs - 0.594991537 elapsed. Total=15.044692126 
    will_paginate.active_record - 0.324460921 elapsed. Total=15.386837641 
    will_paginate.action_view - 1.904889132 elapsed. Total=17.328981523 
    add_view_paths - 0.087811847 elapsed. Total=17.42011881 
    load_init_rb - 0.151282681 elapsed. Total=17.709093173 
    load_init_rb - 0.362241273 elapsed. Total=18.071865548 
    load_config_initializers - 0.144051305 elapsed. Total=18.217433492 
    build_middleware_stack - 2.569453884 elapsed. Total=20.826842081 
    eager_load! - 4.165919064 elapsed. Total=24.99280168 
    finisher_hook - 0.48795935 elapsed. Total=25.480807439 
    repopulate_roles - 0.504085662 elapsed. Total=25.984901297 
    end run initializers - ~0.00005 elapsed. Total=25.985617783 
end env.rb - ~0.00006 elapsed. Total=25.985683903 

開發與雜種 - 最大OSX 10.5.8,2.66酷睿,4GB RAM
測試應用程序#1與24 gem依賴

 
start boot.rb (Bundler.setup) - 2.0e-05 elapsed. Total=3.1e-05 
end boot.rb (Bundler.setup) - 2.352435 elapsed. Total=2.352915 
start app.rb - 0.084945 elapsed. Total=2.437866 
    start require rails/all - 0.000181 elapsed. Total=2.438049 
    end require rails/all - 0.489425 elapsed. Total=2.927485 
    start Bundler.require(:default, Rails.env) - 5.6e-05 elapsed. Total=2.927544 
    end Bundler.require(:default, Rails.env) - 5.16162 elapsed. Total=8.089177 
end app.rb - 0.025972 elapsed. Total=8.11516 
start env.rb - 0.084153 elapsed. Total=8.199329 
    # /railties-3.0.0.rc/lib/rails/initializable.rb 
    start run_initializers - 0.002709 elapsed. Total=8.202042 
    initialize_cache - 0.089231 elapsed. Total=8.518005 
    bootstrap_hook - 0.602342 elapsed. Total=9.192564 
    active_support.initialize_time_zone - 0.901676 elapsed. Total=10.10115 
    action_controller.set_configs - 0.375864 elapsed. Total=10.477565 
    will_paginate.active_record - 0.207447 elapsed. Total=10.694479 
    will_paginate.action_view - 1.041412 elapsed. Total=11.75974 
    load_init_rb - 0.051938 elapsed. Total=11.879547 
    load_init_rb - 0.082936 elapsed. Total=12.001311 
    load_init_rb - 0.18798 elapsed. Total=12.189555 
    load_config_initializers - 0.079461 elapsed. Total=12.269971 
    build_middleware_stack - 1.390042 elapsed. Total=13.729273 
    finisher_hook - 0.082274 elapsed. Total=13.811648 
    repopulate_roles - 0.350287 elapsed. Total=14.161941 
    end run_initializers - 3.0e-06 elapsed. Total=14.177869 
end env.rb - 0.000127 elapsed. Total=14.178002 

開發與雜種 測試應用程序#2與2寶石依賴關係

 
start boot.rb (Bundler.setup) - Total=0 
end boot.rb (Bundler.setup) - 1.724158 elapsed. Total=1.724199 
start app.rb - 0.041006 elapsed. Total=1.765211 
    start require rails - 0.000151 elapsed. Total=1.765364 
    end require rails - 0.360051 elapsed. Total=2.125426 
    start Bundler.require(:default, Rails.env) - 5.5e-05 elapsed. Total=2.125485 
    end Bundler.require(:default, Rails.env) - 0.008396 elapsed. Total=2.133889 
end app.rb - 0.007805 elapsed. Total=2.141704 
start env.rb - 0.16541 elapsed. Total=2.307128 
    start run_initializers - 0.00031 elapsed. Total=2.307442 
    load_active_support - 0.24045 elapsed. Total=2.579421 
    active_support.initialize_time_zone - 0.206237 elapsed. Total=2.837663 
    action_controller.deprecated_routes - 0.210291 elapsed. Total=3.048634 
    build_middleware_stack - 0.220663 elapsed. Total=3.273035 
    end run_initializers - 3.0e-06 elapsed. Total=3.29339 
end env.rb - 8.7e-05 elapsed. Total=3.293483 
+0

你是非常友善的分享你的實驗結果。我不確定你使用的是什麼版本的Ruby,但是我認爲Ruby> = 1.9會加速一些事情。 – 2010-08-19 10:10:57

+1

我正在使用Ruby 1.9.2。性能是加載寶石的一個結果,也是從rails框架的模塊化開始的。您擁有的依賴性越多,啓動應用程序所需的時間就越多,這是有道理的。我懷疑核心團隊能做些什麼來加速這一進程......至少在短期內不會。 – johnmcaliley 2010-08-19 13:30:49

+0

我想知道爲什麼Rails 2沒有這麼模塊化的方法啓動速度如此之快......那麼也許問題應該是:爲什麼需要這麼長時間才能讓bundler加載所有的依賴關係?它解決這些問題還是隻是盲目加載它們?我猜如果我們可以禁用bundle的所有智能特性,並且只是加載它的依賴關係,它會加快速度...... – 2010-08-25 03:02:41

回答

2

由於這是一個相當古老的問題:你是否測試過它的發行版R唉3?

這是一段很長的時間,但最終沒有意義。我的Rails應用程序一次保持數月,因此佔總運行時間的1%的一小部分。

Bundler需要處理大量的依賴關係嗎?我可以在任何環境下在不到2秒的時間內啓動我的Rails 3應用程序,但我使用的第三方寶石非常少。

+0

我現在正在使用Rails 3正式版本。儘管我還沒有再次運行基準測試,但引導時間並沒有明顯改善。是的,我的應用程序有很多依賴關係,你可以看到一個空的Rails 3應用程序在基準測試中在我的服務器上啓動大約3秒鐘。當我嘗試使用Passenger並等待進程產生時,這是一個煩惱。我每週至少部署幾次更改,並且在我的系統上有數百個用戶,30秒的等待或停機時間是個問題。我切換到精簡併使用滾動重新啓動,所以在這之後它確實不是問題。 – johnmcaliley 2010-09-20 01:50:52

+0

另外,在乘客3測試版中,這已不再是零宕機重新啓動和新的產卵架構的問題。所以你是對的......除了可能的測試(如果你沒有使用spork之類的東西),這最終是毫無意義的。 – johnmcaliley 2010-09-20 01:57:00

+0

這仍然存在..但問題是在發展中也需要很長時間,這是令人沮喪的。 – rtdp 2011-12-01 17:47:22

2

Bundler經常花費一半以上的時間需要寶石。在開發/測試模式下是否有不必要的加載依賴項?例如,我的一些寶石只能用於復古工作者或其他腳本。您可以添加:require => false,然後在開發/測試模式下以手動方式需要它們以獲得適度的啓動速度增益。

在這樣做之前,我通常會對require語句(在lib/bundler/runtime.rb中)進行簡要描述,看看它們是否值得去掉。

+0

我其實在開發/測試中有更多的寶石.. mongrel,cuke,rspec等;-)我同意這是一個很好的練習。如果仔細觀察並確保您實際使用的是gem文件中的所有內容,它肯定能爲您節省幾秒鐘。 – johnmcaliley 2010-10-19 01:38:12

0

我有3個導軌3個應用程序,我從2.3.8移植一個,導軌上的導軌2.3.8在4秒內加載,導軌3中間的導軌需要12秒,所有其他導軌3項目需要20到30秒才能加載,當我看到有人在3秒內加載他的導軌應用程序時,我非常沮喪,自從我遷移到導軌3以來,我一直在拉我的頭髮,認爲這是我的環境。

+0

也許3秒,如果你沒有依賴關係,你正在運行一流的硬件。對於包含依賴項的應用程序,我仍然沒有看到少於10秒的時間。 – johnmcaliley 2011-04-12 20:40:22

相關問題