2009-05-12 8 views
84

Para saltar en el vagón de la banda de Phusion Passenger, hemos configurado un servidor de etapas para una pequeña aplicación de rieles para probar cosas.Inicio lento del servidor inicial al usar Phusion Passenger and Rails

Hasta ahora ha sido muy agradable de usar, hace que la instalación/configuración e implementación de aplicaciones sea muy sencilla. El problema es que el sitio que estamos usando no se golpea muy a menudo y parece que apaga los servidores en segundo plano. Es decir, cuando alguien va al sitio, espera mucho hasta que se inicia un nuevo servidor para gestionar la solicitud. Hemos leído la documentación, probado bastantes configuraciones diferentes (modos inteligente/inteligente-lv2, passengeridletime, etc.) y todavía no hemos encontrado una solución real.

Después de arar los resultados de Google no podemos encontrar realmente información útil. Actualmente tenemos un trabajo cron que realiza una solicitud de vez en cuando en un intento de mantener los servidores en ejecución.

¿Alguien más está experimentando este problema y tiene algún consejo para solucionarlo?

+0

También encontré esta pepita en el sitio de Passenger Doc: http://www.modrails.com/documentation/Users%20guide%20Apache.html#PassengerPreStart – dewrich

+0

@dewrich Encontré una herramienta (http://wekkars.com) que hace exactamente lo que hace tu cronjob – SteenhouwerD

Respuesta

114

Lo que está sucediendo es que su Aplicación y/o ApplicationSpawners se están cerrando debido al tiempo de espera. Para procesar su nueva solicitud, Passenger tiene que iniciar una nueva copia de su aplicación, que puede tomar varios segundos, incluso en una máquina rápida. Para solucionar el problema, hay algunas opciones de configuración de Apache que puede usar para mantener su aplicación activa.

Esto es específicamente lo que he hecho en mis servidores. PassengerSpawnMethod y PassengerMaxPreloaderIdleTime son las opciones de configuración más importantes en su situación.

# 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 

Al utilizar el modo de desove "inteligente" y apagar PassengerMaxPreloaderIdleTime, Pasajero mantendrá 1 copia de su aplicación en la memoria en todo momento (después de la primera petición después de comenzar Apache). Los oyentes individuales Application serán fork ed a partir de esta copia, que es una operación súper barata. Sucede tan rápido que no puede decir si su aplicación ha generado o no un oyente.

Si su aplicación es incompatible con el desove inteligente, le recomendaría mantener un PassengerPoolIdleTime grande y acceder a su sitio periódicamente usando curl y cronjob o monit o algo así para asegurar que el oyente se mantenga con vida.

La Passenger User Guide es una referencia impresionante para estas y otras opciones de configuración.

edición: Si su aplicación no es compatible con el desove inteligente, hay algunas opciones nuevas que son muy agradable

# 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 

Por lo tanto, si se combinan PassengerPreStart y PassengerMinInstances, pasajeros girará hasta 3 instancias inmediatamente después de que apache carga, y siempre mantendrá al menos 3 instancias arriba, por lo que sus usuarios raramente (si alguna vez) ven un retraso.

O, si está utilizando desove inteligente (recomendado) con PassengerMaxPreloaderIdleTime 0 ya, puede agregar PassengerPreStart para obtener el beneficio adicional de la puesta en marcha inmediata.

Muchas gracias a los héroes en phusion.nl!

+0

Muchas gracias por tu respuesta. Creo que hemos intentado la mayoría de esos ajustes, pero quizás no en la combinación correcta. Me pondré a prueba mañana y revertiré. – tsdbrown

+0

Esto es asombroso. Estaba teniendo el mismo problema con mi instalación Nginx/Phusion Passenger y esto me ayudó muchísimo. –

+0

He intentado esta configuración y no veo mejoras en el rendimiento, pero nuestra aplicación está usando RMagick. ¿Hay alguna solución para esto? ¿Por qué no funciona con RMagick? –

1

Si su host es un servidor compartido, como el mío, no puede cambiar la configuración y está atascado con un trabajo de cron.

+0

Afortunadamente para esta aplicación en particular no lo es. Pero lo tendré en cuenta para el futuro, gracias. – tsdbrown

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 

Sólo algo para agregar y podría ser útil.

El método de desove por defecto en la versión actual es "smart-LV2", que se salta el marco de reproductores, por lo que establecer el tiempo de espera marco de reproductores no tendría efecto a menos que de todos modos establece explícitamente el método de desove de "inteligente ".

Fuente: http://groups.google.com/group/phusion-passenger/browse_thread/thread/c21b8d17cdb073fd?pli=1

38

Sólo en caso hay usuarios del servidor nginx tropezar con esta pregunta, tanto los 'PassengerMaxRequests' y directivas 'PassengerStatThrottleRate' no se traducen en nginx. Sin embargo, los otros lo hacen:

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

HTH!

EDITAR rails_spawn_method está en desuso en 3 pasajeros en lugar de utilizar

passenger_spawn_method smart; 

todo lo demás es bueno hasta la fecha.

+7

Gracias por esto. Una cosa a tener en cuenta es que tuve que rellenar el passenger_pool_idle_time en mi nginx.conf principal con las otras configuraciones globales en lugar de simplemente en la configuración específica del sitio donde se habilitaron los rieles. –

+0

pero error en el pasajero 4: la directiva '' passenger_max_preloader_idle_time "es duplicada' – TangMonk

4

También puede utilizar PassengerMinInstances:

http://www.modrails.com/documentation/Users%20guide%20Apache.html#PassengerMinInstances

Esto se puede combinar con PassengerPreStart

+0

De los documentos:" Debería establecer esta opción en un valor distinto de cero si desea evitar tiempos de inicio potencialmente largos después de que un sitio web haya estado inactivo durante un período prolongado período." Parece la respuesta perfecta para la pregunta del OP. – Chuck

0

comprobar la versión de pasajeros. era RailsSpawnMethod <string> para las versiones anteriores.

Si es así (si no recuerdo mal), reemplace pasajeros con rieles en todas las directivas de configuración o buscar documentos de pasajeros antiguos para más detalles

1

también tuve este problema, pero yo no era capaz de cambiar la configuración de pasajeros porque no tenía permiso de escritura para este archivo. Encontré una herramienta (http://www.wekkars.com) que hace que mi aplicación responda rápidamente. Quizás esto también puede ser una solución para ti.

Cuestiones relacionadas