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?

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.


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

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


19
nie obsługuje wersji 1.6 i nowszych, brak aktywności przez ponad rok.
Han He


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:



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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.