2009-04-14 20 views
13

Estoy interesado en probar el rendimiento de mis aplicaciones django a medida que avanzo, ¿cuál es la mejor manera de obtener datos de rendimiento línea por línea?benchmarking django apps

note: Google es una gran cantidad de personas que comparan django. No estoy buscando un punto de referencia de django, estoy tratando de probar el rendimiento de las aplicaciones django que estoy escribiendo :)

¡Gracias!

edición: Por "línea por línea" Sólo significa funciones de tiempo individuales, llamadas db, etc para averiguar dónde están los cuellos de botella en un nivel muy granular

+0

Defina "datos de rendimiento línea por línea" –

+0

lo siento, solo me refiero a la cantidad de tiempo que se necesita para ejecutar cada línea de código, así como el tiempo por función, llamada a base de datos, etc. – Jiaaro

Respuesta

7

Hay dos capas para esto. Tenemos la mayor cantidad de # 1 en el lugar para nuestras pruebas. Estamos a punto de comenzar en el n. ° 2.

  1. Django in isolation. Las pruebas ordinarias de la unidad Django funcionan bien aquí. Cree algunas pruebas que recorran unos pocos (menos de 6) casos de uso "típicos". Obtener esto, publicar eso, etc. Recolectar datos de tiempo. Este no es un rendimiento web real, pero es un escenario de prueba fácil de usar que puede usar para sintonizar.

  2. Toda la pila de la web. En este caso, necesita un servidor regular que ejecute Squid, Apache, Django, MySQL, lo que sea. Necesita una segunda computadora para que un cliente haga ejercicio en su sitio web a través de urllib2, haciendo unos pocos (menos de 6) casos de uso "típicos". Obtener esto, publicar eso, etc. Recolectar datos de tiempo. Este todavía no es un rendimiento web "real", porque no es a través de Internet, pero es lo más cercano que se obtendrá sin una configuración realmente elaborada.

Tenga en cuenta que el indicador # (extremo a extremo) 2 incluye una gran cantidad de almacenamiento en caché para el rendimiento. Si los scripts de su cliente están haciendo un trabajo similar, el almacenamiento en caché será realmente beneficioso. si las secuencias de comandos del cliente hacen cosas únicas cada vez, el almacenamiento en la memoria caché será menos beneficioso.

Lo más difícil es determinar cuál es la carga de trabajo "típica". Esta no es una prueba funcional, por lo que la carga de trabajo no tiene que incluir todo. Además, mientras más sesiones concurrentes esté ejecutando su cliente, más lento se vuelve. No se esfuerce tratando de optimizar su servidor cuando su cliente de prueba es la parte más lenta del proceso.


Editar

Si "línea por línea" significa "perfil", bueno, ya que conseguir un perfilador de Python en ejecución.

https://docs.python.org/library/profile.html

Tenga en cuenta que hay un montón de almacenamiento en caché en la capa ORM de Django. Así que ejecutar una función de vista una media docena de veces para obtener un conjunto significativo de mediciones no es sensato. Debe ejecutar un conjunto de operaciones "típicas" y luego encontrar puntos calientes en el perfil.

Generalmente, su aplicación es fácil de optimizar, no debería estar haciendo mucho. Las funciones de visualización deben ser cortas y no tener ningún procesamiento para hablar. Sus funciones de método de formulario y modelo, de manera similar, deberían ser muy cortas.

+0

gracias, estaba refiriéndose al número 1 en su mayoría ... ¡sospechaba que la prueba unitaria podría ser la respuesta! btw ... S. Lott has estado respondiendo casi todas las preguntas que publico, es muy apreciado :) Soy un estudiante de último año en la universidad y he aprendido mucho sobre el desbordamiento de la pila – Jiaaro

+0

Gracias por la palabras amables. –

5

Una forma de obtener datos de rendimiento línea por línea (creación de perfiles) su aplicación Django es utilizar un componente de middleware WSGI como repoze.profile.

Suponiendo que está usando mod_wsgi con Apache puede insertar repoze.profile en su aplicación como esta:

... 
application = django.core.handlers.wsgi.WSGIHandler() 
... 
from repoze.profile.profiler import AccumulatingProfileMiddleware 
application = AccumulatingProfileMiddleware(
    application, 
    log_filename='/path/to/logs/profile.log', 
    discard_first_request=True, 
    flush_at_shutdown=True, 
    path='/_profile' 
) 

Y ahora se puede escribir en el navegador/_profile para ver los datos del perfil. Por supuesto, esto no funcionará con mod_python o el servidor interno de Django.

+0

¿existe algo así para mod_python? – Jiaaro

+0

Simplemente está llamando al generador de perfiles estándar de Python (ver http://docs.python.org/library/profile.html) por lo que probablemente haya una manera, pero estoy seguro de que no hay ninguna motivación para que alguien la empaquete muy bien como mod_python está muerto. –

+0

También debo agregar que, después de mirar nuevamente la salida, en realidad no se trata de datos de rendimiento línea por línea. Es un registro con la cantidad de tiempo invertida en la ejecución de cada método/función, que está cerca, pero no exactamente igual a línea por línea. –