2012-09-26 28 views
6

Acabo de pasar de apache prefork a worker y comencé a ejecutar mod_wsgi en modo daemon. Hasta aquí todo bien. Aún no he experimentado la carga máxima, pero el servidor parece más consistente y no estamos viendo que las solicitudes aleatorias tarden 2 minutos esperando una respuesta de mod_wsgi. La huella de memoria ha pasado de 3.5G a 1G. Esto es asombroso Estamos corriendo en un solo VPS con 6G de ram. Hay una aplicación Django ejecutándose en este servidor junto con una instancia de Memcache, a la que hemos asignado 1G de ram. Tenemos un servidor MySql separado.Django, python, mod_wsgi y Apache worker

Nuestra aplicación es voluminosa y ciertamente puede optimizarse. Estamos usando NewRelic para solucionar algunas de las páginas que se ejecutan más lentamente ahora. He leído mucho sobre la optimización de mod_wsgi/apache, pero, como todos los demás, todavía me quedan algunas preguntas.

Nuestro tiempo promedio de carga de la página de aplicación es 650-750ms. Muchas de nuestras páginas están en el rango de los 200 ms, pero tenemos algunos perros que tardan entre 2 y 5 segundos en cargarse. Recibimos alrededor de 15-20 solicitudes/segundo durante los tiempos normales de carga y 30-40 solicitudes/segundo durante las horas punta, que pueden durar entre 30 y 60 minutos.

Aquí está mi configuración de apache, ejecutando trabajador mpm.

StartServers  10 
MaxClients   400 
MinSpareThreads  25 
MaxSpareThreads  75 
ThreadsPerChild  25 
MaxRequestsPerChild 0 

Empecé con los valores por defecto (StatServers = 2 y MaxClients = 150), pero nuestro sitio desaceleró hacia abajo bajo carga mínima. Supongo que tardó mucho tiempo en abrir los servidores a medida que llegaban las solicitudes. Estamos atendiendo el 90% de nuestros medios desde s3. El otro 10% se sirve a través de Apache en nuestras páginas https o alguien que apunta perezosamente a nuestro servidor local. Con una carga nominal, se crean 15 procesos de trabajo, así que estoy pensando que probablemente debería establecer StartServers = 15. Con esta configuración, supongo que tengo 15 procesos de trabajo en ejecución (que puedo confirmar con NewRelic) con 25 hilos cada uno (que no sé cómo confirmar, adivinando 400/15).

Mis directivas Apache/mod_wsgi este aspecto:

<VirtualHost *:80> 
    # Some stuff 
    WSGIDaemonProcess app1 user=http group=http processes=10 threads=20 
    WSGIProcessGroup app1 
    WSGIApplicationGroup app1 
    WSGIScriptAlias//path/to/django.wsgi 
    WSGIImportScript /path/to/django.wsgi process-group=app1 application-group=app1  
    # Some more stuff  
</VirtualHost> 

<VirtualHost *:443> 
    # Some stuff 
    WSGIDaemonProcess app1-ssl user=http group=http processes=2 threads=20 
    WSGIProcessGroup app1-ssl 
    WSGIApplicationGroup app1-ssl 
    WSGIScriptAlias//path/to/django.wsgi 
    WSGIImportScript /path/to/django.wsgi process-group=app1-ssl application-group=app1-ssl 
    # Some more stuff 
</VirtualHost> 

Tener un WSGIDaemonProcess/WSGIProcessGroup diferente para el lado de mi sitio web SSL, así, que simplemente no se siente bien en absoluto. Estoy 100% seguro de haber perdido algo aquí. En general, he asignado 200 + 40 subprocesos para mod_wsgi para manejar las solicitudes de Apache, dejando 160 subprocesos para tratar con los medios que necesitan ser entregados (a través de ssl o la pereza de no apuntar a s3).

Por lo tanto, dada nuestra carga de aplicaciones anterior, ¿alguien puede sugerir formas en que puedo mejorar el rendimiento de mi sitio? ¿Estoy lidiando con las directivas ssl/mod_wsgi correctamente? ¿Dónde está Graham? ;)

+2

he estado de vacaciones durante unas pocas semanas. Ve a casa en unos días. Mejor si envías preguntas a la lista mod_wsgi si quieres asegurarte de responder. –

+0

Graham también ha publicado un par de blogs relacionados con este tema. Todo lo etiquetado como mod_wsgi es relevante, pero encontré estos más útiles para solucionar problemas de rendimiento. http://blog.dscpl.com.au/2014/02/use-of-threading-in-modwsgi-daemon-mode.html http://blog.dscpl.com.au/2014/02/vertically-partitioning -python-web.html – scoopseven

Respuesta

Cuestiones relacionadas