Perfilando Django

99

Mi aplicación django se ha vuelto dolorosamente lenta en la producción. Probablemente se deba a algunas consultas complejas o no indexadas.

¿Hay alguna forma django-ish de perfilar mi aplicación?

Sharjeel
fuente

Respuestas:

79

Prueba la barra de herramientas de depuración de Django . Le mostrará qué consultas se ejecutan en cada página y cuánto tiempo toman. Es una herramienta realmente útil, potente y fácil de usar.

Además, lea las recomendaciones sobre el rendimiento de Django en Optimización del acceso a la base de datos de la documentación.

Y consejos de rendimiento de Django de Jacob Kaplan-Moss.

Luz plateada
fuente
13
Tenga cuidado con la barra de herramientas de depuración de Django: la apagué durante el desarrollo y la representación de la página fue significativamente más rápida en mi computadora portátil (ciertamente de bajo consumo): busque en el servidor de desarrollo para ver cuántos datos está descargando.
Dominic Rodger
2
django-debug-toolbar me ayuda a ver cuántas consultas django-orm llega a la base de datos, y podemos ver cómo la función select_related () hace el truco para hacerlo menos.
Panchicore
11
@ dominic-rodger No me di cuenta de lo lento que era la barra de herramientas de depuración. Mis consultas SQL eran pequeñas (30 ms) pero el tiempo de CPU era muy alto (800 ms). Otra página que estaba ajustando tenía tiempos sql de 300 ms y tiempo de CPU de 8000 ms, así que seguí tratando de encontrar la fuente del problema. Apagar la barra de herramientas de Django aceleró las cosas. 3 años después, sigue siendo relevante.
Esteban
2
@Esteban, muchas gracias por este comentario, literalmente me estaba volviendo loco por la cantidad ridículamente alta de tiempo de CPU que tomó la barra de herramientas dhango. Con el perfil de django, el tiempo de la CPU era de alrededor de 30 segundos, una vez que lo eliminé, ¡se redujo a 1,5 segundos!
noob Mama
28

Simplemente escriba "django-profiling" 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 una marca de "creación de perfiles" almacenada en una sesión, y si mi middleware de creación de perfiles nota que se ha establecido una marca , utiliza el módulo de referencia de Python como este:

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

EDITAR: Para generar perfiles de consultas SQL, http://github.com/robhudson/django-debug-toolbar mencionado por Konstantin es algo bueno, pero si sus consultas son realmente lentas (probablemente porque hay cientos o miles de ellas), entonces Estará esperando una cantidad increíble de tiempo hasta que se cargue en un navegador, y luego será difícil navegar debido a la lentitud. Además, django-debug-toolbar es por diseño incapaz de brindar información útil sobre los aspectos internos de las solicitudes AJAX.

EDIT2: django-extensions tiene un gran comando de creación de perfiles integrado:

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

Solo haz esto y listo:

$ mkdir /tmp/my-profile-data
$ ./manage.py runprofileserver --kcachegrind --prof-path=/tmp/my-profile-data
Tomasz Zieliński
fuente
7
code.google.com/p/django-profile es una aplicación django de perfil de usuario. no se usa para perfilar django :)
dzen
1
@dzen: Ja, buen punto, estaba destinado a ser: code.google.com/p/django-profiling :-)
Tomasz Zieliński
1
Si se pregunta cómo leer los volcados del generador de perfiles después de ejecutarlo python manage.py runprofileserver --prof-path=/path/to/dir, siga este blog: darkcoding.net/software/profiling-django-for-cpu-bound-apps .
Neara
Ah, sí, mi favorito, usar Google para encontrar una de las principales respuestas a mi consulta es "solo busca en Google lo que buscaste en Google para llegar aquí"
Anna
Tenga en cuenta que hotshotha sido obsoleto y eliminado en Python 3, por lo que esta respuesta y la ProfilingDjangopágina Wiki pueden dejar de ser relevantes en 20202.
Patryk Bratkowski
16

Para obtener perfiles de acceso a los datos (que es donde se encuentra el cuello de botella la mayor parte del tiempo), consulte django-live-profiler . A diferencia de la barra de herramientas de depuración de Django, recopila datos en todas las solicitudes de forma simultánea y puede ejecutarla en producción sin demasiada sobrecarga de rendimiento ni exponer los componentes internos de su aplicación.

Mira esta captura de pantalla

intereshkin
fuente
18
no es compatible con 1.6 y superior, sin actividad durante más de un año.
Han He
14

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

Miguel
fuente
Obteniendo problema de middleware 'No se pudieron encontrar controladores para el registrador "silk.middleware"'
Naveen Agarwal
La
creación de
5

Para todos los fanáticos de KCacheGrind, creo que es muy fácil usar el shell junto con la fantástica prueba de Django Clientpara generar registros de perfil sobre la marcha, especialmente en producción. He usado esta técnica en varias ocasiones porque tiene un toque ligero: ¡no se requieren molestos middleware o aplicaciones Django de terceros!

Por ejemplo, para perfilar una vista en particular que parece estar funcionando lentamente, puede abrir el shell y escribir este código:

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, usé hotshot2cachegrind:

Pero también hay otras opciones:

Joshua Pokotilow
fuente
3

Cuando las vistas no sean HTML, por ejemplo JSON, utilice métodos de middleware simples para la creación de perfiles.

Aqui hay un par de ejemplos:

https://gist.github.com/1229685 : captura todas las llamadas sql que entraron en la vista

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

Evgeny
fuente
0

Necesitaba crear un perfil de una aplicación de Django recientemente y probé muchas de estas sugerencias. Terminé usando pyinstrument en su lugar , que se puede agregar a una aplicación de Django usando una sola actualización a la lista de middleware y proporciona una vista basada en la pila de los tiempos.

Resumen rápido de mi experiencia con algunas otras herramientas:

  • La barra de herramientas de depuración de Django es excelente si el problema se debe a consultas SQL y funciona bien en combinación conpyinstrument
  • django-silk funciona bien, pero requiere agregar un administrador de contexto o decorador a cada parte de la pila donde desea tiempos de sub-solicitud. También proporciona una forma fácil de acceder a los cProfiletiempos y muestra automáticamente los tiempos ajax, los cuales pueden ser realmente útiles.
  • djdt-flamegraph parecía prometedor, pero la página nunca se renderizó en mi sistema.

En comparación con las otras herramientas que probé, pyinstrumentfue dramáticamente más fácil de instalar y usar.

Tony S Yu
fuente