Улучшите время запуска медленных Rails (консоль rails, сервер rails)

Я работаю с несколькими Rails-приложениями, некоторые из них - Rails 3.2/Ruby 2.0, а некоторые Rails 2.3/Ruby 1.8.7.

Что у них общего, так это то, что, поскольку они выросли и добавили больше зависимостей/драгоценных камней, им требуется больше времени и времени. Разработка, тестирование, производство, консоль, это не имеет значения; некоторые принимают 60 + секунд.

Каков предпочтительный способ для первого, профиль для того, что вызывает время загрузки, настолько медленное, и два, улучшить время загрузки?

Ответ 1

У Райана есть хорошая идея ускорить тесты, консоли, рейк-задачи: http://railscasts.com/episodes/412-fast-rails-commands?view=asciicast

Я проверил все методы там и нашел "spring" лучший. Просто запустите задачи, например

$ spring rspec 

Время для первого запуска spring будет таким же, как и раньше, но второе и более поздние будут намного быстрее.

Кроме того, по моему опыту, вам понадобится остановить сервер spring и перезагрузить его, если возникнет странная ошибка, но вероятность встречается редко.

Ответ 2

Есть несколько вещей, которые могут вызвать это.

  • Слишком много проходов GC и общих недостатков VM - см. этот ответ для подробного объяснения. Ruby < 2.0 имеет несколько очень медленных бит, которые могут значительно увеличить скорость загрузки; компиляция Ruby с патчами Falcon или railsexpress может в значительной степени помочь в этом. Все версии MRI Ruby используют настройки GC по умолчанию, которые не подходят для приложений Rails.
  • Много наследственных драгоценных камней, которые необходимо повторить для загрузки файлов. Если вы используете bundler, попробуйте bundle clean. Если вы используете RVM, вы можете попробовать создать новый gemset.

Что касается профилирования, вы можете использовать ruby-prof для определения того, что происходит при загрузке вашего приложения. Вы можете обернуть config/environment.rb в блок ruby-prof, а затем использовать его для создания отчетов профиля цикла загрузки с чем-то вроде rails r ''. Это поможет вам отследить, где вы тратите большую часть своего времени на загрузку. Вы можете также профилировать отдельные разделы, например, настройку связки в boot.rb или вызов #initialize! в environment.rb.

То, что вы, возможно, не рассматриваете, - это таймауты DNS. Если ваше приложение выполняет поиск DNS при загрузке, который не может быть разрешен, они могут заблокировать процесс в течение $timeout секунд (в некоторых случаях это может быть до 30)! Вы также можете проверить приложение для них.