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? ;)
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. –
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