2010-03-02 15 views
85

Mi aplicación django se ha vuelto extremadamente lenta en la producción. Prolly se debe a algunas consultas complejas o no indexadas.Perfilando Django

¿Hay alguna manera django-ish para perfilar mi aplicación?

Respuesta

68

Pruebe el Django Debug Toolbar. Le mostrará qué consultas se ejecutan en cada página y cuánto tiempo toman. Es una herramienta realmente útil, poderosa y fácil de usar.

Además, lea las recomendaciones sobre el rendimiento de Django en Database access optimization de la documentación.

Y Django performance tips por Jacob Kaplan-Moss.

+11

Tenga cuidado con Django Debug Toolbar - Lo apagué durante el desarrollo y la representación de página fue significativamente más rápida en mi portátil (por cierto, de baja potencia): busque en el servidor de desarrollo la cantidad de datos que está descargando. –

+2

django-debug-toolbar me ayuda a ver cuántas consultas django-orm llega al db, y podemos ver cómo la función select_related() hace que el truco sea menos efectivo. – panchicore

+9

@ dominic-rodger No me di cuenta de cuánto más lenta la barra de herramientas Debug ha hecho que todo funcione. Mis consultas SQL eran pequeñas (30 ms) pero el tiempo de CPU era muy alto (800 ms). Otra página que estaba afinando tenía un tiempo sql de 300ms y un tiempo de CPU de 8000ms, así que seguí intentando encontrar el origen del problema. Al girar la barra de herramientas Django, aceleró las cosas. 3 años después, sigue siendo relevante. – Esteban

28

Sólo tienes que escribir "Django-perfiles" en Google, obtendrá estos enlaces (y más):

http://code.djangoproject.com/wiki/ProfilingDjango

http://code.google.com/p/django-profiling/

http://www.rkblog.rk.edu.pl/w/p/django-profiling-hotshot-and-kcachegrind/

Personalmente estoy usando el enfoque de middleware - es decir, cada usuario puede alternar un indicador de "creación de perfiles" almacenado en una sesión, y si mi middleware de perfiles nota que se ha establecido un indicador, usa el módulo hotshot de Python e esto:

def process_view(self, request, view_func, view_args, view_kwargs): 

    # setup things here, along with: settings.DEBUG=True 
    # to get a SQL dump in connection.queries 

    profiler = hotshot.Profile(fname) 
    response = profiler.runcall(view_func, request, *view_args, **view_kwargs) 
    profiler.close() 

    # process results 

    return response 

EDIT: Para perfiles de consultas SQL http://github.com/robhudson/django-debug-toolbar mencionado por Konstantin es una cosa agradable - pero si las consultas son muy lento (probablemente porque hay cientos o miles de ellos), entonces estaré esperando tiempo de locura hasta que se carga en un navegador, y luego será difícil navegar debido a la lentitud. Además, django-debug-toolbar no puede dar una idea útil de las aplicaciones internas de AJAX.

Edit2: django-extensions tiene un gran dominio de perfiles construido en:

https://github.com/django-extensions/django-extensions/blob/master/docs/runprofileserver.rst

a hacer esto y listo:

$ mkdir /tmp/my-profile-data 
$ ./manage.py runprofileserver --kcachegrind --prof-path=/tmp/my-profile-data 
+7

http://code.google.com/p/django-profile/ es una aplicación django de Perfil de usuario. no se usa como perfil django :) – dzen

+1

@dzen: Hah, buen punto, estaba destinado a ser: http://code.google.com/p/django-profiling/ :-) –

+1

si se pregunta cómo leer el Profiler Dumps después de ejecutar 'python manage.py runprofileserver --prof-path =/path/to/dir', sigue este blog: http://www.darkcoding.net/software/profiling-django-for-cpu-bound- aplicaciones /. – Neara

2

Cuando los puntos de vista no son HTML, por ejemplo JSON, un uso sencillo métodos de middleware para perfilar.

Éstos son un par de ejemplos:

https://gist.github.com/1229685 - capturar todas las llamadas SQL entraron en la vista

https://gist.github.com/1229681 - Perfil de todas las llamadas a los métodos utilizados para crear la vista

15

para el perfil de acceso a datos (que es donde el cuello de botella es la mayor parte del tiempo) echa un vistazo a django-live-profiler. A diferencia de Django Debug Toolbar, recopila datos en todas las solicitudes de forma simultánea y puede ejecutarlo en producción sin demasiada sobrecarga de rendimiento o exponiendo sus aplicaciones internas.

Check out this screenshot

+14

no es compatible con 1.6 y superior, sin actividad durante más de un año. –

4

Por todo lo que kcachegrind fans, me parece que es muy fácil de usar la cáscara en tándem con fantástica prueba Client de Django para generar registros de perfil en la marcha, especialmente en la producción. He usado esta técnica ahora en varias ocasiones porque tiene un toque ligero, ¡no se requieren aplicaciones molestas de middleware o de Django de terceros! hotshot2cachegrind

from django.test import Client 
import hotshot 

c = Client() 
profiler = hotshot.Profile("yourprofile.prof") # saves a logfile to your pwd 
profiler.runcall(c.get, "/pattern/matching/your/view/") 
profiler.close() 

Para visualizar el registro resultante, he utilizado::

Por ejemplo, para perfilar una visión particular que parece estar funcionando lento, se podría abrir una grieta en la cáscara y escriba el código

Pero hay otras opciones también:

10

Enchufe desvergonzado aquí, pero recientemente he hecho https://github.com/django-silk/silk para este propósito. Es algo similar a la barra de herramientas de django, pero con historial, perfiles de código y un control más detallado sobre todo.

+0

Obteniendo el problema del middleware 'No se encontraron manipuladores para el registrador "silk.middleware"' –