2010-08-17 2 views
18

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

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

Кто-нибудь еще видит длительные нагрузки в своих Rails 3 приложениях? Я разместил таймеры в файлах environment.rb, application.rb, boot.rb и railties/lib/rails/initializable.rb. Время измеряется в секундах, и прошедшее время - это время с момента последнего записанного времени. Время загрузки продукции занимает немного больше времени. Отчасти из-за меньшего количества аппаратных средств, а также от eager_load! (и, возможно, от Тонкого против Монгреля). Похоже, Bundler занимает большую часть времени загрузки, и я предполагаю, что этого следовало ожидать. Я тестировал одно из приложений в dev и prod, и одно пустое приложение в dev. Я протестировал 2 сервера приложений, чтобы проверить, не вызвало ли это Thin. Я также вижу похожие вещи с Пассажиром в prod (что делает его непригодным b/c нерестного поведения в 2.2.15). Я протестировал против ребер Rails, а производительность в dev была немного хуже 14.5s против 14.2s. Если я удалю свои тестовые зависимости, он сэкономит 2-3 секунды, но это не помогает, когда я запускаю тесты. Я предполагаю, что это всего лишь немного раздражает, ожидая 5 минут, чтобы все мои тонкие экземпляры перезагрузились, а также подождите 15 секунд до запуска моих тестов, но это приемлемый компромисс на данный момент из-за производительности, которую я получаю с Rails 3. Если у кого-то есть идеи, чтобы помочь ускорить процесс, я все уши. Вот результаты теста:

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

** Все тесты, проведенные с Rails 3RC и Руби 1.9.2rc2

Prod с Thin - CentOS 5.5, Rackspace облако сервер 2GB экземпляр
Test App # 1 с 24 зависимости гем

 
start env.rb - Total=0 
    start app.rb - 0.00110546 elapsed. Total=0.001180052 
    start boot.rb - 0.000600488 elapsed. Total=0.00178644  
    end boot.rb - 0.7935529 elapsed. Total=0.795507318 
    start require rails/all - 0.000189127 elapsed. Total=0.795701199 
    end require rails/all - 1.086998364 elapsed. Total=1.882735263 
    start Bundler require - 0.000109708 elapsed. Total=1.88285043 
    end Bundler require - 8.955853243 elapsed. Total=10.838746673 
    end app.rb - 0.062975913 elapsed. Total=10.901753753 
    # /railties-3.0.0.rc/lib/rails/initializable.rb 
    start run initializers - 0.000145906 elapsed. Total=10.901910186 
    load_environment_config - 0.116689774 elapsed. Total=11.018632298 
    initialize_cache - 0.246161343 elapsed. Total=11.320543397 
    active_record.initialize_database - 0.080047485 elapsed. Total=11.400961893 
    bootstrap_hook - 1.034189984 elapsed. Total=12.451309104 
    active_support.initialize_time_zone - 1.969821814 elapsed. Total=14.448777651 
    action_controller.set_configs - 0.594991537 elapsed. Total=15.044692126 
    will_paginate.active_record - 0.324460921 elapsed. Total=15.386837641 
    will_paginate.action_view - 1.904889132 elapsed. Total=17.328981523 
    add_view_paths - 0.087811847 elapsed. Total=17.42011881 
    load_init_rb - 0.151282681 elapsed. Total=17.709093173 
    load_init_rb - 0.362241273 elapsed. Total=18.071865548 
    load_config_initializers - 0.144051305 elapsed. Total=18.217433492 
    build_middleware_stack - 2.569453884 elapsed. Total=20.826842081 
    eager_load! - 4.165919064 elapsed. Total=24.99280168 
    finisher_hook - 0.48795935 elapsed. Total=25.480807439 
    repopulate_roles - 0.504085662 elapsed. Total=25.984901297 
    end run initializers - ~0.00005 elapsed. Total=25.985617783 
end env.rb - ~0.00006 elapsed. Total=25.985683903 

Дев с Mongrel - Макс OSX 10.5.8, 2,66 Core2Duo, 4 Гб RAM
Test App # 1 с 24 драгоценный камень зависимостей

 
start boot.rb (Bundler.setup) - 2.0e-05 elapsed. Total=3.1e-05 
end boot.rb (Bundler.setup) - 2.352435 elapsed. Total=2.352915 
start app.rb - 0.084945 elapsed. Total=2.437866 
    start require rails/all - 0.000181 elapsed. Total=2.438049 
    end require rails/all - 0.489425 elapsed. Total=2.927485 
    start Bundler.require(:default, Rails.env) - 5.6e-05 elapsed. Total=2.927544 
    end Bundler.require(:default, Rails.env) - 5.16162 elapsed. Total=8.089177 
