Powolne początkowe uruchamianie serwera podczas korzystania z Phusion Passenger i Rails

87

Aby wskoczyć do wagonu Phusion Passenger, skonfigurowaliśmy serwer pomostowy dla małej aplikacji szynowej, aby przetestować różne rzeczy.

Jak dotąd jest bardzo przyjemny w użyciu, sprawia, że ​​instalowanie / konfigurowanie i wdrażanie aplikacji jest proste. Problem polega na tym, że witryna, której używamy, nie jest atakowana zbyt często i wydaje się, że wyłącza serwery w tle. Oznacza to, że kiedy ktoś odwiedza witrynę, musi naprawdę długo czekać, aż uruchomi nowy serwer, który obsłuży żądanie. Przeczytaliśmy dokumentację, wypróbowaliśmy kilka różnych konfiguracji (tryby smart / smart-lv2, czas pasażera itp.) I nadal nie znaleźliśmy prawdziwego rozwiązania.

Po przeczesaniu wyników Google nie możemy znaleźć przydatnych informacji. Obecnie mamy zadanie crona, które co jakiś czas wysyła żądania, próbując utrzymać działanie serwerów.

Czy ktoś jeszcze ma ten problem i czy masz jakieś rady dotyczące jego rozwiązania?

tsdbrown
źródło
Znalazłem również ten samorodek w witrynie Passenger Doc: modrails.com/documentation/ ...
dewrich
@dewrich Znalazłem narzędzie ( wekkars.com ), które robi dokładnie to, co robi twoja cronjob
SteenhouwerD

Odpowiedzi:

119

Dzieje się tak, że Twoja aplikacja i / lub ApplicationSpawners są zamykane z powodu przekroczenia limitu czasu. Aby przetworzyć Twoje nowe żądanie, Pasażer musi uruchomić nową kopię Twojej aplikacji, co może zająć kilka sekund, nawet na szybkim komputerze. Aby rozwiązać ten problem, istnieje kilka opcji konfiguracji Apache, których możesz użyć, aby utrzymać swoją aplikację przy życiu.

Oto szczegółowo, co zrobiłem na moich serwerach. PassengerSpawnMethod i PassengerMaxPreloaderIdleTime to opcje konfiguracyjne najważniejsze w Twojej sytuacji.

# Speeds up spawn time tremendously -- if your app is compatible. 
# RMagick seems to be incompatible with smart spawning
# Older versions of Passenger called this RailsSpawnMethod
PassengerSpawnMethod smart

# Keep the application instances alive longer. Default is 300 (seconds)
PassengerPoolIdleTime 1000

# Keep the spawners alive, which speeds up spawning a new Application
# listener after a period of inactivity at the expense of memory.
# Older versions of Passenger called this RailsAppSpawnerIdleTime
PassengerMaxPreloaderIdleTime 0

# Just in case you're leaking memory, restart a listener 
# after processing 5000 requests
PassengerMaxRequests 5000

Używając „inteligentnego” trybu odradzania i wyłączając PassengerMaxPreloaderIdleTime, Passenger będzie przechowywać 1 kopię Twojej aplikacji w pamięci przez cały czas (po pierwszym żądaniu po uruchomieniu Apache). Indywidualni Applicationsłuchacze będąforkZ tego egzemplarza , co jest operacją super tanią. Dzieje się to tak szybko, że nie można stwierdzić, czy Twoja aplikacja musiała odrodzić nasłuchiwanie.

Jeśli Twoja aplikacja jest niekompatybilna z inteligentnym spawningiem, zalecam utrzymywanie dużego PassengerPoolIdleTime i okresowe odwiedzanie witryny za pomocą curl i cronjob lub monit lub czegoś innego, aby zapewnić słuchaczowi życie.

Pasażer Podręcznik użytkownika jest niesamowite odniesienia dla tych i innych opcji konfiguracyjnych.

edycja : jeśli Twoja aplikacja jest niekompatybilna z inteligentnym spawnowaniem, jest kilka nowych opcji, które są bardzo przydatne

# Automatically hit your site when apache starts, so that you don't have to wait
# for the first request for passenger to "spin up" your application. This even
# helps when you have smart spawning enabled. 
PassengerPreStart http://myexample.com/
PassengerPreStart http://myexample2.com:3500/

# the minimum number of application instances that must be kept around whenever 
# the application is first accessed or after passenger cleans up idle instances
# With this option, 3 application instances will ALWAYS be available after the
# first request, even after passenger cleans up idle ones
PassengerMinInstances 3

