Profiling Django

98

Meine Django-Anwendung ist in der Produktion schmerzhaft langsam geworden. Wahrscheinlich liegt es an einigen komplexen oder nicht indizierten Abfragen.

Gibt es eine django-artige Möglichkeit, meine Bewerbung zu profilieren?

Sharjeel
quelle

Antworten:

77

Probieren Sie die Django Debug-Symbolleiste aus . Es zeigt Ihnen, welche Abfragen auf jeder Seite ausgeführt werden und wie viel Zeit sie in Anspruch nehmen. Es ist ein wirklich nützliches, leistungsstarkes und einfach zu bedienendes Tool.

Lesen Sie auch die Empfehlungen zur Django-Leistung bei der Optimierung des Datenbankzugriffs des der Dokumentation.

Und Django Performance-Tipps von Jacob Kaplan-Moss.

Silbernes Licht
quelle
13
Achten Sie auf die Django Debug-Symbolleiste - ich habe sie während der Entwicklung deaktiviert und das Rendern von Seiten auf meinem (zugegebenermaßen stromsparenden) Laptop war erheblich schneller. Sehen Sie auf dem Entwicklungsserver nach, wie viele Daten Sie herunterladen.
Dominic Rodger
2
Die django-debug-Symbolleiste hilft mir zu sehen, wie viele Abfragen django-orm auf die Datenbank trifft, und wir können sehen, wie die Funktion select_related () den Trick macht, sie weniger zu treffen.
Panchicore
11
@ dominic-rodger Ich wusste nicht, wie viel langsamer die Debug-Symbolleiste den Prozess abläuft. Meine SQL-Abfragen waren klein (30 ms), aber die CPU-Zeit war sehr hoch (800 ms). Eine andere Seite, die ich optimierte, hatte SQL-Zeiten von 300 ms und eine CPU-Zeit von 8000 ms - also versuchte ich immer wieder, die Ursache des Problems zu finden. Das Ausschalten der Django-Symbolleiste beschleunigte die Arbeit. 3 Jahre später immer noch relevant.
Esteban
2
@Esteban, vielen Dank für diesen Kommentar, ich war buchstäblich verrückt nach der lächerlich hohen CPU-Zeit, die die Dhango-Symbolleiste in Anspruch nahm. Mit dem Django-Profiling betrug die CPU-Zeit ungefähr 30 Sekunden. Nachdem ich sie entfernt hatte, waren es 1,5 Sekunden !!
Noob Mama
28

Geben Sie einfach "django-profiling" bei Google ein, Sie erhalten folgende Links (und mehr):

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/

Persönlich verwende ich den Middleware-Ansatz - dh jeder Benutzer kann ein in einer Sitzung gespeichertes "Profiling" -Flag umschalten. Wenn meine Profiling-Middleware feststellt, dass ein Flag gesetzt wurde, wird Pythons Hotshot verwendet Modul:

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

BEARBEITEN: Zum Profilieren von SQL-Abfragen die von Konstantin erwähnte http://github.com/robhudson/django-debug-toolbar eine nette Sache - aber wenn Ihre Abfragen wirklich langsam sind (wahrscheinlich, weil es Hunderte oder Tausende von ihnen gibt), dann Sie Ich werde wahnsinnig lange warten, bis es in einen Browser geladen wird - und dann wird es aufgrund der Langsamkeit schwierig sein, es zu durchsuchen. Außerdem kann die django-debug-Symbolleiste von Natur aus keinen nützlichen Einblick in die Interna von AJAX-Anforderungen geben.

EDIT2: Django-Erweiterungen verfügt über einen großartigen Profiling-Befehl:

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

Mach das einfach und voila:

