ruby-on-rails - 在 production.rb 中禁用 eager_load 对性能有何影响?

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

我的 rails 4.1 应用程序通过 SSH 连接到第二台非主服务器以执行后端作业。因此,当 rails 应用程序每天重新启动时,SSH 连接需要激活/启动(而不是第二个非主服务器需要启动/启动),否则应用程序崩溃。这是因为在 production.rb 中的预加载默认设置为 true。 (config.eager_load = true)。

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

1) 如果 eager_load设置为 false ,这样简单会减慢应用程序的启动时间,还是应用程序会在第一次被击中时急切地加载资源?

3) 如果eager_load只是关闭,这会在多大程度上影响应用程序的性能(更主观的问题)?

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

生产.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

最佳答案

设置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 仍然可以找到这些文件,但不会在生产环境中急切地加载它们。

关于ruby-on-rails - 在 production.rb 中禁用 eager_load 对性能有何影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30835643/

相关文章:

ruby-on-rails - 即使电子邮件不是空白,设计也会给我一个 'email cannot be blank' 错误

ruby-on-rails - 将 Rails 环境暴露给 Webpacker

laravel-5.4 - laravel hydrateRaw/fromQuery 和带分页的预加载

ruby-on-rails - 优化 Rails 中的急切加载

ruby-on-rails - 日期范围和事件天数在 rails 上

c# - Entity Framework 6 渴望加载具有许多子项和子项的大对象

ruby-on-rails - 如何在日志记录中过滤部分路径(不是参数)?

ruby-on-rails - 如何将此原始查询转换为事件记录查询接口(interface)或 arel?

ruby - 是否有任何 REST API 可以在 rails 中的 quickblox 中获取在线用户

sql - rails - 我不应该在 rails 迁移中使用默认值吗