Какое влияние на производительность приводит к отключению 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/