livingintheshell : Ferramentas de Profiling - Django

Profile First

"Profile First", Django Docs

Não aplique soluções aleatoriamente, descubra o gargalo, meça, compare o ganho.

A seguir uma lista de ferramentas que você pode usar para fazer profilling de aplicações Django.

Django Debug-Toolbar

Github | Docs

O Django Debug-Toolbar é a ferramenta mais famosa para profilling com Django. Possui uma série de painéis (que são extensíveis), mostrando informações diversas de profilling, como o tempo de geração da página e número de consultas.

/static/images/profiling/toolbar.png

Django devserver

Github

O Django devserver mostra as informações na saída padrão do manage.py runserver, também é extensível, possui por exemplo, profilling de consultas, memória, tempo de geração da página.

/static/images/profiling/devserver.png

Django extensions

Github | Docs

O Django extensions é uma app que traz diversas utilidades, uma delas é um profiler que gera output no formato do cProfile de um ciclo de requisição, que pode ser lido com o módulo pstats. O mais legal do Django extensions é que há a opção de formatar o output no formato do kcachegrind, facilitando muito a visualização.

Ele é especialmente útil em casos que o gargalo não é nas consultas. Com ele é fácil visualizar quais funções e métodos estão tomando mais tempo.

Ex:

python manage.py runprofileserver --kcachegrind --prof-path=/tmp/my-profile-data

Exemplo de output com o kcachegrind

/static/images/profiling/kcachegrind.jpg

Middleware de profilling

djangosnippets

Há vários middleware de profilling, que podem ser encontratos no djangosnippets. Eles basicamente mostram na tela do navegador o resultado, no formato do cProfile. Também é possível ver número de consultas, consultas repetidas etc.

Algo interessante desse tipo de método, é que pode ser executado em ambiente de homologação, sem que atrapalhe a visualização dos dados ou que exija modificação no deploy.

/static/images/profiling/profile_middleware.png

No shell: Ipython

nbviewer

Para diversas itens pontuais, o shell do django com o Ipython ajuda muito. Com o comando %prun, ele gera o output no formato do cProfile, é muito fácil de usar e útil para por exemplo, achar gargalos de uma função específica.

Ex:

%prun alguma_funcao()

Outra função útil, dessa vez do django é o db.connection.queries, que mostra as consultas executadas no contexto atual, fica fácil ver se um método específico está gerando mais consultas que deveria.

/static/images/profiling/prun.png

Conclusão

Esse post não tem grandes pretensões além de listar ferramentas de profilling para o Django. Fazer profilling é importante, com o ORM Django, é fácil gerar consultas desnecessárias e repetidas, o que pode influenciar na experiência do usuário, mesmo em serviços com pouquíssimo acesso.

Em uma próxima postagem, pretendo mostrar, uma vez identificado os gargalos, técnicas disponíveis no Django para contorná-los.

Fernando Rocha is a passionate developer with interests in Python, Web development and Infrastructure. You can find him on twitter.
comments powered by Disqus