Profilowanie widoków Django z wykorzystaniem KCacheGrind

Middleware do profilowania za pomocą hotshot i kcachegrind

Stosując django-command-extensions możemy profilować Django działające na serwerze deweloperskim generując zarazem gotowe logi dla KCacheGrinda.
djangokcachegrind
Należy zainstalować django-command-extensions (pobierając wersję z repozytorium) poleceniem:
python setup.py install
Po czym dodać do INSTALLED_APPS naszego projektu aplikację:
'django_extensions',
Od tej chwili możemy uruchomić naszą aplikację poleceniem:
python manage.py runprofileserver --kcachegrind --prof-path=/katalog/na/logi/
I otworzyć w przeglądarce interesujący nas widok, by otrzymać gotowe pliki logów.

Proste profilowanie widoku

Poniżej przedstawiam nieco starsze rozwiązanie. Na djangosnippets znajdziemy middleware umożliwiające profilowanie widoków.
import sys
import hotshot, tempfile
import hotshot.stats
from django.conf import settings
from cStringIO import StringIO

class ProfileMiddleware(object):
    def process_request(self, request):
        if settings.DEBUG and request.has_key('prof'):
            self.tmpfile = tempfile.NamedTemporaryFile()
            self.prof = hotshot.Profile(self.tmpfile.name)

    def process_view(self, request, callback, callback_args, callback_kwargs):
        if settings.DEBUG and request.has_key('prof'):
            return self.prof.runcall(callback, request, *callback_args, **callback_kwargs)

    def process_response(self, request, response):
        if settings.DEBUG and request.has_key('prof'):
            self.prof.close()

            out = StringIO()
            old_stdout = sys.stdout
            sys.stdout = out

            stats = hotshot.stats.load(self.tmpfile.name)
            #stats.strip_dirs()
            stats.sort_stats('time', 'calls')
            stats.print_stats()

            sys.stdout = old_stdout
            stats_str = out.getvalue()

            if response and response.content and stats_str:
                response.content = "<pre>" + stats_str + "</pre>"

        return response
Zapisujemy do pliku w katalogu projektu django i dodajemy wpis do MIDDLEWARE_CLASSES w settings.py. Wywołanie widoku spowoduje utworzenie pliku tymczasowego (pod Linuksem w /tmp z logiem profilera hotshot). By wyświetlić wyniki dodaj do URL ?prof (lub &prof). Plik z danymi profilera hotshot możemy przekonwertować na logi dla cachegrinda:
hotshot2calltree tmp* > cachegrind.out.01
Logi cachegrinda można obejżeć w KCacheGrind lub WinGrind.
middleware_prof
middleware_prof1
blog comments powered by Disqus

Kategorie

Strony