Profilage de Django


99

Mon application django est devenue extrêmement lente en production. Cela est probablement dû à des requêtes complexes ou non indexées.

Existe-t-il un moyen django-ish de profiler mon application?

Réponses:


80

Essayez la barre d'outils Django Debug . Il vous montrera quelles requêtes sont exécutées sur chaque page et combien de temps elles prennent. C'est un outil vraiment utile, puissant et facile à utiliser.

Lisez également les recommandations sur les performances de Django dans l' optimisation de l' accès à la base de données dans la documentation.

Et les conseils de performance Django de Jacob Kaplan-Moss.


13
Méfiez-vous de la barre d'outils de débogage Django - je l'ai désactivée pendant le développement et le rendu de la page était beaucoup plus rapide sur mon ordinateur portable (certes de faible puissance) - regardez dans le serveur de développement pour voir la quantité de données que vous téléchargez.
Dominic Rodger

2
django-debug-toolbar m'aide à voir combien de requêtes django-orm atteint la base de données, et nous pouvons voir comment la fonction select_related () fait le tour en la frappant moins.
panchicore

11
@ dominic-rodger Je n'avais pas réalisé à quel point la barre d'outils de débogage ralentissait le processus. Mes requêtes SQL étaient petites (30 ms) mais le temps du processeur était très élevé (800 ms). Une autre page que j'étais en train de régler avait des temps sql de 300 ms, et un temps cpu de 8000 ms - alors j'ai continué à essayer de trouver la source du problème. La désactivation de Django Toolbar a accéléré les choses. 3 ans plus tard, toujours d'actualité.
Esteban

2
@Esteban, merci beaucoup pour ce commentaire, je devenais littéralement fou à cause de la quantité ridiculement élevée de temps processeur, la barre d'outils dhango a pris. Avec le profilage de Django, le temps CPU était d'environ 30 secondes, une fois que je l'ai supprimé, il est descendu à 1,5 seconde !!
noob Mama

28

Tapez simplement "django-profiling" sur google, vous obtiendrez ces liens (et plus):

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/

Personnellement, j'utilise l'approche middleware - c'est-à-dire que chaque utilisateur peut basculer un indicateur de «profilage» stocké dans une session, et si mon middleware de profilage remarque qu'un indicateur a été défini, il utilise le module hotshot de Python comme ceci:

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: Pour le profilage des requêtes SQL http://github.com/robhudson/django-debug-toolbar mentionné par Konstantin est une bonne chose - mais si vos requêtes sont vraiment lentes (probablement parce qu'il y en a des centaines ou des milliers), alors vous J'attendrai un temps fou jusqu'à ce qu'il soit chargé dans un navigateur - et il sera alors difficile de naviguer en raison de la lenteur. De plus, django-debug-toolbar est, de par sa conception, incapable de donner un aperçu utile des éléments internes des requêtes AJAX.

EDIT2: django-extensions a une excellente commande de profilage intégrée:

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

Faites juste ceci et voila:

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

7
code.google.com/p/django-profile est une application django de profil utilisateur. il n'est pas utilisé comme profilage django :)
dzen

1
@dzen: Hah, bon point, c'était censé être: code.google.com/p/django-profiling :-)
Tomasz Zieliński

1
si vous vous demandez comment lire les vidages du profileur après l'exécution python manage.py runprofileserver --prof-path=/path/to/dir, suivez ce blog: darkcoding.net/software/profiling-django-for-cpu-bound-apps .
Neara

ah oui, mon préféré, utiliser google pour trouver l'une des principales réponses à ma question est "il suffit de google ce que vous avez cherché sur Google pour arriver ici"
Anna

Notez que cela hotshota été obsolète et supprimé dans Python 3, donc cette réponse et la ProfilingDjangopage Wiki peuvent ne plus être pertinentes en 20202.
Patryk Bratkowski

16

Pour le profilage de l'accès aux données (où se trouve la plupart du temps le goulot d'étranglement), consultez django-live-profiler . Contrairement à Django Debug Toolbar, il collecte des données sur toutes les demandes simultanément et vous pouvez l'exécuter en production sans trop de surcharge de performances ni d'exposer les composants internes de votre application.

Regardez cette capture d'écran


19
ne supporte pas 1,6 et plus, aucune activité pendant plus d'un an.
Han He


5

Pour tous les fans de KCacheGrind, je trouve qu'il est très facile d'utiliser le shell en tandem avec le fantastique test de Django Clientpour générer des journaux de profil à la volée, en particulier en production. J'ai utilisé cette technique maintenant à plusieurs reprises car elle a une touche légère - aucun middleware embêtant ou application Django tierce n'est requis!

Par exemple, pour profiler une vue particulière qui semble fonctionner lentement, vous pouvez ouvrir le shell et taper ce code:

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()

Pour visualiser le journal résultant, j'ai utilisé hotshot2cachegrind:

Mais il existe également d'autres options:



0

J'avais récemment besoin de profiler une application Django et j'ai essayé plusieurs de ces suggestions. J'ai fini par utiliser pyinstrument à la place , qui peut être ajouté à une application Django en utilisant une seule mise à jour de la liste middleware et fournit une vue basée sur la pile des timings.

Résumé rapide de mon expérience avec certains autres outils:

  • Django Debug Toolbar est idéal si le problème est dû à des requêtes SQL et fonctionne bien en combinaison avecpyinstrument
  • django-silk fonctionne bien, mais nécessite l'ajout d'un gestionnaire de contexte ou d'un décorateur à chaque partie de la pile où vous voulez des minutages de sous-requête. Il fournit également un moyen facile d'accéder aux cProfilehoraires et affiche automatiquement les horaires ajax, qui peuvent tous deux être très utiles.
  • djdt-flamegraph avait l'air prometteur, mais la page n'a jamais été rendue sur mon système.

Comparé aux autres outils que j'ai essayés, pyinstrumentc'était considérablement plus facile à installer et à utiliser.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.