end app.rb - 0.025972 elapsed. Total=8.11516 
start env.rb - 0.084153 elapsed. Total=8.199329 
    # /railties-3.0.0.rc/lib/rails/initializable.rb 
    start run_initializers - 0.002709 elapsed. Total=8.202042 
    initialize_cache - 0.089231 elapsed. Total=8.518005 
    bootstrap_hook - 0.602342 elapsed. Total=9.192564 
    active_support.initialize_time_zone - 0.901676 elapsed. Total=10.10115 
    action_controller.set_configs - 0.375864 elapsed. Total=10.477565 
    will_paginate.active_record - 0.207447 elapsed. Total=10.694479 
    will_paginate.action_view - 1.041412 elapsed. Total=11.75974 
    load_init_rb - 0.051938 elapsed. Total=11.879547 
    load_init_rb - 0.082936 elapsed. Total=12.001311 
    load_init_rb - 0.18798 elapsed. Total=12.189555 
    load_config_initializers - 0.079461 elapsed. Total=12.269971 
    build_middleware_stack - 1.390042 elapsed. Total=13.729273 
    finisher_hook - 0.082274 elapsed. Total=13.811648 
    repopulate_roles - 0.350287 elapsed. Total=14.161941 
    end run_initializers - 3.0e-06 elapsed. Total=14.177869 
end env.rb - 0.000127 elapsed. Total=14.178002 

Дев с Mongrel Test App # 2 с 2 зависимости от драгоценных камней

 
start boot.rb (Bundler.setup) - Total=0 
end boot.rb (Bundler.setup) - 1.724158 elapsed. Total=1.724199 
start app.rb - 0.041006 elapsed. Total=1.765211 
    start require rails - 0.000151 elapsed. Total=1.765364 
    end require rails - 0.360051 elapsed. Total=2.125426 
    start Bundler.require(:default, Rails.env) - 5.5e-05 elapsed. Total=2.125485 
    end Bundler.require(:default, Rails.env) - 0.008396 elapsed. Total=2.133889 
end app.rb - 0.007805 elapsed. Total=2.141704 
start env.rb - 0.16541 elapsed. Total=2.307128 
    start run_initializers - 0.00031 elapsed. Total=2.307442 
    load_active_support - 0.24045 elapsed. Total=2.579421 
    active_support.initialize_time_zone - 0.206237 elapsed. Total=2.837663 
    action_controller.deprecated_routes - 0.210291 elapsed. Total=3.048634 
    build_middleware_stack - 0.220663 elapsed. Total=3.273035 
    end run_initializers - 3.0e-06 elapsed. Total=3.29339 
end env.rb - 8.7e-05 elapsed. Total=3.293483 
+0

Очень любезно, что вы можете поделиться результатами своего эксперимента. Я не уверен, какую версию Ruby вы используете, но я думаю, что Ruby> = 1.9 немного ускорит работу. –

+1

Я использую Ruby 1.9.2. Производительность - результат загрузки драгоценных камней и только из модульности структуры рельсов. Чем больше зависимостей у вас есть, тем больше времени потребуется для запуска вашего приложения, что имеет смысл. Я сомневаюсь, что основная команда может сделать это, чтобы ускорить это ... по крайней мере, не в краткосрочной перспективе. – johnmcaliley

+0

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

ответ

2

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

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

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

+0

Я использую официальную версию Rails 3 сейчас. Хотя я еще не запускал тесты, время загрузки заметно улучшилось. Да, мое приложение имеет множество зависимостей, и вы можете видеть, что пустые приложения Rails 3 загружаются примерно на 3 секунды на моих серверах в тестах. Это было досадой, когда я пытался использовать «Пассажир» и ожидал появления процессов. Я развертываю изменения по крайней мере несколько раз в неделю и сотни пользователей в моей системе, 30 секунд ожидания или простоев - проблема. Я переключился на Thin и использовал повторные перезагрузки, так что это действительно не было проблемой после этого. – johnmcaliley

+0

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

+0

это все еще там .. но проблема в разработке тоже длится долго, что разочаровывает. – rtdp

2

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

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

+0

У меня на самом деле больше драгоценных камней в dev/test. Mongrel, cuke, rspec и т. Д .;;) Я согласен, что это хорошее упражнение. Это может сэкономить вам несколько секунд, если вы внимательно посмотрите и убедитесь, что используете на самом деле все в gemfile. – johnmcaliley

0

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

+0

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