Pregunta

Mi aplicación RubyOnRails está configurada con el paquete habitual de mestizos detrás de la configuración de Apache.Hemos notado que el uso de memoria de nuestro servidor web Mongrel puede aumentar bastante en ciertas operaciones y realmente nos gustaría poder realizar dinámicamente un reinicio elegante de los procesos Mongrel seleccionados en cualquier momento.

Sin embargo, por razones que no voy a explicar aquí, a veces puede ser muy Es importante que no interrumpamos a un Mongrel mientras atiende una solicitud, por lo que supongo que una simple eliminación del proceso no es la respuesta.

Idealmente, quiero enviarle al mestizo una señal que diga "termina lo que estés haciendo y luego sal antes de aceptar más conexiones".

¿Existe una técnica estándar o una mejor práctica para esto?

¿Fue útil?

Solución

Investigué un poco más la fuente de Mongrel y resulta que Mongrel instala un controlador de señales para detectar una interrupción de proceso estándar (TERM) y realizar un cierre ordenado, por lo que no necesito un procedimiento especial después de todo.

Puedes ver que esto funciona en el resultado del registro que obtienes cuando matas a un mestizo mientras procesa una solicitud.Por ejemplo:

** TERM signal received.
Thu Aug 28 00:52:35 +0000 2008: Reaping 2 threads for slow workers because of 'shutdown'
Waiting for 2 requests to finish, could take 60 seconds.Thu Aug 28 00:52:41 +0000 2008: Reaping 2 threads for slow workers because of 'shutdown'
Waiting for 2 requests to finish, could take 60 seconds.Thu Aug 28 00:52:43 +0000 2008 (13051) Rendering layoutfalsecontent_typetext/htmlactionindex within layouts/application

Otros consejos

Mira cómo usar monit.Puede reiniciar mongrel dinámicamente según el uso de la memoria o la CPU.Aquí hay una línea de un archivo de configuración que escribí para un cliente mío.

check process mongrel-8000 with pidfile /var/www/apps/fooapp/current/tmp/pids/mongrel.8000.pid
    start program = "/usr/local/bin/mongrel_rails cluster::start --only 8000"
    stop program = "/usr/local/bin/mongrel_rails cluster::stop --only 8000"

    if totalmem is greater than 150.0 MB for 5 cycles then restart       # eating up memory?
    if cpu is greater than 50% for 8 cycles then alert                  # send an email to admin
    if cpu is greater than 80% for 5 cycles then restart                # hung process?
    if loadavg(5min) greater than 10 for 3 cycles then restart          # bad, bad, bad
    if 3 restarts within 5 cycles then timeout                         # something is wrong, call the sys-admin

    if failed host 192.168.106.53 port 8000 protocol http request /monit_stub
        with timeout 10 seconds
        then restart
    group mongrel

Luego repetiría esta configuración para todas sus instancias de clúster mestizo.La línea monit_stub es solo un archivo vacío que monit intenta descargar.Si no puede, también intenta reiniciar la instancia.

Nota:El monitoreo de recursos parece no funcionar en OS X con el kernel Darwin.

La mejor pregunta es cómo evitar que tu aplicación consuma tanta memoria que requiera que reinicies los mestizos de vez en cuando.

www.modrails.com redujo significativamente nuestra huella de memoria

Pantanoso:

Si tiene un proceso en ejecución, se cerrará correctamente (atienda todas las solicitudes en su cola, que solo deberían ser 1 si está utilizando el equilibrio de carga adecuado).El problema es que no puedes iniciar el nuevo servidor hasta que el antiguo muera, por lo que tus usuarios harán cola en el balanceador de carga.Lo que he encontrado exitoso es una 'cascada' o un reinicio continuo de los mestizos.En lugar de detenerlos todos e iniciarlos todos (por lo tanto, poner en cola las solicitudes hasta que un mestizo finalice, se detenga, se reinicie y acepte conexiones), puede detener y luego iniciar cada mestizo secuencialmente, bloqueando la llamada para reiniciar el siguiente mestizo hasta que se complete el anterior. haga una copia de seguridad (use una verificación HTTP real en un controlador /status).A medida que tus mestizos avanzan, solo uno a la vez está inactivo y estás sirviendo en dos bases de código; si no puedes hacer esto, debes abrir una página de mantenimiento por un minuto.Debería poder automatizar esto con capistrano o cualquiera que sea su herramienta de implementación.

Entonces tengo 3 tareas:cap:deploy: realiza el método tradicional de reinicio todo al mismo tiempo con un enlace que muestra una página de mantenimiento y luego la elimina después de una verificación HTTP.cap:deploy:rolling - que hace esto en cascada a través de la máquina (lo saco de un iClassify para saber cuántos mestizos hay en la máquina dada) sin una página de mantenimiento.cap implementación: migraciones - que realiza la página de mantenimiento + migraciones ya que normalmente es una mala idea ejecutar las migraciones "en vivo".

Intenta usar:

mongrel_cluster_ctl stop

También puedes usar:

mongrel_cluster_ctl restart

tengo una pregunta

¿Qué sucede cuando se activa /usr/local/bin/mongrel_rails cluster::start --only 8000?

¿Todas las solicitudes son atendidas por este proceso en particular hasta el final?¿O son abortados?

Tengo curiosidad por saber si todo este proceso de inicio/reinicio se puede hacer sin afectar a los usuarios finales...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top