提高Rails启动时间缓慢问题(rails控制台,rails服务器)

18

我使用几个Rails应用程序,一些在Rails 3.2 / Ruby 2.0上运行,一些在Rails 2.3 / Ruby 1.8.7上运行。

它们共同之处在于,随着它们增加更多依赖项/ gems,启动时间变得越来越长。无论是开发,测试,生产还是控制台,有些需要60秒以上。

首选的方法是什么?首先,对导致加载时间变慢的原因进行分析,然后改善加载时间?

3个回答

19

有几个因素可能导致这种情况出现。

  1. 过多的垃圾回收(GC)次数和VM缺陷-详细说明请参见此答案。Ruby <2.0具有一些非常缓慢的部分,可能会极大地增加加载速度;使用Falcon或railsexpress补丁编译Ruby可以大大帮助解决这个问题。所有版本的MRI Ruby都默认使用不适合Rails应用程序的GC设置。
  2. 许多需要遍历才能加载文件的旧版gems。如果您正在使用bundler,请尝试使用bundle clean。如果您正在使用RVM,则可以尝试创建一个新的gemset。

就性能分析而言,您可以使用ruby-prof来分析启动应用程序时发生了什么。您可以在一个ruby-prof块中包装config/environment.rb,然后使用类似rails r '的内容来生成启动周期的剖面分析报告。这可以帮助您跟踪查找引导时间主要花费在哪里。您也可以对单独的部分进行分析,例如boot.rb中的bundler设置,或environment.rb中的#initialize!调用。

您可能没有考虑到的是DNS超时。如果您的应用程序在启动时执行DNS查找,但无法解析这些查找,则这些查找可能会阻止进程$timeout秒(在某些情况下可能高达30秒!)。您可能还要审查应用程序中是否存在此类情况。


13

Ryan有一个很好的教程,关于如何加快测试、控制台、rake任务: http://railscasts.com/episodes/412-fast-rails-commands?view=asciicast

我已经尝试了其中的每一种方法,发现"spring"是最好的。只需像这样运行任务:

$ spring rspec 

你第一次启动 Spring 的时间将与以前相同,但第二次及以后将更快。

根据我的经验,有时候当出现奇怪的错误时,你需要停止 Spring 服务器并重新启动,但这种情况很少发生。


1
谢谢,Spring非常棒!但它确实会破坏我的许多rspec/capybara测试。 - professormeowingtons
1
遗憾的是,Spring虽然快速而强大,但绝对不喜欢rspec/capybara - professormeowingtons
@Professormeowingtons,你为什么这么说?我已经使用Spring很长时间并且每天运行RSpec感觉很好。 - Billy Chan
这个问题,抱歉我是指factorygirl而不是capybara:https://github.com/jonleighton/spring/issues/88 - professormeowingtons

0

1
这两个选项都不能真正帮助缩短启动时间,它们只是在初始启动后对应用程序进行检查点,以便您可以从已经预热的状态中分离出分支。虽然有用,但它们并没有直接回答OP的问题。 - Chris Heald

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接