Profiling Django

98

Meu aplicativo django tornou-se dolorosamente lento na produção. Provavelmente é devido a algumas consultas complexas ou não indexadas.

Existe alguma maneira django de criar o perfil de meu aplicativo?

Sharjeel
fonte

Respostas:

77

Experimente o Django Debug Toolbar . Ele mostrará quais consultas são executadas em cada página e quanto tempo levam. É uma ferramenta realmente útil, poderosa e fácil de usar.

Além disso, leia as recomendações sobre o desempenho do Django em Otimização de acesso ao banco de dados na documentação.

E dicas de desempenho do Django por Jacob Kaplan-Moss.

Luz cinza
fonte
13
Cuidado com o Django Debug Toolbar - eu o desliguei durante o desenvolvimento e a renderização da página foi significativamente mais rápida no meu laptop (reconhecidamente de baixo consumo de energia) - olhe no servidor de desenvolvimento para ver quantos dados você está baixando.
Dominic Rodger,
2
django-debug-toolbar me ajuda a ver quantas consultas django-orm acessa o banco de dados, e podemos ver como a função select_related () faz o truque em acertá-la menos.
panchicore
11
@ dominic-rodger Eu não percebi o quão mais lento a barra de ferramentas de depuração tornava o processo. Minhas consultas sql eram pequenas (30 ms), mas o tempo de CPU estava muito alto (800 ms). Outra página que estava ajustando tinha tempos de sql de 300ms e tempo de cpu de 8000ms - então continuei tentando encontrar a origem do problema. Desligar o Django Toolbar acelerou as coisas. 3 anos depois, ainda relevante.
Esteban
2
@Esteban, muito obrigado por este comentário, eu estava literalmente enlouquecendo com a quantidade ridiculamente alta de tempo de CPU que a barra de ferramentas do dhango consumiu. Com o django profiling, o tempo de CPU era de cerca de 30 segundos, uma vez que o removi, ele caiu para 1,5 segundos!
noob Mama
28

Basta digitar "django-profiling" no google, você obterá estes links (e mais):

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/

Pessoalmente, eu estou usando a abordagem de middleware - ou seja, cada usuário pode alternar um "profiling" bandeira armazenado em uma sessão, e se meu perfil de avisos de middleware que uma bandeira foi definido, ele usa de Python hotshot módulo como este:

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

EDITAR: Para criar perfis de consultas SQL http://github.com/robhudson/django-debug-toolbar mencionado por Konstantin é uma coisa boa - mas se suas consultas são realmente lentas (provavelmente porque existem centenas ou milhares delas), então você vai ficar esperando uma quantidade insana de tempo até que seja carregado em um navegador - e então será difícil navegar devido à lentidão. Além disso, django-debug-toolbar é por design incapaz de fornecer informações úteis sobre as partes internas das solicitações AJAX.

EDIT2: django-extensions tem um ótimo comando de criação de perfil integrado:

https://github.com/django-extensions/django-extensions/blob/master/docs/runprofileserver.rst

Basta fazer isso e voila:

$ mkdir /tmp/my-profile-data
$ ./manage.py runprofileserver --kcachegrind --prof-path=/tmp/my-profile-data
Tomasz Zieliński
fonte
7
code.google.com/p/django-profile é um aplicativo django de Perfil de usuário. não é usado como profiling django :)
dzen
1
@dzen: Hah, bom ponto, era para ser: code.google.com/p/django-profiling :-)
Tomasz Zieliński
1
se você quer saber como ler os dumps do profiler após a execução python manage.py runprofileserver --prof-path=/path/to/dir, siga este blog: darkcoding.net/software/profiling-django-for-cpu-bound-apps .
Neara
ah sim, meu favorito, usar o google para encontrar uma das principais respostas à minha consulta é "pesquise no Google o que você pesquisou para chegar aqui"
Anna
Observe que hotshotfoi descontinuado e removido no Python 3, então esta resposta e a ProfilingDjangopágina Wiki podem não ser mais relevantes em 20202.
Patryk Bratkowski
16

Para perfis de acesso a dados (que é onde o gargalo está na maior parte do tempo) verifique django-live-profiler . Ao contrário do Django Debug Toolbar, ele coleta dados em todas as solicitações simultaneamente e você pode executá-lo em produção sem muita sobrecarga de desempenho ou expor o interior do seu aplicativo.

Confira esta imagem

atereshkin
fonte
18
não suporta 1.6 e superior, nenhuma atividade por mais de um ano.
Han He
14

Plug in vergonhoso aqui, mas recentemente fiz https://github.com/django-silk/silk para esse propósito. É um pouco semelhante à barra de ferramentas django, mas com histórico, perfil de código e controle mais refinado sobre tudo.

Michael
fonte
Obtendo problema de middleware 'Nenhum manipulador pôde ser encontrado para logger "silk.middleware"'
Naveen Agarwal
A
criação de
5

Para todos os fãs do KCacheGrind, acho muito fácil usar o shell em conjunto com o teste fantástico do Django Clientpara gerar logs de perfil em tempo real, especialmente na produção. Eu usei essa técnica em várias ocasiões porque ela tem um toque leve - nenhum middleware incômodo ou aplicativos Django de terceiros são necessários!

Por exemplo, para criar o perfil de uma determinada visualização que parece estar lenta, você pode abrir o shell e digitar este código:

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()

Para visualizar o log resultante, usei hotshot2cachegrind:

Mas também existem outras opções:

Joshua Pokotilow
fonte
3

Quando as visualizações não são HTML, por exemplo JSON, use métodos de middleware simples para criação de perfil.

Aqui estão alguns exemplos:

https://gist.github.com/1229685 - captura todas as chamadas sql entradas na visualização

https://gist.github.com/1229681 - perfil de todas as chamadas de método usadas para criar a visualização

Evgeny
fonte
0

Eu precisei criar o perfil de um aplicativo Django recentemente e tentei muitas dessas sugestões. Acabei usando pyinstrument vez , que pode ser adicionado a um aplicativo de Django usando uma única atualização para a lista de middleware e fornece uma visão baseada em pilha dos horários.

Resumo rápido da minha experiência com algumas outras ferramentas:

  • Django Debug Toolbar é ótimo se o problema é devido a consultas SQL e funciona bem em combinação compyinstrument
  • django-silk funciona bem, mas requer a adição de um gerenciador de contexto ou decorador a cada parte da pilha onde você deseja tempos de sub-solicitação. Ele também fornece uma maneira fácil de acessar as cProfiletemporizações e exibe automaticamente as temporizações do Ajax, sendo que ambas podem ser muito úteis.
  • djdt-flamegraph parecia promissor, mas a página nunca foi renderizada no meu sistema.

Comparado com as outras ferramentas que experimentei, pyinstrumentera muito mais fácil de instalar e usar.

Tony S Yu
fonte