• Save

Loading…

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

Like this presentation? Why not share!

Django Apps - Do Núcleo a Otimização

on

  • 2,466 views

Como utilizar Profilers para analisar Apps Django. Quando necessário otimizar a performance de uma App, é importante saber onde otimizar, não dispendando tempo para otimizar funções raramente ...

Como utilizar Profilers para analisar Apps Django. Quando necessário otimizar a performance de uma App, é importante saber onde otimizar, não dispendando tempo para otimizar funções raramente usadas ou que não sejam o real problema, é preciso saber em que parte do programa a maior parte do tempo é gasto.

Statistics

Views

Total Views
2,466
Views on SlideShare
2,463
Embed Views
3

Actions

Likes
3
Downloads
4
Comments
0

1 Embed 3

http://www.slideshare.net 3

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Django Apps - Do Núcleo a Otimização Django Apps - Do Núcleo a Otimização Presentation Transcript

  • DJango APPS Do Núcleo a Otimização Leandro Zanuz (lzanuz@ucs.br)
  • Desenvolvendo apps... A aplicação está pronta, tudo funcionando, mas a performance de algumas views está ruim, e agora? É importante ter algo que possa mostrar a execução da view, acessos realizados ao BD, memcache e coisas do tipo, de forma que se possa entender seu funcionamento e realizar as otimizações necessárias.
  • O que fazer...  Saber onde otimizar, não dispendando tempo para otimizar funções raramente usadas ou que não sejam o real problema, é preciso saber em que parte do programa a maior parte do tempo é gasto.  Identificar os pontos de estrangulamento; Melhorar a performance do programa ou diminuir sua utilização de memória (ou às vezes ambos).
  • Como fazer...  Registrar as solicitações e seus tempos tornando possível visualizar o tempo médio que uma determinada solicitação tomou.  Registrar todas as ações do programa (chamadas de funções, acessos a bases de dados, acessos a webservices, etc.)  Analisar os tempos coletados de maneira informativa e de possível classificação.
  • O que utilizar... Profilers são programas que monitoram o tempo e a performance de execução de um programa; Investigam a execução de um programa e recolhem informações para análise crítica;  Fornecem indicadores de onde o tempo está sendo gasto durante sua execução.
  • Python profilers...  cProfile: escrito em C; baixo overhead; ideal para programas extensos; disponível a partir da versão 2.5. hotshot: escrito em C; foco em minimizar o tempo de overhead; a algum tempo não é atualizado; possibilidade de exclusão em futuras versões do Python.
  • Profiling Django apps...  Possibilidade de análisar qualquer URL adicionando um parâmetro ao GET: ?PROF; http://meusite.com.br/projeto/?PROF Inclusão de um middleware para inspeção da requisição, o qual instancia um objeto profile e analisa sua execução;  O resultado é exibido no browser; Se PROF não estiver nos parâmetros GET, a execução ocorrerá normalmente.
  • Middleware... import sys try: import cProfile as profile except ImportError: import profile try: from cStringIO import StringIO except ImportError: import StringIO from django.conf import settings class ProfilerMiddleware(object): def can(self, request): return settings.PROFILING and 'PROF' in request.GET and (not settings.INTERNAL_IPS or request.META['REMOTE_ADDR'] in settings.INTERNAL_IPS) def process_view(self, request, callback, callback_args, callback_kwargs): if self.can(request): self.profiler = profile.Profile() args = (request,) + callback_args return self.profiler.runcall(callback, *args, **callback_kwargs) def process_response(self, request, response): if self.can(request): self.profiler.create_stats() out = StringIO() old_stdout, sys.stdout = sys.stdout, out self.profiler.print_stats(1) sys.stdout = old_stdout response.content = '<pre>%s</pre>' % out.getvalue() return response http://www.pastethat.com/dlnsr
  • Middleware... from django.db import connection class DatabaseProfilerMiddleware(object): def can(self, request): return settings.DEBUG and 'DPROF' in request.GET and (not settings.INTERNAL_IPS or request.META['REMOTE_ADDR'] in settings.INTERNAL_IPS) def process_request(self, request): if self.can(request): self.DEBUG = settings.DEBUG settings.DEBUG = True def process_response(self, request, response): if self.can(request): out = StringIO() out.write('timetsqln') total_time = 0 for query in reversed(sorted(connection.queries, key=lambda x: x['time'])): total_time += float(query['time'])*1000 out.write('%st%sn' % (query['time'], query['sql'])) response.content = '<pre style="white-space:pre-wrap">%d queries executed in %.3f secondsnn%s</pre>' % (len(connection.queries), total_time/1000, out.getvalue()) settings.DEBUG = self.DEBUG return response http://www.pastethat.com/dlnsr
  • Django Settings... MIDDLEWARE_CLASSES = ( ... 'apps.ProfilerMiddleware', 'apps.DatabaseProfilerMiddleware', ... )
  • Profiler log... 19743 function calls (19238 primitive calls) in 0.064 CPU seconds Ordered by: internal time ncalls tottime percall cumtime percall filename:lineno(function) 2 0.025 0.013 0.026 0.013 calculo.py:4(calculo_m2) 1 0.001 0.001 0.002 0.002 connections.py:44(__init__) 243 0.001 0.000 0.001 0.000 {isinstance} 24/8 0.001 0.000 0.002 0.000 copy.py:144(deepcopy) 3/1 0.000 0.000 0.003 0.003 __init__.py:256(parse) 6 0.000 0.000 0.001 0.000 __init__.py:501(__init__) 29 0.000 0.000 0.001 0.000 encoding.py:59(force_unicode) 1 0.000 0.000 0.001 0.001 debug.py:10(tokenize) ... ncalls: número de chamadas tottime: tempo total gasto na função (excluindo o tempo gasto em chamadas as sub-funções) percall: quociente de tottime por ncalls cumtime: tempo total gasto na função e todas as sub-funções (desde a invocação até ao retorno) percall: quociente de percall por ncalls filename lineno(function): referência à função
  • Kcachegrind...  Kcachegrind é uma aplicação KDE que possibilita uma melhor interpretação e análise dos resultados; Para transformar os resultados coletados pelo hotshot compatíveis ao Kcachegrind pode utilizar o hotshot2calltree. apt-get install kcachegrind-converters hotshot2calltree arquivo.prof > cachegrind.out  Para converter logs do cProfile pode-se utilizar o script: http://www.gnome.org/~johan/lsprofcalltree.py
  • Resultado no Kcachegrind...
  • Perguntas? Leandro Zanuz lzanuz@ucs.br