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!

Melhorando a performance de aplicações Django

on

  • 2,110 views

 

Statistics

Views

Total Views
2,110
Views on SlideShare
2,109
Embed Views
1

Actions

Likes
3
Downloads
28
Comments
0

1 Embed 1

https://www.linkedin.com 1

Accessibility

Upload Details

Uploaded via as Apple Keynote

Usage Rights

CC Attribution License

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
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • cliente ligndo, indignado pq o site naum responde <br />
  • &#xE9; a forma de vc exibir o site sem precisar processar o seu conteudo a cada requisi&#xE7;&#xE3;o <br />
  • <br />
  • h&#xE1; os seguintes mecanismos para cachear o site <br />
  • h&#xE1; os seguintes mecanismos para cachear o site <br />
  • h&#xE1; os seguintes mecanismos para cachear o site <br />
  • h&#xE1; os seguintes mecanismos para cachear o site <br />
  • h&#xE1; os seguintes mecanismos para cachear o site <br />
  • A raz&#xE3;o real &#xE9; 1/cull_percentage, ent&#xE3;o configure o cull_percentage=2 para limpar metadae das entradas quando o valor de max_entries for atingido. <br />
  • A raz&#xE3;o real &#xE9; 1/cull_percentage, ent&#xE3;o configure o cull_percentage=2 para limpar metadae das entradas quando o valor de max_entries for atingido. <br />
  • A raz&#xE3;o real &#xE9; 1/cull_percentage, ent&#xE3;o configure o cull_percentage=2 para limpar metadae das entradas quando o valor de max_entries for atingido. <br />
  • <br />
  • middleware &#xE9; uma forma de processar informa&#xE7;&#xF5;es adicionais no request/response <br />
  • <br />
  • para cachear umas parte do template <br />
  • <br />
  • o add faz a mesma coisa q o set, mas o set atualiza os valores de uam chave <br />
  • <br />
  • GzipMiddleware: Comprime conte&#xFA;dos para navegadores que entendem compress&#xE3;o gzip (todos os navegadores modernos). <br /> &#xC9; sugerido coloc&#xE1;-lo em primeiro na lista de middlewares, desta forma a compress&#xE3;o do conte&#xFA;do de resposta ser&#xE1; a &#xFA;ltima coisa a ser feita. N&#xE3;o ser&#xE3;o comprimidos conte&#xFA;dos menores que 200 bytes, quando o c&#xF3;digo de resposta for diferente de 200, quando arquivos JavaScript (para compatibilidade com IE), ou quando as respostas possuem o cabe&#xE7;alho Content-Encoding j&#xE1; especificado. <br /> ConditionaMiddleware <br /> Manipula opera&#xE7;&#xF5;es condicionais do GET. Se a resposta tem um cabe&#xE7;alho ETag ou Last-Modified, e a requisi&#xE7;&#xE3;o possui If-None-Match ou If-Modified-Since, a resposta &#xE9; substitu&#xED;da por um HttpNotModified`. <br /> Tamb&#xE9;m define os cabe&#xE7;alhos de resposta Date e Content-Length. <br />
  • Monitorar o tempo e de execu&#xE7;&#xE3;o de uma determinada e&#xE7;&#xE3;o de c&#xF3;digo <br /> fornece indicadores de quanto tempo est&#xE3;o demorando para executar cada trecho de c&#xF3;digo <br />
  • cProfile: desde a ver&#xE3;o 2.5. Escrito em C, baixo overhead, idela para programas extensos <br /> profile: Interface baseada do cProfile mas em Pythonpuro <br /> hotshot: escrito em C, o foco &#xE9; minimizar o tempo de overhead; faz um tempo q naum &#xE9; atualizado e pode sair nas futuras vers&#xF5;es do python <br />
  • cProfile: desde a ver&#xE3;o 2.5. Escrito em C, baixo overhead, idela para programas extensos <br /> profile: Interface baseada do cProfile mas em Pythonpuro <br /> hotshot: escrito em C, o foco &#xE9; minimizar o tempo de overhead; faz um tempo q naum &#xE9; atualizado e pode sair nas futuras vers&#xF5;es do python <br />
  • cProfile: desde a ver&#xE3;o 2.5. Escrito em C, baixo overhead, idela para programas extensos <br /> profile: Interface baseada do cProfile mas em Pythonpuro <br /> hotshot: escrito em C, o foco &#xE9; minimizar o tempo de overhead; faz um tempo q naum &#xE9; atualizado e pode sair nas futuras vers&#xF5;es do python <br />
  • te v&#xE1;rios exemplso de profilings no djangosnippets <br />
  • te v&#xE1;rios exemplso de profilings no djangosnippets <br />
  • te v&#xE1;rios exemplso de profilings no djangosnippets <br />
  • te v&#xE1;rios exemplso de profilings no djangosnippets <br />
  • ncalls: numero de chamadas <br /> tottime: tempo total gasto na fun&#xE7;&#xE3;o <br /> percall: quociente do tottime por ncals <br /> cumtime: tempo total gasto na fun&#xE7;&#xE3;o e todas as sub-fun&#xE7;&#xF5;es (desde a invoca&#xE7;&#xE3;o at&#xE9; o retorno) <br /> middlewares no djangosnippets <br />
  • <br />
  • prequi&#xE7;sas: exemplo do all().filter(sss).filter()[:10] <br /> S&#xE3;o avalaidas quando s&#xE3;o iteradas, separadas <br /> cada quary conteum uma cache, e ela fica <br />
  • prequi&#xE7;sas: exemplo do all().filter(sss).filter()[:10] <br /> S&#xE3;o avalaidas quando s&#xE3;o iteradas, separadas <br /> cada quary conteum uma cache, e ela fica <br />
  • prequi&#xE7;sas: exemplo do all().filter(sss).filter()[:10] <br /> S&#xE3;o avalaidas quando s&#xE3;o iteradas, separadas <br /> cada quary conteum uma cache, e ela fica <br />
  • s&#xF3; &#xE9; executado na segunda vez <br />
  • <br />
  • <br />
  • Muitas vezes voc&#xEA; n&#xE3;o precisa de todos os dados do objeto <br /> o values() transforam o objeto em uma lista de dicionarios <br /> o values list, ums lista de tuplas com somente os valores <br /> <br /> Geralmente, usando select_related () pode melhorar consideravelmente o desempenho, pois sua aplica&#xE7;&#xE3;o pode evitar muitas chamadas de dados.No entanto, em situa&#xE7;&#xF5;es com conjuntos de rela&#xE7;&#xF5;es profundamente aninhadas select_related () &#xE0;s vezes pode acabar seguindo "demais" as rela&#xE7;&#xF5;es, e pode gerar consultas t&#xE3;o grande que eles acabam sendo lenta. <br /> <br />
  • django-debug-toolbar: ver SQLs <br /> django-command-extensions: possui o profile atrav&#xE9;s de um servidor, starta o servidor e ele gera os arquivos <br />
  • django-debug-toolbar: ver SQLs <br /> django-command-extensions: possui o profile atrav&#xE9;s de um servidor, starta o servidor e ele gera os arquivos <br />
  • a Leah flw na sua apresenta&#xE7;&#xE3;o <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />

