Время запуска сервера приложений Rails 3 велико

#ruby-on-rails #ruby-on-rails-3 #bundler

#ruby-on-rails #ruby-on-rails-3 #пакет

Вопрос:

ОБНОВЛЕНИЕ 2 Это известная ошибка / особенность способа загрузки файлов Ruby 1.9.2. http://twitter.com /#!/рельсы/статус/72801149769621504

обновление: Это началось как вопрос, но после небольшой работы над этим я думаю, что это может быть не исправимо. Я решил опубликовать это на случай, если кто-то еще видит то же самое и задается вопросом, что происходит внутри rails и bundler.

Кто-нибудь еще видит длительное время загрузки в своих приложениях Rails 3? Я разместил таймеры в environment.rb, application.rb, boot.rb и raildies/lib/rails/initializable.rb. Время измеряется в секундах, а прошедшее время — это время с момента последней записи. Время загрузки в производство занимает немного больше времени. Частично из-за меньшего количества оборудования, а также из-за eager_load! (и, возможно, из-за Thin vs Mongrel). Похоже, что Bundler занимает большую часть времени загрузки, и я думаю, этого следовало ожидать. Я протестировал одно из приложений в dev и prod и одно пустое приложение в dev. Я протестировал 2 сервера приложений, просто чтобы посмотреть, не было ли это тонкой причиной. Я также вижу похожие вещи с Passenger в prod (что делает его непригодным для использования из-за поведения при создании в 2.2.15). Я тестировал на edge Rails, и производительность в dev была немного хуже — 14,5 с против 14,2 с. Если я удалю свои тестовые зависимости, это сэкономит 2-3 секунды, но это не помогает при запуске тестов. Я думаю, это просто немного раздражает, ждать 5 минут, пока все мои тонкие экземпляры перезапустятся, а также ждать 15 секунд до запуска моих тестов, но на данный момент это приемлемый компромисс из-за производительности, которую я получаю с Rails 3. Если у кого-нибудь есть идеи, как ускорить процесс, я весь внимание. Вот результаты теста:

Примечание: мое приложение в Rails 2.3 загружается в dev менее чем за 3 секунды (хотя я немного переделал код для движков и добавил драгоценные камни haml и twitter_oauth с момента перехода на rails3).

** Все тесты проводились с Rails 3RC и Ruby 1.9.2rc2

Работает с тонкой CentOS 5.5, экземпляр облачного сервера Rackspace объемом 2 ГБ
Протестируйте приложение № 1 с 24 зависимостями gem

запустите env.rb - Всего=0 
 прошло время запуска app.rb - 0.00110546. Итого = 0.001180052 
 прошло время запуска boot.rb - 0.000600488. Итого = 0.00178644 
 завершите загрузку.rb - 0.7935529 истекло. Итого = 0,795507318 
 для запуска требуется rails / all - прошло 0,000189127. Итого = 0,795701199 
 для завершения требуется rails / all - прошло 1.086998364. Итого = 1,882735263 
 требуется запуск Bundler - прошло 0,000109708. Итого = 1,88285043 
 требуется завершение пакета - 8.955853243 истекло. Итого = 10.838746673 
 по истечении времени завершения app.rb - 0.062975913. Итого = 10.901753753 
 # /railties-3.0.0.rc/lib/rails/initializable.rb 
 запуск инициализаторов запуска - прошло 0,000145906. Итого = 10.901910186 
 истекло load_environment_config - 0.116689774. Итого = 11.018632298 
 прошло initialize_cache - 0.246161343. Итого = 11.320543397 
 прошла active_record.initialize_database - 0.080047485. Итого = 11.400961893 
 bootstrap_hook - истекло 1.034189984. Итого = 12.451309104 
 истекло active_support.initialize_time_zone - 1.969821814. Итого = 14.448777651 
 action_controller.set_configs - истекло 0,594991537. Итого = 15.044692126 
 истекло will_paginate.active_record - 0.324460921. Итого = 15.386837641 
 will_paginate.action_view - прошло 1.904889132. Итого = 17.328981523 
 прошло add_view_paths - 0.087811847. Итого = 17.42011881 
 истекло load_init_rb - 0.151282681. Итого = 17.709093173 
 load_init_rb - истекло 0,362241273. Итого =18.071865548 
 load_config_initializers - истекло 0.144051305. Итого = 18.217433492 
 build_middleware_stack - истекло 2.569453884 build_middleware_stack. Итого = 20.826842081 
 eager_load! - 4.165919064 истекло. Итого = 24.99280168 
 истекло finisher_hook - 0,48795935. Итого = 25.480807439 
 repopulate_roles - прошло 0,504085662. Итого = 25,984901297 
 инициализаторы конечного запуска - прошло ~ 0.00005. Итого = 25.985617783 
