Profilowanie Django

100

Moja aplikacja django stała się boleśnie powolna podczas produkcji. Prawdopodobnie jest to spowodowane złożonymi lub niezindeksowanymi zapytaniami.

Czy jest jakiś django sposób na profilowanie mojej aplikacji?

sharjeel
źródło

Odpowiedzi:

81

Wypróbuj pasek narzędzi debugowania Django . Pokaże Ci, jakie zapytania są wykonywane na każdej stronie i ile czasu one zajmują. To naprawdę przydatne, potężne i łatwe w użyciu narzędzie.

Przeczytaj również zalecenia dotyczące wydajności Django w optymalizacji dostępu do bazy danych z dokumentacji.

Oraz wskazówki dotyczące wydajności Django autorstwa Jacoba Kaplan-Mossa.

Srebrne światło
źródło
13
Uważaj na pasek narzędzi debugowania Django - wyłączyłem go podczas programowania, a renderowanie strony było znacznie szybsze na moim laptopie (co prawda o niskim poborze mocy) - spójrz na serwer deweloperski, aby zobaczyć, ile danych pobierasz.
Dominic Rodger
2
django-debug-toolbar pomaga mi zobaczyć, ile zapytań django-orm trafia do bazy danych, i możemy zobaczyć, jak funkcja select_related () radzi sobie z mniejszym trafieniem.
panchicore
11
@ dominic-rodger Nie zdawałem sobie sprawy, o ile wolniej działał pasek narzędzi debugowania. Moje zapytania sql były małe (30 ms), ale czas procesora był bardzo długi (800 ms). Inna strona, którą stroiłem, miała czasy sql 300 ms, a czas procesora 8000 ms - więc nadal próbowałem znaleźć źródło problemu. Wyłączenie paska narzędzi Django przyspieszyło działanie. 3 lata później nadal aktualne.
Esteban
2
@Esteban, wielkie dzięki za ten komentarz, dosłownie szalałem z powodu absurdalnie dużej ilości czasu procesora, który zajął pasek narzędzi dhango. Z profilowaniem django czas procesora wynosił około 30 sekund, po usunięciu spadł do 1,5 sekundy !!
noob Mama
28

Po prostu wpisz w google „django-profiling”, a otrzymasz te linki (i nie tylko):

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/

Osobiście używam metody oprogramowania pośredniego - tj. Każdy użytkownik może przełączać flagę „profilowania” przechowywaną w sesji, a jeśli moje oprogramowanie pośredniczące do profilowania zauważy, że flaga została ustawiona, używa modułu hotshot w języku Python w następujący sposób:

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

EDYCJA: Do profilowania zapytań SQL http://github.com/robhudson/django-debug-toolbar wspomniane przez Konstantina to fajna rzecz - ale jeśli twoje zapytania są naprawdę wolne (prawdopodobnie dlatego, że są ich setki lub tysiące), Będziesz czekać szaloną ilość czasu, aż zostanie załadowana do przeglądarki - a wtedy przeglądanie będzie trudne z powodu spowolnienia. Ponadto django-debug-toolbar z założenia nie jest w stanie zapewnić użytecznego wglądu w wewnętrzne elementy żądań AJAX.

EDIT2: django-extensions ma wbudowane świetne polecenie profilujące:

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

Po prostu zrób to i voila:

$ mkdir /tmp/my-profile-data
$ ./manage.py runprofileserver --kcachegrind --prof-path=/tmp/my-profile-data
Tomasz Zieliński
źródło
7
code.google.com/p/django-profile to aplikacja django dla profilu użytkownika. nie jest używany jako django do profilowania :)
dzen
1
@dzen: Hah, słuszna uwaga, tak miało być: code.google.com/p/django-profiling :-)
Tomasz Zieliński
1
jeśli zastanawiasz się, jak czytać zrzuty profilera po uruchomieniu python manage.py runprofileserver --prof-path=/path/to/dir, śledź ten blog: darkcoding.net/software/profiling-django-for-cpu-bound-apps .
Neara
ach tak, moim ulubionym jest użycie Google do znalezienia jednej z najpopularniejszych odpowiedzi na moje zapytanie: „po prostu wygoogluj to, co wyszukałeś w Google, aby się tu dostać”
Anna,
Zauważ, że hotshotzostał wycofany i usunięty w Pythonie 3, więc ta odpowiedź i ProfilingDjangostrona Wiki mogą nie być już aktualne w 20202.
Patryk Bratkowski
16

