Profilowanie Django

Badamy wydajność aplikacji django z wykorzystaniem hotshot, mod_python i kcachegrind.

hotshot to profiler dostępny w pythonie. Django posiada zmodyfikowany handler dla mod_python generujący logi hotshota. Dzięki tym logom możemy dowiedzieć się ile czasu zajmuje wykonanie poszczególnych elementów aplikacji.

Wymagania

By móc profilować aplikację django musi ona działać pod Apache poprzez mod_python. Oto prosta konfiguracja:
Alias /media/ "/ścieżka/django/contrib/admin/media/"
Alias /site_media/ "/ścieżka/site_media/"
<Location "/">
    SetHandler python-program
    PythonHandler django.core.handlers.profiler-hotshot
    SetEnv DJANGO_SETTINGS_MODULE settings
    PythonPath "['/ścieżka/do/aplikacji/'] + sys.path"
    PythonDebug On
</Location>
<Location "/site_media">
SetHandler none
</Location>
Różnica to:
PythonHandler django.core.handlers.profiler-hotshot
Zamiast:
PythonHandler django.core.handlers.modpython

Logi zapisywane są domyślnie w /var/log/cmsprofile i katalog ten musi istnieć a apache mieć prawa zapisu. Gdy już wszystko gotowe wystarczy wywołać stronę aplikacji django w przeglądarce. Dla każdego wywołania zapisany zostanie oddzielny plik (ukryty, zaczynający się od kropki).
Pojawiło się też middleware wykorzystujące hotshot do generowania logów dla danego widoku

Generowalnie logów Kcachegrind

kcachegrind to aplikacja KDE do analizy logów profilerów. Istnieje również Wingrind, lecz nie wiem czy potrafi on konwertować logi hotshot do obsługiwanego formatu. Kcachegrind umożliwia konwersję, wystarczy wykonać w konsoli:
hotshot2calltree plik.prof > cachegrind.out.01
I otrzymamy plik obsługiwany przez samą aplikację. Efekt:
djangoprof
djangoprof2


Jak używać hotshot

Jeżeli chcesz profilować swój skrypt wystarczy taki kod:
import hotshot
prof = hotshot.Profile("plik.prof")
prof.start()
#tutaj wykona swój kod
prof.stop()
Plik *prof konwertujemy w ten sam sposób.
blog comments powered by Disqus

Kategorie

Strony