$ mkdir /tmp/my-profile-data
$ ./manage.py runprofileserver --kcachegrind --prof-path=/tmp/my-profile-data
Tomasz Zieliński
quelle
7
code.google.com/p/django-profile ist eine Benutzerprofil-Django-Anwendung. Es wird nicht als Profiling Django verwendet :)
Dzen
1
@dzen: Hah, guter Punkt, es sollte sein: code.google.com/p/django-profiling :-)
Tomasz Zieliński
1
Wenn Sie sich fragen, wie Sie die Profiler-Dumps nach dem Ausführen lesen können python manage.py runprofileserver --prof-path=/path/to/dir, folgen Sie diesem Blog: darkcoding.net/software/profiling-django-for-cpu-bound-apps .
Neara
Ah ja, mein Favorit, mit Google eine der besten Antworten auf meine Frage zu finden, ist "googeln Sie einfach das, was Sie gegoogelt haben, um hierher zu kommen"
Anna
Beachten Sie, dass dies hotshotin Python 3 veraltet und entfernt wurde, sodass diese Antwort und die ProfilingDjangoWiki-Seite im Jahr 20202 möglicherweise nicht mehr relevant sind.
Patryk Bratkowski
16

Informationen zum Profiling des Datenzugriffs (wo der Engpass die meiste Zeit besteht) finden Sie im django-live-profiler . Im Gegensatz zur Django Debug-Symbolleiste werden Daten über alle Anforderungen hinweg gleichzeitig erfasst, und Sie können sie in der Produktion ausführen, ohne zu viel Leistungsaufwand zu verursachen oder Ihre App-Interna verfügbar zu machen.

Schauen Sie sich diesen Screenshot an

Atereshkin
quelle
18
Nicht unterstützen 1.6 und höher, keine Aktivität für mehr als ein Jahr.
Han He
14

Schamloser Stecker hier, aber ich habe kürzlich https://github.com/django-silk/silk für diesen Zweck erstellt. Es ist der Django-Symbolleiste etwas ähnlich, aber mit Verlauf, Code-Profilerstellung und feiner Kontrolle über alles.

Michael
quelle
Middleware-Problem "Für den Logger" soap.middleware "wurden keine Handler gefunden"
Naveen Agarwal
5

Für alle KCacheGrind-Fans ist es sehr einfach, die Shell zusammen mit Djangos fantastischem Test zu verwenden Client zum , insbesondere in der Produktion. Ich habe diese Technik jetzt schon mehrmals verwendet, weil sie sich leicht anfühlt - es sind keine lästigen Middleware- oder Django-Anwendungen von Drittanbietern erforderlich!

Um beispielsweise eine bestimmte Ansicht zu profilieren, die langsam zu laufen scheint, können Sie die Shell aufbrechen und diesen Code eingeben:

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

Um das resultierende Protokoll zu visualisieren, habe ich hotshot2cachegrind verwendet:

Es gibt aber auch andere Möglichkeiten:

Joshua Pokotilow
quelle
3

Wenn die Ansichten nicht HTML sind, z. B. JSON, verwenden Sie einfache Middleware-Methoden für die Profilerstellung.

Hier einige Beispiele:

https://gist.github.com/1229685 - Erfassung aller SQL-Aufrufe wurde in die Ansicht aufgenommen

https://gist.github.com/1229681 - Profil aller Methodenaufrufe, die zum Erstellen der Ansicht verwendet wurden

Evgeny
quelle
0

Ich musste kürzlich eine Django-App profilieren und habe viele dieser Vorschläge ausprobiert. Stattdessen habe ich pyinstrument verwendet , das mit einem einzigen Update der Middleware-Liste zu einer Django-App hinzugefügt werden kann und eine stapelbasierte Ansicht der Timings bietet.

Kurze Zusammenfassung meiner Erfahrungen mit einigen anderen Tools:

  • Die Django Debug Toolbar ist großartig, wenn das Problem auf SQL-Abfragen zurückzuführen ist, und funktioniert gut in Kombination mitpyinstrument
  • Django-Seide funktioniert gut, erfordert jedoch das Hinzufügen eines Kontextmanagers oder Dekorators zu jedem Teil des Stapels, in dem Sie Zeitpunkte für Unteranforderungen wünschen. Es bietet auch eine einfache Möglichkeit, auf cProfileTimings zuzugreifen, und zeigt automatisch Ajax-Timings an, die beide sehr hilfreich sein können.
  • djdt-flamegraph sah vielversprechend aus, aber die Seite wurde auf meinem System nie wirklich gerendert.

Im Vergleich zu den anderen Tools, die ich ausprobiert habe, pyinstrumentwar die Installation und Verwendung erheblich einfacher.

Tony S Yu
quelle