W celu profilowania dostępu do danych (czyli tam, gdzie najczęściej występuje wąskie gardło), wypróbuj django-live-profiler . W przeciwieństwie do Django Debug Toolbar zbiera dane ze wszystkich żądań jednocześnie i możesz uruchomić go w środowisku produkcyjnym bez zbytniego obciążenia wydajności lub ujawniania wewnętrznych elementów aplikacji.

Sprawdź ten zrzut ekranu

atereshkin
źródło
19
nie obsługuje wersji 1.6 i nowszych, brak aktywności przez ponad rok.
Han He
14

Bezwstydna wtyczka tutaj, ale ostatnio zrobiłem w tym celu https://github.com/django-silk/silk . Jest trochę podobny do paska narzędzi django, ale z historią, profilowaniem kodu i bardziej szczegółową kontrolą nad wszystkim.

Michael
źródło
Uzyskiwanie problemu z oprogramowaniem pośrednim „Nie znaleziono programów obsługi dla rejestratora„ silk.middleware ””
Naveen Agarwal
5

Dla wszystkich fanów KCacheGrind bardzo łatwo jest używać powłoki w połączeniu z fantastycznym testem Django Clientdo generowania dzienników profili w locie, szczególnie w produkcji. Używałem tej techniki już kilkakrotnie, ponieważ ma ona lekki akcent - nie są wymagane żadne nieznośne oprogramowanie pośredniczące ani aplikacje Django innych firm!

Na przykład, aby profilować określony widok, który wydaje się działać wolno, możesz otworzyć powłokę i wpisać ten kod:

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

Aby zwizualizować wynikowy dziennik, użyłem hotshot2cachegrind:

Ale są też inne opcje:

Joshua Pokotilow
źródło
3

Gdy widoki nie są w formacie HTML, na przykład JSON, do profilowania użyj prostych metod oprogramowania pośredniego.

Oto kilka przykładów:

https://gist.github.com/1229685 - przechwytywanie wszystkich wywołań sql trafiło do widoku

https://gist.github.com/1229681 - profiluj wszystkie wywołania metod używane do tworzenia widoku

Evgeny
źródło
0

Musiałem ostatnio profilować aplikację Django i wypróbowałem wiele z tych sugestii. Skończyło się na tym, że zamiast tego użyłem pyinstrument , który można dodać do aplikacji Django za pomocą pojedynczej aktualizacji listy oprogramowania pośredniego i zapewnia widok czasów na stosie.

Krótkie podsumowanie moich doświadczeń z innymi narzędziami:

  • Pasek narzędzi debugowania Django jest świetny, jeśli problem wynika z zapytań SQL i działa dobrze w połączeniu zpyinstrument
  • django-silk działa dobrze, ale wymaga dodania menedżera kontekstu lub dekoratora do każdej części stosu, w której chcesz uzyskać czasy podrzędnych żądań. Zapewnia również łatwy sposób dostępu do cProfileczasów i automatycznie wyświetla czasy Ajax, z których oba mogą być naprawdę pomocne.
  • djdt-flamegraph wyglądał obiecująco, ale strona nigdy nie została wyrenderowana w moim systemie.

W porównaniu z innymi narzędziami, które wypróbowałem, pyinstrumentbył znacznie łatwiejszy w instalacji i obsłudze.

Tony S Yu
źródło