Tak więc, jeśli połączysz PassengerPreStart i PassengerMinInstances, Passenger uruchomi 3 instancje natychmiast po załadowaniu apache i zawsze będzie utrzymywać co najmniej 3 instancje, więc Twoi użytkownicy rzadko (jeśli w ogóle) zobaczą opóźnienia.

Lub, jeśli używasz już inteligentnego spawningu (zalecane) PassengerMaxPreloaderIdleTime 0, możesz dodać, PassengerPreStartaby uzyskać dodatkową korzyść z natychmiastowego uruchomienia.

Wielkie dzięki dla bohaterów na phusion.nl !

John Douthat
źródło
Bardzo dziękuję za odpowiedź. Wydaje mi się, że wypróbowaliśmy większość tych ustawień, ale może nie we właściwej kombinacji. Jutro przejdę testy i wrócę.
tsdbrown
To jest niesamowite. Miałem ten sam problem z moją instalacją Nginx / Phusion Passenger i to bardzo mi pomogło.
Scott Anderson
Wypróbowałem tę konfigurację i nie widzę poprawy wydajności, ale nasza aplikacja korzysta z RMagick. Czy są jakieś obejścia tego problemu? Dlaczego nie działa z RMagick?
Chip Castle
1
RailsSpawnMethodjest przestarzały i PassengerSpawnMethod zastępuje modrails.com/documentation/ ...
paulus
1
Cześć, mam ten sam problem i chciałbym wypróbować tę konfigurację, ale nie wiem, gdzie należy umieścić tę konfigurację. dzięki!
joseramonc
41

Na wypadek gdyby jacyś użytkownicy serwera nginx natknęli się na to pytanie, zarówno dyrektywy „PassengerMaxRequests”, jak i „PassengerStatThrottleRate” nie są tłumaczone na nginx. Jednak inni to robią:

rails_spawn_method smart;
rails_app_spawner_idle_time 0;
rails_framework_spawner_idle_time 0;
passenger_pool_idle_time 1000;

HTH!

EDYCJA rails_spawn_methodjest przestarzała w pasażerze 3 zamiast używać

passenger_spawn_method smart; 

wszystko inne jest po prostu dobre do dnia dzisiejszego.

Gav
źródło
7
Dzięki za to. Jedną rzeczą wartą uwagi jest to, że musiałem upchnąć plik carrier_pool_idle_time w moim głównym pliku nginx.conf innymi ustawieniami globalnymi, a nie tylko w określonej konfiguracji witryny, w której włączono railsy.
Scott Anderson
ale błąd pasażera 4:"passenger_max_preloader_idle_time" directive is duplicate
TangMonk
2

RE:

# Additionally keep a copy of the Rails framework in memory. If you're 
# using multiple apps on the same version of Rails, this will speed up
# the creation of new RailsAppSpawners. This isn't necessary if you're
# only running one or 2 applications, or if your applications use
# different versions of Rails.
RailsFrameworkSpawnerIdleTime 0

Po prostu coś do dodania i może być przydatne.

Domyślną metodą spawn w bieżącej wersji jest "smart-lv2", która pomija spawner frameworka, więc ustawienie limitu czasu spawnera frameworka i tak nie przyniesie efektu, chyba że jawnie ustawisz metodę spawn na "smart".

Źródło: http://groups.google.com/group/phusion-passenger/browse_thread/thread/c21b8d17cdb073fd?pli=1

Shuoling Liu
źródło
1

Jeśli Twój host jest serwerem współdzielonym, takim jak mój, nie możesz zmienić ustawień i utkniesz w zadaniu cron.


źródło
W przypadku tej konkretnej aplikacji na szczęście tak nie jest. Ale będę mieć to na uwadze, dzięki na przyszłość.
tsdbrown
1

Miałem też ten problem ale nie mogłem zmienić ustawień pasażera bo nie miałem prawa zapisu do tego pliku. Znalazłem narzędzie ( http://www.wekkars.com ), które zapewnia szybką reakcję mojej aplikacji. Może to też może być rozwiązanie dla Ciebie.

SteenhouwerD
źródło
0

sprawdź wersję pasażera. był to RailsSpawnMethod<string> dla starszych wersji.

Jeśli tak (jeśli dobrze pamiętam), zamień Passenger na Rails we wszystkich dyrektywach konfiguracyjnych lub poszukaj starych dokumentów pasażera, aby uzyskać więcej informacji

JmJ
źródło