Улучшите время запуска медленных 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)! Вы также можете проверить приложение для них.
Ответ 3
Для приложений ruby 2, попробуйте zeus - https://github.com/burke/zeus
1,8 приложения, похоже, загружаются намного быстрее, чем 1,9, spork может помочь? http://railscasts.com/episodes/285-spork