在 production.rb 中禁用 eager_load 对性能有何影响?
What's the performance impact of disabling eager_load in production.rb?
我的 rails 4.1 应用程序通过 SSH 连接到第二个非主服务器以进行后端作业。因此,当 rails 应用程序每天重新启动时,SSH 连接需要 live/up(而不是第二个非主服务器需要 live/up),否则应用程序会崩溃。这是因为在 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
disable_dependency_loading 如果 config.eager_load 设置为 true,则禁用自动依赖加载。
有关详细信息,请查看此博客 -
http://blog.arkency.com/2014/11/dont-forget-about-eager-load-when-extending-autoload/
设置 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 仍然可以找到这些文件,但不会在生产环境中急切加载它们。
我的 rails 4.1 应用程序通过 SSH 连接到第二个非主服务器以进行后端作业。因此,当 rails 应用程序每天重新启动时,SSH 连接需要 live/up(而不是第二个非主服务器需要 live/up),否则应用程序会崩溃。这是因为在 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
disable_dependency_loading 如果 config.eager_load 设置为 true,则禁用自动依赖加载。
有关详细信息,请查看此博客 - http://blog.arkency.com/2014/11/dont-forget-about-eager-load-when-extending-autoload/
设置 eager_load=false
可能会 加速 您的应用程序的启动,因为加载将延迟到必要时。
但是,代价是您的应用可能会使用更多内存(这通常是最稀缺的服务器资源)。我怀疑如果你使用带 eager_load=false
.
由于 Rails 自动将所有 app/*
目录包含在其预加载路径中,我想不出一种简单的方法来在预加载其他所有内容时排除 app/models/legacy
。
相反,您可以将 app/models/legacy
的内容移动到例如legacy/
在项目的根目录下,并将其添加到 autoload_paths
:
config.autoload_paths += %W( #{config.root}/legacy )
现在 Rails 仍然可以找到这些文件,但不会在生产环境中急切加载它们。