慢铁栈

时间:2010-12-16 13:43:23

标签: ruby-on-rails performance rake

当我跑步时

  

rails服务器

  

rake -T

或其他一些rails脚本,需要花费很多时间,大约1分钟。 确定这么慢的最佳方法是什么? 如何提高速度?

Rails v是3.0.3运行ruby 1.9.2(RVM) - Linux

4 个答案:

答案 0 :(得分:16)

这也困扰着我,因为我已经切换到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

编辑:或者,对于铁路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 :(得分:14)

我们的Rails 3.1启动时间差不多是1分钟(有很多宝石)

然后我们在reddit上发现了一些Ruby 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秒

答案 2 :(得分:2)

我使用的一个解决方法是使用rails-sh预加载rails环境。这样只有第一个rails / rake命令很慢,其余的都很快。在this question中写了一个更全面的答案。

我最近尝试的另一种方法是与第一种方法兼容的是安装修补的ruby(使用rvm或rubyenv或来自源代码)并调整环境变量(请参阅@ stwienert的答案)。猎鹰补丁和railsexpress补丁似乎在红宝石1.9中获得了显着的表现。查看rvm / ruby​​env如何用它们安装修补过的红宝石。

答案 3 :(得分:0)

我在这里使用了robokopp的提示,发现大部分时间都用于build_middleware_stackload_config_initializers步骤。这是因为我使用的omniauth gem添加了中间件,可能还有很多初始化步骤。我在Rails 3.1.rc1上,我的初始化需要大约13秒(我在ruby 1.9.2p180上)。

即使对于全新的rails 3.1.rc1应用程序,初始化需要约3.6秒,load_config_initializers需要最长时间。

所以我建议你寻找拥有大量初始化程序或添加太多中间件的gems /你自己的代码。