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?
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.
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:
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:
fuente
python manage.py runprofileserver --prof-path=/path/to/dir
, siga este blog: darkcoding.net/software/profiling-django-for-cpu-bound-apps .hotshot
ha sido obsoleto y eliminado en Python 3, por lo que esta respuesta y laProfilingDjango
página Wiki pueden dejar de ser relevantes en 20202.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.
fuente
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.
fuente
Para todos los fanáticos de KCacheGrind, creo que es muy fácil usar el shell junto con la fantástica prueba de Django
Client
para 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:
Para visualizar el registro resultante, usé hotshot2cachegrind:
Pero también hay otras opciones:
fuente
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
fuente
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:
pyinstrument
cProfile
tiempos y muestra automáticamente los tiempos ajax, los cuales pueden ser realmente útiles.En comparación con las otras herramientas que probé,
pyinstrument
fue dramáticamente más fácil de instalar y usar.fuente