2009-09-25 6 views
6

En primer lugar, no estoy descontento con el rendimiento de mi sitio con Django, no está recibiendo tráfico masivo, un poco más de 1000 visitas por día hasta ahora.Desempeño de concurrencia en Django (apache2 prefork/mod_wsgi), ¿qué estoy haciendo mal?

Tenía curiosidad por lo bien que podría hacer frente a los picos de tráfico pesado, así que utilicé la herramienta ab para hacer algunas pruebas comparativas.

Me di cuenta de que el rendimiento cuando la concurrencia es mayor que 1 proporciona la misma cantidad de solicitud que una conexión simultánea.

¿No deberían los requisitos aumentar con la concurrencia?

Im en una máquina virtual con 1 GB de RAM, apache2 (prefork), mod_wsgi, memcached y mysql.
Todo el contenido de la página se ha almacenado en caché, la base de datos no recibe ningún resultado. Y si memcached soltara la entrada, solo hay 2 consultas ligeras (indexadas), y se deberían volver a almacenar en caché inmediatamente.

evaluación comparativa de datos: (nota: i hizo referencia con 10k 2000 y las solicitudes con los mismos resultados)

En la página de inicio, que se sirve a través apache2/mod_wsgi por Django:
-n100 C4: http://dpaste.com/97999/ (58,2 reqs/s)
-n100 -c1: http://dpaste.com/97998/ (57,7 reqs/s)

Para robots.txt, directamente desde apache2:
-n100 C4: http://dpaste.com/97992/ (4917 reqs/s)
-n100 C1: http://dpaste.com/97991/ (1412 reqs/s)

Ésta es mi Apache conf: http://dpaste.com/97995/

Editar: Se ha añadido más información

wsgi.conf: http://dpaste.com/98461/

mysite. conf: http://dpaste.com/98462/

My wsgi-handler:

import os, sys 
os.environ['DJANGO_SETTINGS_MODULE'] = 'myproject.settings' 
import django.core.handlers.wsgi 
application = django.core.handlers.wsgi.WSGIHandler() 
+2

No indica si Apache está compilado con prefork o MPM de trabajador. No proporciona la configuración que está utilizando para que su aplicación alojada por mod_wsgi, por lo que no tiene idea de si está utilizando el modo incrustado o el modo daemon. El uso de 100 solicitudes para una muestra de evaluación comparativa tampoco generará buenos resultados; normalmente, le conviene usar miles. Tampoco puede decir si se ha asegurado de haber eliminado las demoras de inicio. Apache/mod_wsgi cargará de forma perezosa la aplicación web Python. Tampoco hay indicación de si su solicitud está en contra de una base de datos y si es el problema. Se necesita más información. –

+0

Se agregó más información. Lo comparé con solicitudes de 2000 y 10k con los mismos resultados. La solicitud no llega a la base de datos, me he asegurado de que todo esté en caché (memcached), y top me dice que son solo los procesos de apache que están usando (todos los recursos). – schmilblick

+0

Ah, y en realidad tenía "prefork" en el encabezado, por lo que se proporcionó información. Se agregó al texto ahora para mayor claridad. – schmilblick

Respuesta

12

Como está utilizando prefork MPM y mod_wsgi en modo incrustado con muchos procesos, posiblemente esté matando el rendimiento de su caja. Para empezar, sugerimos que lea:

http://blog.dscpl.com.au/2009/03/load-spikes-and-excessive-memory-usage.html

Uso del modo incrustado como si, hay que ajustar los parámetros de MPM con cuidado. Establecer MaxRequestsPerChild para que sea diferente de cero no es un buen comienzo, ya que forzará periódicamente los procesos Apache, con el resultado de que provocará un aumento de carga ya que todo tiene que volver a cargarse.

Sugeriría MPM de trabajador y con su aplicación web de Python ejecutándose en el modo de demonio mod_wsgi. Esto para empezar dará como resultado la ejecución de muchos menos procesos, menos sobrecarga de memoria y brindará más previsibilidad en torno al rendimiento del sistema. Luego puede comenzar a observar más de cerca por qué las cosas pueden estar funcionando más lentamente.

Hay que prestar atención es a lo que se obtiene la siguiente sección de salida de 'ab':

Connection Times (ms) 
       min mean[+/-sd] median max 
Connect:  0 0 0.0  0  0 
Processing:  0 0 0.2  0  2 
Waiting:  0 0 0.1  0  2 
Total:   0 0 0.2  0  2 

Si la columna máx muestra valores grandes, entonces usted está siendo golpeado por los costes de aplicación de carga debido para que no los elimine de sus pruebas a través de la precarga o por un breve intervalo de reinicio del proceso.

+0

Gracias! No me di cuenta de que mod_wsgi podría ejecutarse en modo daemon. Voy a leer esto un par de veces y modificar mi configuración. Si leo su sugerencia correctamente, ¿está diciendo que no debería ejecutar la versión prefork de apache2? – schmilblick

+2

Si está utilizando el modo daemon para ejecutar la aplicación WSGI de Python, no es tan crítico que esté ejecutando MPM de trabajador como código Python que ya no se ejecuta en los procesos secundarios del servidor Apache. Si también está ejecutando PHP usando mod_php, de todos modos seguirá teniendo que ejecutar prefork MPM. Aún así, si no depende de mod_php o de cualquier otro módulo de Apache que requiera procesos de Apache de subproceso único, entonces sería mejor utilizar el MPM de trabajador. Incluso si todavía tiene que ejecutar un MPM prefork de una sola hebra, los procesos del daemon mod_wsgi aún pueden ser multiproceso. –

Cuestiones relacionadas