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:
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.
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
python manage.py runprofileserver --prof-path=/path/to/dir
, śledź ten blog: darkcoding.net/software/profiling-django-for-cpu-bound-apps .
hotshot
został wycofany i usunięty w Pythonie 3, więc ta odpowiedź i ProfilingDjango
strona Wiki mogą nie być już aktualne w 20202.
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.
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.
Dla wszystkich fanów KCacheGrind bardzo łatwo jest używać powłoki w połączeniu z fantastycznym testem Django Client
do 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:
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
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:
pyinstrument
cProfile
czasów i automatycznie wyświetla czasy Ajax, z których oba mogą być naprawdę pomocne.W porównaniu z innymi narzędziami, które wypróbowałem, pyinstrument
był znacznie łatwiejszy w instalacji i obsłudze.