2010-08-17 18 views
18

UPDATE 2 Jest to znany błąd/funkcja ze sposobem, w jaki Ruby 1.9.2 ładuje pliki. http://twitter.com/#!/rails/status/72801149769621504Rails 3 czas uruchamiania serwera aplikacji jest długi

zmiana: To zaczęło się od pytania, ale po pracy nad tym przez chwilę myślę, że to może nie być naprawić. Pomyślałem, że zamieściłbym to na wypadek, gdyby ktokolwiek widział to samo i zastanawia się, co dzieje się wewnątrz szyn i bundlerów.

Czy ktoś jeszcze widzi długi czas ładowania w swoich aplikacjach Rails 3? Umieściłem timery w environment.rb, application.rb, boot.rb i railties/lib/rails/initializable.rb. Czas jest mierzony w sekundach, a upływający czas jest czasem od ostatniego zarejestrowanego czasu. Czas ładowania produkcji trwa nieco dłużej. Częściowo z powodu mniejszej ilości sprzętu, a także z eager_load! (i może od Thin vs Mongrel). Wygląda na to, że Bundler zajmuje dużą część czasu ładowania i myślę, że tego można się spodziewać. Przetestowałem jedną z aplikacji w dev i prod oraz jedną pustą aplikację w dev. Przetestowałem 2 serwery aplikacji, aby sprawdzić, czy to powodowało Thin Thin. Widzę również podobne rzeczy z Pasażerami w prod (co sprawia, że ​​nie nadaje się do użycia b/c zachowania odradzania w 2.2.15). Testowałem przeciwko Edge Rails, a wydajność w dev była nieco gorsza 14,5 s vs 14,2 s. Jeśli usunę swoje zależności testowe, zapisuje się 2-3 sekundy, ale to nie pomaga, gdy testuję. Sądzę, że to trochę denerwujące czekanie 5 minut na wszystkie moje cienkie instancje, aby ponownie uruchomić się i czekałem 15 sekund przed uruchomieniem testów, ale jest to do zaakceptowania kompromis w tym momencie z powodu wydajności, którą zyskuję dzięki Railsom 3. Jeśli ktokolwiek ma jakieś Pomysły, które pomogą przyspieszyć, ja jestem wszystkim. Oto wyniki badań:

Uwaga: moja aplikacja w Rails 2.3 załadowanych w mniej niż 3 sekundy w dev (chociaż mam konwertowane trochę kodu do silników i dodał haml i twitter_oauth perełki od przejścia do rails3)

** Wszystkie testy przeprowadzone z szynami 3RC i Ruby 1.9.2rc2

Prod cienkimi - CentOS 5.5, Rackspace cloud server instance 2GB
test App # 1 z 24 zależności gem

 
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 

Dev z Mongrela - max OS X 10.5.8, 2,66 Core2Duo, 4 GB RAM
aplikacji testowej 1 o 24 gem Zależności

 
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 

Dev z Mongrela aplikacji testowej 2 z 2 zależności gem:

 
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

Bardzo miło, że dzielisz się wynikami swojego eksperymentu. Nie jestem pewien, jakiej wersji Ruby używasz, ale domyślam się, że Ruby> = 1.9 przyspieszy działanie. –

+1

Używam Ruby 1.9.2. Wydajność wynika z ładowania klejnotów i właśnie z modułowości szkieletu. Im więcej masz zależności, tym więcej czasu zajmie uruchomienie aplikacji, co ma sens. Wątpię, by zespół podstawowy mógł zrobić, żeby przyspieszyć ... przynajmniej na krótką metę. – johnmcaliley

+0

Zastanawiam się, dlaczego Rails 2 bez tak modularnego podejścia uruchamia się o wiele szybciej ... Wtedy może powinno być pytanie: dlaczego tak długo trwa ładowanie wszystkich zależności? Czy to rozwiązuje lub po prostu ślepo je ładuje? Sądzę, że gdybyśmy mogli wyłączyć wszystkie sprytne pakiety i "po prostu wczytać" zależności, to przyspieszyłoby to ... –

Odpowiedz

2

Ponieważ jest to dość stare pytanie: czy przetestowałeś je w wersji Release R ails 3?

To długo, ale ostatecznie bez znaczenia. Moje aplikacje rails pozostają całe miesiące, więc jest to ułamek procenta z 1 procenta całkowitego czasu pracy.

Czy masz mnóstwo zależności, z którymi musi się zmierzyć Bundler? Mogę uruchomić aplikację Rails 3 w mniej niż 2 sekundy w każdym środowisku, ale używam bardzo niewielu klejnotów stron trzecich.

+0

Używam teraz oficjalnego wydania Rails 3. Chociaż nie uruchomiłem ponownie testów porównawczych, czas rozruchu nie został zauważalnie poprawiony. Tak, moja aplikacja ma wiele zależności i możesz zauważyć, że pusta aplikacja Rails 3 uruchamia się w ciągu około 3 sekund na moich serwerach w testach porównawczych. To była irytacja, gdy próbowałem korzystać z Pasażera i czekałem, aż procesy się odrodzą. Wprowadzam zmiany co najmniej kilka razy w tygodniu i setki użytkowników w moim systemie, 30 sekund oczekiwania lub przestój to problem. Przełączyłem się na Thina i korzystałem z toczących się ponownych uruchomień, więc nie było to już problemem. – johnmcaliley

+0

Również w wersji beta programu Passenger 3 nie jest to już problemem przy ponownym uruchomieniu bez przestojów i nowej architekturze odradzania. Więc masz rację ... to ostatecznie nie ma znaczenia, poza może testowaniem (jeśli nie używasz czegoś takiego jak spork). – johnmcaliley

+0

to nadal istnieje ... ale problem jest w trakcie opracowywania, a także zajmuje dużo czasu, co jest frustrujące. – rtdp

2

Bundler często spędza ponad połowę swojego czasu, potrzebując klejnotów. Czy którakolwiek z pobieranych zależności jest niepotrzebna w trybie deweloperskim/testowym?Na przykład niektóre z moich klejnotów są używane tylko przez pracowników resque lub w innych skryptach. Możesz dodać :require => false, a następnie ręcznie wymagać ich, gdy ich potrzebujesz, aby uzyskać niewielkie przyspieszenie rozruchu w trybie deweloperskim/testowym.

Zanim to zrobię, zazwyczaj profiluję instrukcje require (w lib/bundler/runtime.rb), aby sprawdzić, czy rzeczywiście warto je usunąć.

+0

Właściwie mam więcej klejnotów w dev/teście .. mongrel, cuke, rspec, itp; ;-) Zgadzam się, że to jest dobre ćwiczenie. Zdecydowanie można zaoszczędzić kilka sekund, jeśli przyjrzysz się uważnie i upewnisz się, że rzeczywiście używasz wszystkiego w gemfile. – johnmcaliley

0

Mam 3 szyny 3 aplikacje i migruję z 2.3.8, ta na szynach 2.3.8 ładuje się w 4 sekundy, a gałąź, która jest w połowie w szynach 3, zajmuje 12 sekund, wszystkie pozostałe szyny 3 projekty zajmują od 20 do 30 sekund, aby załadować, jest bardzo przygnębiające, gdy widzę screencast, w którym ktoś ładuje swoją aplikację szyny w 3 sekundy, odciągnąłem moje włosy od czasu migracji do szyn 3 myśląc, że to moje środowisko.

+0

może 3 sekundy, jeśli nie masz zależności i pracujesz na najwyższym poziomie sprzętu. Wciąż nie widziałem mniej niż 10 sekund dla aplikacji, które zawierają zależności. – johnmcaliley

Powiązane problemy