【问题标题】:slow rails stack慢轨堆栈
【发布时间】:2011-05-26 13:41:12
【问题描述】:

当我跑步时

轨道服务器

耙-T

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

Rails v 是 3.0.3,通过 ruby​​ 1.9.2 (RVM) - Linux 运行

【问题讨论】:

  • 你在哪个平台上? Linux?苹果?另外,请定义“很多时间”...... 20 秒? 2 分钟?
  • 是的,我刚刚开始 Rails 教程,在 Windows 7 上全新安装 Rails 3.1.1,rake -T 需要 11 秒才能执行!

标签: ruby-on-rails performance rake


【解决方案1】:

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

我确信有人(是我吗?)需要一些时间从那里开始并优化。

【讨论】:

  • @lambinator 你的意思是 Ruby 1.9.3-p327 吗?
【解决方案2】:

我们的 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 秒

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      我在这里使用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

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

      【讨论】:

        猜你喜欢
        • 2020-11-26
        • 1970-01-01
        • 2019-11-04
        • 1970-01-01
        • 2014-06-23
        • 1970-01-01
        • 1970-01-01
        • 2011-05-04
        • 1970-01-01
        相关资源
        最近更新 更多