在production.rb中禁用eager_load的性能影响是什么?

时间:2015-06-14 23:33:53

标签: ruby-on-rails ruby-on-rails-4 eager-loading

我的rails 4.1 app通过SSH连接到第二台非主服务器,用于后端作业。因此,当rails应用程序每天重新启动时,SSH连接需要处于活动状态(而非第二个非主服务器需要生存/启动),否则应用程序崩溃。这是由于默认情况下急切加载在production.rbconfig.eager_load = true)中设置为true。

我很想通过禁用急切负载来打破这种依赖关系,但我无法找到有关性能影响的大量信息。所以,我的问题是......

1)如果eager_load设置为false,那么这会简化应用程序的启动时间,还是应用会在第一次点击时急切地加载资源?

3)如果eager_load被关闭,那么这将对应用程序的性能产生何种程度的影响(更主观的问题)?

2)执行SSH连接的模型位于文件夹app\models\legacy下。而不是将eager_load更改为false,是否可以从预先加载的资源中排除该文件夹?如果是这样,怎么样?我相信我需要编辑config.autoload_paths += Dir[Rails.root.join('app', 'models', '{**/}')]但不完全确定。

production.rb:

  # Eager load code on boot. This eager loads most of Rails and
  # your application in memory, allowing both thread web servers
  # and those relying on copy on write to perform better.
  # Rake tasks automatically ignore this option for performance.
  config.eager_load = true

2 个答案:

答案 0 :(得分:1)

disable_dependency_loading如果config.eager_load设置为true,则禁用自动依赖关系加载。

详细信息请查看此博客 - http://blog.arkency.com/2014/11/dont-forget-about-eager-load-when-extending-autoload/

答案 1 :(得分:1)

设置eager_load=false可能会加速您应用的启动,因为加载将推迟到必要时。

然而,惩罚是您的应用程序可能会使用更多内存(通常是最稀缺的服务器资源)。我怀疑如果你使用带有eager_load=false的多线程服务器(例如puma),你也可能遇到线程错误。

由于Rails会在其急切的加载路径中自动包含所有app/*个目录,因此我无法想到在急切加载其他所有内容时排除app/models/legacy的简单方法。

相反,您可以将app/models/legacy的内容移至例如legacy/位于项目的根目录,并将其添加到autoload_paths

config.autoload_paths += %W( #{config.root}/legacy )

现在Rails仍然能够找到这些文件,但它们不会在生产中急切地加载。