Melhorando a performance de aplicações Django Melhorando a performance de aplicações Django Presentation Transcript

  • Melhorando a performance de aplicações Django Marcos Daniel Petry @petry
  • Botando uma aplicação no ar
  • Botando uma aplicação no ar python manage.py runserver ok!
  • Botando uma aplicação no ar python manage.py runserver ok! Aplicação no servidor HTTP sem usuários? ok!
  • Botando uma aplicação no ar python manage.py runserver ok! Aplicação no servidor HTTP sem usuários? ok! com alguns acessos? humm.. é...
  • Botando uma aplicação no ar python manage.py runserver ok! Aplicação no servidor HTTP sem usuários? ok! com alguns acessos? humm.. é... muitos acessos? ...
  • Cache
  • Como a cache funciona?
  • Como a cache funciona? dada uma determinada url se a url for encontrada no cache: envia a página cacheada se não: gere a página guarde a página gerada no cache retorne a página gerada
  • Configurar cache
  • Configurar cache Memcache CACHE_BACKEND = 'memcached://127.0.0.1:11211/' CACHE_BACKEND = 'memcached://172.19.26.240:11211;172.19.26.242:11211/'
  • Configurar cache Memcache CACHE_BACKEND = 'memcached://127.0.0.1:11211/' CACHE_BACKEND = 'memcached://172.19.26.240:11211;172.19.26.242:11211/' Banco de Dados CACHE_BACKEND = 'db://my_cache_table'
  • Configurar cache Memcache CACHE_BACKEND = 'memcached://127.0.0.1:11211/' CACHE_BACKEND = 'memcached://172.19.26.240:11211;172.19.26.242:11211/' Banco de Dados CACHE_BACKEND = 'db://my_cache_table' FileSystem CACHE_BACKEND = 'file:///var/tmp/django_cache'
  • Configurar cache Memcache CACHE_BACKEND = 'memcached://127.0.0.1:11211/' CACHE_BACKEND = 'memcached://172.19.26.240:11211;172.19.26.242:11211/' Banco de Dados CACHE_BACKEND = 'db://my_cache_table' FileSystem CACHE_BACKEND = 'file:///var/tmp/django_cache' Memória CACHE_BACKEND = 'locmem:///?timeout=30&max_entries=400'
  • Configurar cache Memcache CACHE_BACKEND = 'memcached://127.0.0.1:11211/' CACHE_BACKEND = 'memcached://172.19.26.240:11211;172.19.26.242:11211/' Banco de Dados CACHE_BACKEND = 'db://my_cache_table' FileSystem CACHE_BACKEND = 'file:///var/tmp/django_cache' Memória CACHE_BACKEND = 'locmem:///?timeout=30&max_entries=400' Dummy Cache CACHE_BACKEND = 'dummy://'
  • Configurar cache
  • Configurar cache timeout: Tempo de duração da página cacheada
  • Configurar cache timeout: Tempo de duração da página cacheada max_entries: o número máximo de entradas permitidas no cache antes dos valores antigos serem removidos.
  • Configurar cache timeout: Tempo de duração da página cacheada max_entries: o número máximo de entradas permitidas no cache antes dos valores antigos serem removidos. cull_frequency: A fração de entradas que são limpas do cache quando o max_entries é atingido.
  • Níveis de Cache
  • Níveis de Cache • Site • View • Template • + baixo nível
  • Cache por Site titulo tosco, melhorar MIDDLEWARE_CLASSES = ( 'django.middleware.cache.UpdateCacheMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.cache.FetchFromCacheMiddleware', ) CACHE_MIDDLEWARE_SECONDS = 60 * 15 CACHE_MIDDLEWARE_KEY_PREFIX = "site_cache"
  • Cache por View from django.views.decorators.cache import cache_page @cache_page(60 * 15) def my_view(request): ...
  • Cache de templates {% load cache %} {% cache 500 sidebar %} .. sidebar .. {% endcache %}
  • Cache em situações específicas {% load cache %} {% cache 500 sidebar request.user.username %} .. sidebar for logged in user .. {% endcache %}
  • Descendo um pouco mais o nivel... trocar titulo anotar o qe faz cada método • cache.set(‘key’,‘value’) • cache.add(‘key’,‘value’) • cache.get(‘key’) • cache.delete(‘key’) • cache.clear()
  • Invalidar Cache from django.core.signals import post_save from django.core.cache import cache def invalidate_cache(sender, **kwargs): cache.delete(sender.get_absolute_url()) post_save.connect(invalidate_cache, sender=Post)
  • Middlewares
  • Middlewares django.middleware.gzip.GZipMiddleware django.middleware.http.ConditionalGetMiddleware
  • Profiling: otimizando seções críticas
  • Profiling
  • Profiling • cProfile
  • Profiling • cProfile • profile
  • Profiling • cProfile • profile • HotShot
  • Profiling no Django
  • Profiling no Django • Analizar qualquer url através de um parametro passado via GET
  • Profiling no Django • Analizar qualquer url através de um parametro passado via GET • http://meusite.com.br/?prof
  • Profiling no Django • Analizar qualquer url através de um parametro passado via GET • http://meusite.com.br/?prof • Adicionar uma middleware que executa o profile sempre que houver a variavel “prof”
  • Profiling no Django • Analizar qualquer url através de um parametro passado via GET • http://meusite.com.br/?prof • Adicionar uma middleware que executa o profile sempre que houver a variavel “prof” • Exibir o resultado no browser
  • Otimização de Querysets
  • Otimização de Querysets É importante saber:
  • Otimização de Querysets É importante saber: • que as querysets são preguiçosas
  • Otimização de Querysets É importante saber: • que as querysets são preguiçosas • quando elas são avaliadas
  • Otimização de Querysets É importante saber: • que as querysets são preguiçosas • quando elas são avaliadas • como os dados ficam na memória
  • Otimização de Querysets >>> queryset = Post.objects.all() >>> print [p.titulo for p in queryset] >>> print [p.data for p in queryset]
  • Otimização de Querysets
  • Otimização de Querysets • QuerySet.only() • QuerySet.defer() • QuerySet.extra()
  • Otimização de Querysets • QuerySet.only() • QuerySet.defer() • QuerySet.extra()
  • Otimização de Querysets
  • Otimização de Querysets • QuerySet.values() • QuerySet.values_list() • QuerySet.select_related()
  • Ferramentas Externos
  • Ferramentas Externos • django-debug-toolbar
  • Ferramentas Externos • django-debug-toolbar • django-command-extensions
  • Outras dicas
  • Outras dicas • Separe as coisas: • Aplicação • Mídia estática • Banco de Dados
  • Outras dicas • Separe as coisas: • Aplicação • Mídia estática • Banco de Dados • CSS Sprites
  • Outras dicas • Separe as coisas: • Aplicação • Mídia estática • Banco de Dados • CSS Sprites • Diminuir CSS e Javascripts
  • Django escala? • Amanhã, 15:00 nesse auditório =)
  • Muito obrigado! • marcospetry@gmail.com • http://mdpetry.net • @petry