Rails 3应用服务器启动时间很长

更新2这是一个已知的错误/function,Ruby 1.9.2加载文件的方式。 http://twitter.com/#!/rails/status/72801149769621504

更新:这开始是一个问题,但经过一段时间的努力,我认为它可能无法修复。 我想我会发布这个以防其他人看到同样的事情,并想知道在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导致它。 我也看到了与乘客相似的事情(这使得它在2.2.15中无法使用产生行为的b / c)。 我对边缘Rails进行了测试,开发时的性能略差14.5秒vs 14.2s。 如果我删除了我的测试依赖项,它可以节省2-3秒,但是当我运行测试时这没有用。 我想等待5分钟让我的所有Thin实例重新启动并在测试运行前等待15秒有点烦人,但这是一个可接受的权衡,因为我通过Rails 3获得了生产力。如果有人有任何想要帮助加快速度,我全都听见了。 以下是测试结果:

注意:我在Rails 2.3中的应用程序在开发时间不到3秒内加载(虽然我已经将一些代码转换为引擎并添加了haml和twitter_oauthgem,因为转移到rails3)

**所有测试都使用Rails 3RC和Ruby 1.9.2rc2进行

推出Thin – CentOS 5.5,Rackspace云服务器2GB实例
测试App#1有24个gem依赖项

 start env.rb  -  Total = 0
  启动app.rb  - 已过了0.00110546。 总= 0.001180052  
    启动boot.rb  -  0.000600488已过。 总= 0.00178644    
     end boot.rb  -  0.7935529过去了。 总= 0.795507318  
     start需要rails / all  -  0.000189127已过。 总= 0.795701199  
    结束需要rails / all  - 已经过了1.086998364 。 总= 1.882735263  
    启动Bundler require  -  0.000109708已过。 总= 1.88285043  
    结束Bundler需要 - 8.955853243已过去。 总= 10.838746673  
  结束app.rb  -  0.062975913过去了。 总= 10.901753753  
   #/ rasiesies-3.0.0.rc/lib/rails/initializable.rb 
  开始运行初始化程序 -  0.000145906已过去。 总= 10.901910186  
     load_environment_config  - 已过了0.116689774。 总= 11.018632298  
     initialize_cache  - 已过0.246161343。 总= 11.320543397  
     active_record.initialize_database  - 已过去0.080047485。 总= 11.400961893  
     bootstrap_hook  - 已过去1.034189984。 总= 12.451309104  
     active_support.initialize_time_zone  - 已过去1.969821814。 总= 14.448777651  
     action_controller.set_configs  - 已过去0.594991537。 总= 15.044692126  
     will_paginate.active_record  - 已过了0.324460921。 总= 15.386837641  
     will_paginate.action_view  - 1.904889132过去了。 总= 17.328981523  
     add_view_paths  - 已过了0.087811847。 总= 17.42011881  
     load_init_rb  - 已过了0.151282681。 总= 17.709093173  
     load_init_rb  - 已过了0.362241273。 总= 18.071865548  
     load_config_initializers  -  0.144051305已过。 总= 18.217433492  
     build_middleware_stack  - 已过去2.569453884 。 总= 20.826842081  
     eager_load!  - 4.165919064过去了。 总= 24.99280168  
     finisher_hook  -  0.48795935过去了。 总= 25.480807439  
     repopulate_roles  -  0.504085662过去了。 总= 25.984901297  
  结束初始化程序 - 约0.00005已过。 总= 25.985617783  
结束env.rb  -  ~0.00006过去了。 总= 25.985683903  

Dev with Mongrel – Max OSX 10.5.8,2.66 Core2duo,4GB RAM
测试App#1有24个gem依赖项

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

使用Mongrel Test App#2 开发,具有2个gem依赖项

 start boot.rb(Bundler.setup) - 总计= 0
 end boot.rb(Bundler.setup) - 经过了1.724158 。 总= 1.724199
启动app.rb  - 已过了0.041006。 总= 1.765211
   start require rails  - 已经过了0.000151。 总= 1.765364
  结束需要导轨 - 已经过了0.360051。 总= 2.125426
  启动Bundler.require(:default,Rails.env) -  5.5e-05已过。 总= 2.125485
   end Bundler.require(:default,Rails.env) - 已过去0.008396。 总= 2.133889
结束app.rb  - 已过去0.007805。 总= 2.141704
启动env.rb  - 已过了0.16541。 总= 2.307128
  启动run_initializers  -  0.00031已过去。 总= 2.307442
     load_active_support  - 已过了0.24045。 总= 2.579421
     active_support.initialize_time_zone  -  0.206237已过去。 总= 2.837663
     action_controller.deprecated_routes  - 已过了0.210291。 总= 3.048634
     build_middleware_stack  -  0.220663过去了。 总= 3.273035
   end run_initializers  -  3.0e-06已过。 总= 3.29339
结束env.rb  -  8.7e-05过去了。 总= 3.293483

因为这是一个相当古老的问题:您是否使用Rails 3的发行版进行了测试?

这是很长一段时间,但最终毫无意义。 我的rails应用程序一次可以保持数月,因此只占总运行时间的1%的一小部分。

你有很多Bundler必须处理的依赖吗? 我可以在任何环境中在不到2秒的时间内启动我的Rails 3应用程序,但我使用的第三方gem很少。

Bundler经常花费超过一半的时间来使用gem。 在开发/测试模式下,您加载的任何依赖项是否都是不必要的? 例如,我的一些gem只能由resque工作者或其他脚本使用。 您可以添加:require => false ,然后在需要时手动需要它们,以便在开发/测试模式下获得适度的启动速度。

在这样做之前,我通常会分析require语句(在lib / bundler / runtime.rb中)以查看它们是否真的值得取出。

我有3个rails 3个应用程序,我正在从2.3.8迁移一个,rails 2.3.8上的一个在4秒内加载,而在rails 3中途的分支需要12秒,所有其他rails 3个项目需要20个加载到30秒,当我看到有人在3秒钟内加载他的rails应用程序的截屏时非常令人沮丧,自从我迁移到rails 3之后我一直在拉我的头发3认为这是我的环境。