end env.rb - прошло ~ 0.00006. Итого = 25.985683903 

Разработчик с Mongrel — Max OSX 10.5.8, 2.66 Core2duo, 4 ГБ оперативной памяти
Протестируйте приложение № 1 с 24 зависимостями gem

запустите boot.rb (Bundler.setup) - прошло 2.0e-05. Итого= 3,1e-05 
завершить загрузку.rb (Bundler.setup) - прошло 2.352435. Итого = 2.352915 
прошло время запуска app.rb - 0.084945. Итого = 2.437866 
 для запуска требуется rails / all - прошло 0,000181. Итого = 2.438049 
 для завершения требуется rails / all - прошло 0,489425. Итого = 2.927485 
 запустите Bundler.require(: по умолчанию Rails.env) - прошло 5.6e-05. Итого = 2.927544 
 end Bundler.require(:по умолчанию Rails.env) - прошло 5.16162. Итого = 8.089177 
по истечении времени завершения app.rb - 0.025972. Итого = 8.11516 
прошло время запуска env.rb - 0.084153. Итого = 8.199329 
 # /railties-3.0.0.rc/lib/rails/initializable.rb 
 запустить run_initializers - прошло 0,002709. Итого = 8.202042 
 прошло initialize_cache - 0.089231. Итого = 8,518005 
 bootstrap_hook - истекло 0,602342. Итого = 9.192564 
 active_support.initialize_time_zone - истекло 0,901676 active_support.initialize_time_zone. Итого = 10.10115 
 action_controller.set_configs - прошло 0,375864. Итого = 10.477565 
 истекло will_paginate.active_record - 0.207447. Итого = 10.694479 
 will_paginate.action_view - 1.041412 истекло. Итого = 11.75974 
 load_init_rb - прошло 0,051938. Итого=11.879547 
 прошло load_init_rb - 0.082936. Итого=12.001311 
 load_init_rb - истекло 0.18798. Итого=12,189555 
 load_config_initializers - прошло 0,079461. Итого = 12,269971 
 build_middleware_stack - истекло 1.390042. Итого=13.729273 
 finisher_hook - прошло 0,082274. Итого=13.811648 
 repopulate_roles - прошло 0,350287. Итого=14.161941 
 завершение run_initializers - прошло 3.0e-06. Итого = 14.177869 
истекло env env.rb - 0.000127. Итого=14.178002 

Разработчик с Mongrel Тестирует приложение # 2 с 2 зависимостями от gem

запустите boot.rb (Bundler.setup) - Всего =0 
завершить загрузку.rb (Bundler.setup) - прошло 1.724158. Итого = 1.724199 
прошло время запуска app.rb - 0.041006. Итого = 1.765211 
 для запуска требуется rails - прошло 0,000151. Итого = 1,765364 
 для завершения требуется rails - прошло 0,360051. Итого = 2.125426 
 запустите Bundler.require(: по умолчанию Rails.env) - прошло 5.5e-05. Итого = 2.125485 
 end Bundler.require(:по умолчанию Rails.env) - прошло 0,008396. Итого = 2,133889 
истекло время завершения app.rb - 0.007805. Итого = 2.141704 
прошло время запуска env.rb - 0.16541. Итого = 2.307128 
 запустите run_initializers - прошло 0,00031. Итого = 2.307442
 load_active_support - истекло 0.24045. Итого = 2.579421 
 истекло active_support.initialize_time_zone - 0.206237. Итого = 2.837663 
 action_controller.deprecated_routes - истекло 0.210291. Итого = 3,048634
 build_middleware_stack - истекло 0.220663. Итого = 3,273035 
 истекло время завершения run_initializers - 3.0e-06. Итого = 3,29339 
истекло env.rb - 8.7e-05. Итого = 3,293483

Комментарии:

1. С вашей стороны очень любезно поделиться результатами вашего эксперимента. Я не уверен, какую версию Ruby вы используете, но я предполагаю, что Ruby >= 1.9 немного ускорит процесс.

