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?

Sharjeel
la source

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.

Lumière argentée
la source
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
Tomasz Zieliński
la source
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

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

Plug sans vergogne ici, mais j'ai récemment créé https://github.com/django-silk/silk à cet effet. C'est un peu similaire à la barre d'outils django mais avec un historique, un profilage de code et un contrôle plus fin sur tout.

Michael
la source
Obtention d'un problème de middleware 'Aucun gestionnaire n'a été trouvé pour l'enregistreur "silk.middleware"'
Naveen Agarwal
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:

Joshua Pokotilow
la source
3

Lorsque les vues ne sont pas HTML, par exemple JSON, utilisez des méthodes middleware simples pour le profilage.

Voici quelques exemples:

https://gist.github.com/1229685 - capture tous les appels SQL sont entrés dans la vue

https://gist.github.com/1229681 - profile tous les appels de méthode utilisés pour créer la vue

Evgeny
la source
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.

Tony S Yu
la source