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?
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.
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:
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:
quelle
python manage.py runprofileserver --prof-path=/path/to/dir
, folgen Sie diesem Blog: darkcoding.net/software/profiling-django-for-cpu-bound-apps .hotshot
in Python 3 veraltet und entfernt wurde, sodass diese Antwort und dieProfilingDjango
Wiki-Seite im Jahr 20202 möglicherweise nicht mehr relevant sind.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.
quelle
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.
quelle
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:
Um das resultierende Protokoll zu visualisieren, habe ich hotshot2cachegrind verwendet:
Es gibt aber auch andere Möglichkeiten:
quelle
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
quelle
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:
pyinstrument
cProfile
Timings zuzugreifen, und zeigt automatisch Ajax-Timings an, die beide sehr hilfreich sein können.Im Vergleich zu den anderen Tools, die ich ausprobiert habe,
pyinstrument
war die Installation und Verwendung erheblich einfacher.quelle