2. Я использую Ruby 1.9.2. Производительность зависит от загрузки gems и просто от модульности фреймворка rails. Чем больше у вас зависимостей, тем больше времени потребуется для запуска вашего приложения, что имеет смысл. Я сомневаюсь, что основная команда может многое сделать, чтобы ускорить это … по крайней мере, не в краткосрочной перспективе.

3. Мне интересно, почему Rails 2 без модульного подхода загружается намного быстрее… Тогда, возможно, следует задать вопрос: почему сборщику требуется так много времени для загрузки всех зависимостей? Разрешает ли это их или просто загружает вслепую? Я думаю, если бы мы могли отключить все интеллектуальные возможности bundle и «просто загрузить» зависимости, это ускорило бы процесс…

4. Я почти уверен, что проблема не в решении. Кодовая база Rails 2, вероятно, немного меньше, чем 3. Они добавили дополнительные уровни абстракции, такие как active model, чтобы сделать фреймворк более модульным. Больше кода = более длительная загрузка. Когда вы «устанавливаете пакет», он разрешает и устанавливает gems локально, а bundler просто загружает их в вашу среду при загрузке. На самом деле у меня было не так много времени, чтобы разобраться в этом подробнее, но я опубликую еще один комментарий, как только у меня появится возможность продолжить отладку

5. как вам удалось подключить некоторый код для измерения времени загрузки чего-либо? Вы только что переопределили require(), а затем вызвали super?

Ответ №1:

Поскольку это довольно старый вопрос: вы тестировали его с выпускной версией Rails 3?

Это долгое время, но в конечном счете бессмысленно. Мои приложения rails работают месяцами, так что это всего лишь 1 процент от общего времени выполнения.

У вас есть куча зависимостей, с которыми приходится иметь дело Bundler? Я могу запустить свое приложение Rails 3 менее чем за 2 секунды в любой среде, но я использую очень мало сторонних gems.

Комментарии:

1. Сейчас я использую официальную версию Rails 3. Хотя я больше не запускал тесты, время загрузки заметно не улучшилось. Да, у моего приложения много зависимостей, и вы можете видеть, что пустое приложение Rails 3 загружается примерно за 3 секунды на моих серверах в тестах. Это раздражало, когда я пытался использовать Passenger и ждал запуска процессов. Я внедряю изменения по крайней мере несколько раз в неделю, и с сотнями пользователей в моей системе 30 секунд ожидания или простоя являются проблемой. Я переключился на Thin и использовал rolling restarts, так что после этого это действительно не было проблемой.

2. Кроме того, в бета-версии Passenger 3 это больше не проблема благодаря перезапускам с нулевым временем простоя и новой создаваемой архитектуре. Итак, вы правы … это в конечном счете бессмысленно, кроме, возможно, тестирования (если вы не используете что-то вроде spork).

3. это все еще существует .. но проблема находится в разработке, и это занимает много времени, что расстраивает.

Ответ №2:

Bundler часто тратит более половины своего времени на поиск gems. Являются ли какие-либо из зависимостей, которые вы загружаете, ненужными в режиме разработки / тестирования? Например, некоторые из моих драгоценных камней используются только resque workers или в других сценариях. Вы можете добавлять :require => false , а затем вручную запрашивать их, когда они вам понадобятся, для некоторого увеличения скорости запуска в режиме разработки / тестирования.

Перед этим я обычно профилирую инструкции require (в lib / bundler /runtime.rb), чтобы посмотреть, действительно ли их стоит удалить.

Комментарии:

1. На самом деле у меня больше драгоценных камней в dev / test .. mongrel, cuke, rspec и т.д. 😉 Я согласен, что это хорошее упражнение, хотя. Это определенно может сэкономить вам несколько секунд, если вы внимательно посмотрите и убедитесь, что действительно используете все, что есть в gemfile.

Ответ №3:

У меня есть 3 приложения rails 3, и я переношу одно из 2.3.8, одно из rails 2.3.8 загружается за 4 секунды, а ветка, которая находится на полпути в rails 3, занимает 12 секунд, загрузка всех остальных проектов rails 3 занимает от 20 до 30 секунд, это очень удручает, когда я вижу скринкаст, где кто-то загружает свое приложение rails за 3 секунды, я дергаю себя за волосы с тех пор, как перешел на rails 3, думая, что это моя среда.

Комментарии:

1. возможно, 3 секунды, если у вас нет зависимостей и вы работаете на первоклассном оборудовании. Я все еще не видел менее 10 секунд для любых приложений, содержащих зависимости.