Какое влияние на производительность приводит к отключению eager_load в production.rb?
My rails 4.1 приложение подключается ко второму, не первичному серверу через SSH для работы с бэкэнд. Следовательно, когда приложение rails перезапускается ежедневно, SSH-соединение должно быть в режиме реального времени (скорее, второй, не первичный сервер должен жить/вверх), в противном случае приложение выйдет из строя. Это связано с тем, что при загрузке по умолчанию задано значение true в production.rb
(config.eager_load = 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
Ответы
Ответ 1
Настройка eager_load=false
, вероятно, ускорит запуск вашего приложения, так как загрузка будет отложена до тех пор, пока не будет необходимости.
Однако, штраф в том, что ваше приложение, скорее всего, будет использовать больше памяти (как правило, это самый скудный серверный ресурс). Я подозреваю, что вы также можете столкнуться с чередованием ошибок, если вы используете многопоточный сервер (например, puma) с eager_load=false
.
Так как Rails автоматически включает в себя все каталоги app/*
в своих нетерминальных путях загрузки, я не могу придумать простой способ исключить app/models/legacy
при загрузке всего остального.
Вместо этого вы можете перемещать содержимое app/models/legacy
, например. legacy/
в корне вашего проекта и добавьте это к autoload_paths
:
config.autoload_paths += %W( #{config.root}/legacy )
Теперь Rails все равно сможет найти эти файлы, но они не будут загружаться в процессе работы.
Ответ 2
disable_dependency_loading Отключает загрузку автоматической зависимости, если для параметра config.eager_load установлено значение true.
для подробной информации, пожалуйста, посмотрите в этом блоге -
http://blog.arkency.com/2014/11/dont-forget-about-eager-load-when-extending-autoload/