在production.rb中禁用eager_load会对性能产生什么影响?

use*_*092 16 ruby-on-rails eager-loading ruby-on-rails-4

我的rails 4.1 app通过SSH连接到第二台非主服务器,用于后端作业.因此,当rails应用程序每天重新启动时,SSH连接需要处于活动状态(而非第二个非主服务器需要生存/启动),否则应用程序崩溃.这是由于默认情况下急切加载在production.rb(config.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
Run Code Online (Sandbox Code Playgroud)

Mat*_*son 3

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

然而,代价是您的应用程序可能会使用更多内存(这通常是最稀缺的服务器资源)。我怀疑如果您将多线程服务器(例如 puma)与eager_load=false.

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

app/models/legacy相反,您可以将to的内容移动legacy/到项目根目录下,并将其添加到autoload_paths

config.autoload_paths += %W( #{config.root}/legacy )
Run Code Online (Sandbox Code Playgroud)

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