¿Hay una mejor manera de servir a los resultados de un proceso costoso bloqueo, pitón través de HTTP?

StackOverflow https://stackoverflow.com/questions/1929681

  •  20-09-2019
  •  | 
  •  

Pregunta

Tenemos un servicio web que sirve pequeños segmentos arbitrarios de un inventario fijo de archivos MP3 más grandes. Los archivos MP3 se generan sobre la marcha por una aplicación de pitón. El modelo es, hacer una petición GET a una URL que especifica qué segmentos desea, obtener un flujo de audio/mpeg en respuesta. Este es un proceso costoso.

Estamos usando Nginx como el controlador de solicitudes para el usuario. Nginx se encarga de las respuestas de caché para las peticiones comunes.

Inicialmente se intentó utilizar Tornado en el back-end para manejar las peticiones de Nginx. Como era de esperar, la operación MP3 bloqueo mantiene Tornado de hacer su cosa (E / S asíncrona). Así, fuimos multiproceso, que resolvió el problema de bloqueo, y funcionó bastante bien. Sin embargo, se introdujo una condición de carrera sutil (bajo carga en el mundo real) que no hemos sido capaces de diagnosticar o reproducir todavía. La condición de carrera corrompe nuestra salida de MP3.

Así que decidimos establecer nuestra aplicación como un simple controlador WSGI detrás de Apache / mod_wsgi (siendo w / Nginx en la delantera). Esto elimina el problema de bloqueo y la condición de carrera, sino que crea una carga en cascada (es decir, Apache crea demasiadas processses) en el servidor bajo condiciones del mundo real. Estamos trabajando en afinar Apache / mod_wsgi en este momento, pero todavía en una fase de prueba y error. (Actualización:.. Hemos cambiado de nuevo a Tornado Ver más abajo)

Por último, la pregunta: ¿Nos estamos perdiendo algo? ¿Hay una mejor manera de servir a los recursos de CPU-caro través de HTTP?

Actualización: Gracias al artículo informada de Graham, estoy bastante seguro de que esto es un problema de sintonía Apache. En el tiempo medio, hemos vuelto a usar Tornado y están tratando de resolver el problema de la corrupción de datos.

Para aquellos que estaban tan rápido para lanzar más hierro en el problema, Tornado y un poco de multi-threading (a pesar del problema de integridad de los datos introducidos por el roscado) se encarga de la carga aceptablemente en una pequeña (un solo núcleo) de instancias de Amazon EC2.

¿Fue útil?

Solución

¿Usted está haciendo el error de utilizar el modo integrado de Apache / mod_wsgi? Lea:

http: // Blog .dscpl.com.au / 2009/03 / carga-spikes-and-excesivo-memoria-usage.html

Asegúrese de que utiliza modo demonio si se utiliza Apache / mod_wsgi.

Otros consejos

¿Ha tratado desove ? Es un servidor WSGI con una variedad flexible de los modos de roscado.

Usted podría considerar un sistema de colas con los métodos de notificación de AJAX.

Cada vez que hay una solicitud para su recurso caro, y requiere que los recursos que se generen, añadir que la solicitud a la cola (si no está ya allí). Ese funcionamiento de la cola debe devolver un identificador de un objeto que se puede consultar para obtener su estado.

A continuación, tiene que escribir un servicio en segundo plano que gira hasta subprocesos de trabajo. Estos trabajadores simplemente quitar de la cola la solicitud, generan los datos, a continuación, guarda la ubicación de los datos en el objeto solicitud.

La página web puede hacer llamadas AJAX a su servidor para averiguar el progreso de la generación y para dar un enlace al archivo una vez que esté disponible.

Así es como funcionan los sitios multimedia de gran tamaño - los que tienen que lidiar con el vídeo en particular. Podría ser excesiva para su trabajo en mp3 sin embargo.

Como alternativa , mira en funcionamiento un par de máquinas para distribuir la carga. Sus hilos en Apache todavía bloquearán, pero al menos no consumirán recursos en el servidor web.

Por favor, defina "cascada de carga", ya que no tiene sentido común.

Su problema más probable va a ser si se está ejecutando demasiados procesos de Apache.

Para una carga de este tipo, asegúrese de que está utilizando el MPM prefork, y asegúrese de que está usted limitar a un número apropiado de procesos (no menos de uno por CPU, no más de dos).

Parece que está haciendo las cosas bien - simplemente carecen de energía de la CPU:? Se puede determinar cuál es la carga de la CPU en el proceso de generación de éstos MP3

Creo que la siguiente cosa que tienes que hacer lo que hay que añadir más hardware para hacer que los MP3 en otras máquinas. O eso, o encontrar una manera de entregar pre-rendido MP3 (tal vez se puede cahce algunos de sus medios de comunicación?)

Por cierto, la ampliación de la red fue el tema de una conferencia magistral por Jacob Kaplan-Musgo en PyCon Brasil este año, y está lejos de ser un problema cerrado. La pila de tecnologías que uno necesita para manejar es bastante impresionable - (no pude encontrar una copia en línea d e la presentación, aunque - Lo siento por eso)

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