2010-08-17 3 views
18

업데이트 2 이것은 Ruby 1.9.2가 파일을로드하는 방법에 대한 알려진 버그/기능입니다.레일 3 앱 서버 시작 시간이 길다

갱신 http://twitter.com/#!/rails/status/72801149769621504 :이 질문으로 시작하지만, 조금이 작업 후 나는 그것을 고칠 수 없을 것 같아요. 나는 누군가가 똑같은 것을보고 레일과 번들러 내부에서 무슨 일이 일어나고 있는지 궁금해 할 때 이것을 게시 할 것이라고 생각했다.

레일스 3 앱에서로드 시간이 오래 걸리는 사람이 있습니까? environment.rb, application.rb, boot.rb 및 railties/lib/rails/initializable.rb에 타이머를 두었습니다. 시간은 초 단위로 측정되고 경과 시간은 마지막으로 기록 된 시간 이후의 시간입니다. 생산로드 시간은 조금 더 오래 걸립니다. 부분적으로 하드웨어가 적기 때문에 eager_load! (그리고 아마도 Thin vs Mongrel로부터). Bundler가로드 시간의 큰 부분을 차지하고있는 것처럼 보입니다. 예상했던 것 같습니다. dev에있는 앱 중 하나를 테스트하고 dev에 하나의 빈 앱을 테스트했습니다. 필자는 단지 2 개의 app 서버를 테스트하여 그것이 Thin이라는 것을 알았습니다. 나는 또한 여객과 비슷한 것을보고있다 (2.2.15에서 산란 행동의 b/c를 사용할 수 없게 만든다). 나는 edge Rails에 대해 테스트했고 dev에서의 성능은 14.5s와 14.2s에서 약간 더 나빴다. 테스트 종속성을 제거하면 2-3 초가 절약되지만 테스트를 실행할 때 도움이되지 않습니다. 내 모든 Thin 인스턴스가 다시 시작되고 테스트가 실행되기까지 15 초를 기다리는 것이 약간 짜증나는 것 같지만 레일스 3에서 얻을 수있는 생산성 때문에이 시점에서 받아 들일 수있는 절충안입니다. 아이디어를 빠르게하는 데 도움이되는, 나는 모든 귀입니다.

참고 : 다음은 테스트 결과는 내 나는 엔진에 코드의 약간을 변환 HAML을 추가하고 있지만 (DEV에서 3 초 미만에로드 레일 2.3 응용 프로그램과로의 이동 이후 twitter_oauth 보석 rails3)

** 레일 3RC와 루비 얇은와 1.9.2rc2

생산성과 수행 모든 테스트 -에 CentOS 5.5, 랙 스페이스 클라우드 서버 기가 바이트 예를
테스트 앱 # 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 

데브 잡종과 - 최대 OSX 10.5.8, 2.66 Core2duo 4GB의 RAM
테스트 앱은 24 보석과 # 1

 
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 

데브 잡종과 종속성 테스트 앱 # 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> = 1.9로하면 속도가 빨라질 것입니다. –

+1

Ruby 1.9.2를 사용하고 있습니다. 성능은 보석을로드 한 결과이며 레일 프레임 워크의 모듈성에서 비롯된 것입니다. 의존성이 많을수록 앱을 시작하는 데 더 많은 시간이 걸릴 것입니다. 핵심 팀이이를 가속 화하기 위해 할 수있는 일은 많지 않을 것이라고 생각합니다. 적어도 단기적으로는 아닙니다. – johnmcaliley

+0

Rails 2가 그렇게 모듈 방식으로 부팅되지 않는 이유가 궁금합니다. 그렇다면 질문은 다음과 같습니다. 왜 모든 개발자가 종속물을로드하는 데 오랜 시간이 걸릴까요? 그것들을 해결합니까 아니면 그냥 맹목적으로 그들을로드합니까? 나는 우리가 번들의 모든 현명함을 불가능하게 할 수 있고, 단지 '의존성'을로드하는 것이 그것이 일을 빠르게 할 것이라고 생각한다 ... –

답변

2

이것은 상당히 오래된 질문이므로 다음과 같이 검토하십시오. 릴리스 버전 R ails 3?

오랜 시간이지만 궁극적으로 의미가 없습니다. 내 레일 앱은 한 번에 몇 달 동안 계속 머물러있어 전체 런타임의 1 %에 훨씬 못 미친다.

번들러가 처리해야하는 많은 의존성이 있습니까? 어느 환경에서든 2 초 내에 Rails 3 앱을 시작할 수는 있지만 타사 보석은 거의 사용하지 않습니다.

+0

지금 레일즈 3 공식 릴리스를 사용하고 있습니다. 벤치 마크를 다시 실행하지는 않았지만 부팅 시간이 현저히 개선되지 않았습니다. 예, 내 응용 프로그램은 많은 의존성을 가지고 있으며, 빈 Rails 3 응용 프로그램이 벤치 마크에서 내 서버에서 약 3 초 만에 부팅된다는 것을 알 수 있습니다. 승객을 사용하고 프로세스가 생성되기를 기다리려고 할 때 이것은 귀찮았습니다. 적어도 일주일에 몇 번씩 변경 사항을 배포하고 시스템에 수백 명의 사용자가 있기 때문에 30 초의 대기 또는 다운 타임이 문제입니다. 나는 Thin으로 전환하고 롤링 재시작을 사용 했으므로 이후에는 문제가되지 않습니다. – johnmcaliley

+0

또한 Passenger 3 베타에서는 zero-downtime restarts와 새로운 스폰 아키텍처로 더 이상 문제가되지 않습니다. 그래서 당신 말이 맞아요 ... 이것은 궁극적으로 무의미합니다. 아마도 테스팅을 제외하고 (당신이 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에서 나머지 12 개의 레일, 나머지 모든 레일 3 프로젝트로드 20 초에서 30 초 걸립니다, 그것은 아주 우울한 때 누군가가 자신의 레일 애플 리케이션을 3 초 안에로드 screencast를 볼 때, 나는 레일 3로 마이 그 레이션 이후로 내 머리카락을 당긴 이후 내 환경이라고 생각합니다.

+0

종속성이없고 최고 수준의 하드웨어에서 실행중인 경우 3 초가 걸릴 수 있습니다. 나는 아직도 의존성을 포함하는 모든 앱에 대해 10 초 미만을 보지 못했다. – johnmcaliley