SlideShare uma empresa Scribd logo
1 de 27
Baixar para ler offline
Otimizando Portais Plone: Dicas de Desempenho




         Douglas Soares de Andrade
             PyCon 4 - Setembro/2008
Licença de Uso
Esta apresentação está sendo disponibilizada pela
licença GNU/FDL e lhe dá todos os direitos para cópia e
utilização de todo o conteúdo, desde que você mantenha
os créditos ao autor original.
Problemas e Mitos

• Zope/Plone não funcionam para grandes
  Portais
• Zope não utiliza recursos de máquinas
  multiprocessadas
• Quem ouviu falar de Python ?!
  Zope/Plone ?!
• Principal: Aplicações Zope/Plone não são
  iguais (no sentido de gerenciamento e
  manutenção) a aplicações PHP !!!!!!
Problemas (Casa do Horrores)
Problema 01: Instâncias no “Front”

• Instâncias Zope/Plone sendo acessadas
  diretamente (instâncias “Rambo”)
Solução 01: Instâncias no “Front”

• Utilizar um servidor de cache (squid/varnish)
  – É tão importante no mundo Zope quanto o
    controle de versão no mundo do
    desenvolvimento


• Aumento exponencial da performance
Problema 02: Alta disponibilidade

• Várias pessoas afirmam que NÃO é
  possível desenvolver soluções de alta
  disponibilidade com o Zope
• Ops, problemas de hardware. Portal fora ?
Solução 02: Alta disponibilidade

• Até pouco tempo, não era possível (Sem
  utilizar ferramentas opensource e gratuitas)
• Felizmente isso mudou com o RelStorage
  (palestra do Rogério)
• O que isso tem a ver com performance ?
Problema 03: Arquivos no ZODB

• Arquivos enormes sendo armazenados
  diretamente no ZODB
Solução 03: Arquivos no ZODB

• Utilizar o produto FileSystemStorage para
  armazenar os arquivos no sistema de
  arquivos do servidor ou em um ponto de
  rede (cuidado com pontos de falha)
Problema 04: Códigos

• Códigos que utilizam getObject para pegar
  informações simples que estão disponíveis
  nos indices do catálogo
• Pense no problema anterior (arquivos de
  50mb, 100mb) sendo acessados via
  getObject para pegar apenas o título do
  Objeto
Solução 04: Códigos

• Utilizar getObject apenas em último caso
• Em todos os outros casos, utilize as
  informações que já estão disponíveis no
  catálogo ou crie novos indices (imagens)
• Sempre ter cuidado com a mega ultra power
  resolução de um problema
Problema 05: Infraestrutura não otimizada

• Alguns administradores costumam criar
  ambientes com as configurações “de
  fábrica” e não se preocupam com a
  performance por causa do mito:

  – Zope é lento mesmo ! Não adianta mexer em
    nada (Castas)
Solução 05: Infraestrutura não otimizada

• Otimização prematura é a causa de todo o
  mal !
• É preciso analisar cuidadosamente a
  arquitetura e todos os componentes que
  deverão ser utilizados
• Exemplo:
  – Squid
    • Cache Peers
    • Storage (UFS)
    • Tamanho de objetos a serem cacheados
Problema 06: Servers Multiprocessados
• Zope com apenas uma instância não utiliza
  diversos cores
• 100% em um core e 0% nos outros 15
• O cliente não quer saber do GIL do python e
  sim de uma solução...
Solução 06: Servers Multiprocessados

• … que existe !
• Utilize um servidor ZEO com várias
  instâncias (cuidado com isso !) e deixe o
  kernel determinar pra onde cada processo
  vai
• Eu quero determinar pra qual core o meu
  processo vai – taskset (afinidade)
Problema 07: Profilers Esquecidos

• Legal ! Você utilizou um profiler para
  determinar onde estava o problema de
  performance
• Só que... Ele ficou lá =)
Solução 07: Profilers Esquecidos

• Tatuar no braço: “Eu desabilito o meu
  profiler “ =)
• Sempre lembre de desabilitar o profiler
  quando o portal for para produção
Problema 08: O quase off-topic

• Toma-que-é-teu
Solução 08: O quase off-topic

• Preparar a equipe para administrar
  Zope/Plone
• O Zope é carente – Ele precisa de carinho e
  acompanhamento constante (na verdade,
  apenas até que a solução estabilize)
• Por fim: Novamente, Zope não é PHP !!
Outras Dicas Valiosas

• Essa veio do Youtube, mas cai como uma
  luva: Cada um no seu quadrado !
• Utilize Varnish (“O” server de cache) =)
Outras Dicas Valiosas

• O diagrama do “Quadrado” =)
E se nada resolver ?!

• Utilize deploy estático
  – Utilize nginx
  – Frozer (Weimar)
  – Chute (não testado – “wget -m”)
Agradecimentos
Agradecimentos
Fala que eu te escuto =)
Contato


Email   :   douglas@archlinux.org
            douglas.andrade@3pw.com.br

MSN    :    douglas@tuxfamily.org
Jabber :    dsandrade@jabber.org
Gtalk :     dsandrade@gmail.com



        Muito Obrigado =)

Mais conteúdo relacionado

Mais procurados

TDD em django sem desculpas versao fisl
TDD em django sem desculpas versao fislTDD em django sem desculpas versao fisl
TDD em django sem desculpas versao fislAdriano Petrich
 
Atendendo Milhares de Requisições com o Play Framework 2 - v2
Atendendo Milhares de Requisições com o Play Framework 2 - v2Atendendo Milhares de Requisições com o Play Framework 2 - v2
Atendendo Milhares de Requisições com o Play Framework 2 - v2Paulo Siqueira
 
Como lidar com cargas de trabalho mistas - PostgreSQL
Como lidar com cargas de trabalho mistas - PostgreSQLComo lidar com cargas de trabalho mistas - PostgreSQL
Como lidar com cargas de trabalho mistas - PostgreSQLDiego Santos
 
PHPUnit e teste de software
PHPUnit e teste de softwarePHPUnit e teste de software
PHPUnit e teste de softwarericardophp
 
Testando Aplicações Django: Quando, Como e Onde?
Testando Aplicações Django: Quando, Como e Onde?Testando Aplicações Django: Quando, Como e Onde?
Testando Aplicações Django: Quando, Como e Onde?Bernardo Fontes
 
QConSP: Do cache ao cluster, escalando com Rails
QConSP: Do cache ao cluster, escalando com RailsQConSP: Do cache ao cluster, escalando com Rails
QConSP: Do cache ao cluster, escalando com Railsadrianoalmeida7
 

Mais procurados (7)

TDD em django sem desculpas versao fisl
TDD em django sem desculpas versao fislTDD em django sem desculpas versao fisl
TDD em django sem desculpas versao fisl
 
Web debugging proxies
Web debugging proxiesWeb debugging proxies
Web debugging proxies
 
Atendendo Milhares de Requisições com o Play Framework 2 - v2
Atendendo Milhares de Requisições com o Play Framework 2 - v2Atendendo Milhares de Requisições com o Play Framework 2 - v2
Atendendo Milhares de Requisições com o Play Framework 2 - v2
 
Como lidar com cargas de trabalho mistas - PostgreSQL
Como lidar com cargas de trabalho mistas - PostgreSQLComo lidar com cargas de trabalho mistas - PostgreSQL
Como lidar com cargas de trabalho mistas - PostgreSQL
 
PHPUnit e teste de software
PHPUnit e teste de softwarePHPUnit e teste de software
PHPUnit e teste de software
 
Testando Aplicações Django: Quando, Como e Onde?
Testando Aplicações Django: Quando, Como e Onde?Testando Aplicações Django: Quando, Como e Onde?
Testando Aplicações Django: Quando, Como e Onde?
 
QConSP: Do cache ao cluster, escalando com Rails
QConSP: Do cache ao cluster, escalando com RailsQConSP: Do cache ao cluster, escalando com Rails
QConSP: Do cache ao cluster, escalando com Rails
 

Semelhante a Otimizando Portais Plone: Dicas de Desempenho

Camada de Negócios de Verdade com Spring
Camada de Negócios de Verdade com SpringCamada de Negócios de Verdade com Spring
Camada de Negócios de Verdade com Springelliando dias
 
JS Experience 2017 - Utilizando a virtualização para simplificar o desenvolvi...
JS Experience 2017 - Utilizando a virtualização para simplificar o desenvolvi...JS Experience 2017 - Utilizando a virtualização para simplificar o desenvolvi...
JS Experience 2017 - Utilizando a virtualização para simplificar o desenvolvi...iMasters
 
PHP Turbinado com CodeIgniter - Conisli 2011
PHP Turbinado com CodeIgniter - Conisli 2011PHP Turbinado com CodeIgniter - Conisli 2011
PHP Turbinado com CodeIgniter - Conisli 2011Evaldo Junior
 
Aula01 ip introducao
Aula01 ip introducaoAula01 ip introducao
Aula01 ip introducaoBerg Oliveira
 
Piores Práticas em Containers!
Piores Práticas em Containers!Piores Práticas em Containers!
Piores Práticas em Containers!Pery Lemke
 
XMPP Hands-On
XMPP Hands-OnXMPP Hands-On
XMPP Hands-Oncodebits
 
AULA 06 - REVISÃO DE CONCEITOS INICIAIS DE ALGORITMOS
AULA 06 - REVISÃO DE CONCEITOS INICIAIS DE ALGORITMOSAULA 06 - REVISÃO DE CONCEITOS INICIAIS DE ALGORITMOS
AULA 06 - REVISÃO DE CONCEITOS INICIAIS DE ALGORITMOSprofjotamarcosduarte
 
Portando Aplicações Para a Plataforma Maemo
Portando Aplicações Para a Plataforma MaemoPortando Aplicações Para a Plataforma Maemo
Portando Aplicações Para a Plataforma MaemoEduardo Lima
 
Aprenda a programar python
Aprenda a programar pythonAprenda a programar python
Aprenda a programar pythonLourenço Junior
 
A experiência (e a falta dela) em linux como um usuário comum - Luiz Rauber
A experiência (e a falta dela) em linux como um usuário comum - Luiz RauberA experiência (e a falta dela) em linux como um usuário comum - Luiz Rauber
A experiência (e a falta dela) em linux como um usuário comum - Luiz RauberTchelinux
 
#DNAD15 - Diminuindo sofrimento com código legado de linguagens não mainstreams
#DNAD15  - Diminuindo sofrimento com código legado de linguagens não mainstreams#DNAD15  - Diminuindo sofrimento com código legado de linguagens não mainstreams
#DNAD15 - Diminuindo sofrimento com código legado de linguagens não mainstreamsJacqueline Abreu
 
Webinar: Debugging em Linux embarcado
Webinar: Debugging em Linux embarcadoWebinar: Debugging em Linux embarcado
Webinar: Debugging em Linux embarcadoEmbarcados
 
Java script em 2016 - Como sobreviver a essa sopa de letrinhas com vue.js
Java script em 2016 - Como sobreviver a essa sopa de letrinhas com vue.jsJava script em 2016 - Como sobreviver a essa sopa de letrinhas com vue.js
Java script em 2016 - Como sobreviver a essa sopa de letrinhas com vue.jsVinicius Reis
 

Semelhante a Otimizando Portais Plone: Dicas de Desempenho (20)

Camada de Negócios de Verdade com Spring
Camada de Negócios de Verdade com SpringCamada de Negócios de Verdade com Spring
Camada de Negócios de Verdade com Spring
 
JS Experience 2017 - Utilizando a virtualização para simplificar o desenvolvi...
JS Experience 2017 - Utilizando a virtualização para simplificar o desenvolvi...JS Experience 2017 - Utilizando a virtualização para simplificar o desenvolvi...
JS Experience 2017 - Utilizando a virtualização para simplificar o desenvolvi...
 
PHP Turbinado com CodeIgniter - Conisli 2011
PHP Turbinado com CodeIgniter - Conisli 2011PHP Turbinado com CodeIgniter - Conisli 2011
PHP Turbinado com CodeIgniter - Conisli 2011
 
Workshop.pptx
Workshop.pptxWorkshop.pptx
Workshop.pptx
 
Aula01 ip introducao
Aula01 ip introducaoAula01 ip introducao
Aula01 ip introducao
 
Piores Práticas em Containers!
Piores Práticas em Containers!Piores Práticas em Containers!
Piores Práticas em Containers!
 
XMPP Hands-On
XMPP Hands-OnXMPP Hands-On
XMPP Hands-On
 
AULA 06 - REVISÃO DE CONCEITOS INICIAIS DE ALGORITMOS
AULA 06 - REVISÃO DE CONCEITOS INICIAIS DE ALGORITMOSAULA 06 - REVISÃO DE CONCEITOS INICIAIS DE ALGORITMOS
AULA 06 - REVISÃO DE CONCEITOS INICIAIS DE ALGORITMOS
 
Portando Aplicações Para a Plataforma Maemo
Portando Aplicações Para a Plataforma MaemoPortando Aplicações Para a Plataforma Maemo
Portando Aplicações Para a Plataforma Maemo
 
Frameworks PHP
Frameworks PHPFrameworks PHP
Frameworks PHP
 
Cygwin
CygwinCygwin
Cygwin
 
Aprenda a programar python
Aprenda a programar pythonAprenda a programar python
Aprenda a programar python
 
Programação Orientada a Gambiarra
Programação Orientada a GambiarraProgramação Orientada a Gambiarra
Programação Orientada a Gambiarra
 
A Experiência (e a falta dela) como usuário comum
A Experiência (e a falta dela) como usuário comumA Experiência (e a falta dela) como usuário comum
A Experiência (e a falta dela) como usuário comum
 
A experiência (e a falta dela) em linux como um usuário comum - Luiz Rauber
A experiência (e a falta dela) em linux como um usuário comum - Luiz RauberA experiência (e a falta dela) em linux como um usuário comum - Luiz Rauber
A experiência (e a falta dela) em linux como um usuário comum - Luiz Rauber
 
#DNAD15 - Diminuindo sofrimento com código legado de linguagens não mainstreams
#DNAD15  - Diminuindo sofrimento com código legado de linguagens não mainstreams#DNAD15  - Diminuindo sofrimento com código legado de linguagens não mainstreams
#DNAD15 - Diminuindo sofrimento com código legado de linguagens não mainstreams
 
Webinar: Debugging em Linux embarcado
Webinar: Debugging em Linux embarcadoWebinar: Debugging em Linux embarcado
Webinar: Debugging em Linux embarcado
 
Aula 05
Aula 05Aula 05
Aula 05
 
Garantia de Continuidade
Garantia de ContinuidadeGarantia de Continuidade
Garantia de Continuidade
 
Java script em 2016 - Como sobreviver a essa sopa de letrinhas com vue.js
Java script em 2016 - Como sobreviver a essa sopa de letrinhas com vue.jsJava script em 2016 - Como sobreviver a essa sopa de letrinhas com vue.js
Java script em 2016 - Como sobreviver a essa sopa de letrinhas com vue.js
 

Otimizando Portais Plone: Dicas de Desempenho

  • 1. Otimizando Portais Plone: Dicas de Desempenho Douglas Soares de Andrade PyCon 4 - Setembro/2008
  • 2. Licença de Uso Esta apresentação está sendo disponibilizada pela licença GNU/FDL e lhe dá todos os direitos para cópia e utilização de todo o conteúdo, desde que você mantenha os créditos ao autor original.
  • 3. Problemas e Mitos • Zope/Plone não funcionam para grandes Portais • Zope não utiliza recursos de máquinas multiprocessadas • Quem ouviu falar de Python ?! Zope/Plone ?! • Principal: Aplicações Zope/Plone não são iguais (no sentido de gerenciamento e manutenção) a aplicações PHP !!!!!!
  • 4. Problemas (Casa do Horrores)
  • 5. Problema 01: Instâncias no “Front” • Instâncias Zope/Plone sendo acessadas diretamente (instâncias “Rambo”)
  • 6. Solução 01: Instâncias no “Front” • Utilizar um servidor de cache (squid/varnish) – É tão importante no mundo Zope quanto o controle de versão no mundo do desenvolvimento • Aumento exponencial da performance
  • 7. Problema 02: Alta disponibilidade • Várias pessoas afirmam que NÃO é possível desenvolver soluções de alta disponibilidade com o Zope • Ops, problemas de hardware. Portal fora ?
  • 8. Solução 02: Alta disponibilidade • Até pouco tempo, não era possível (Sem utilizar ferramentas opensource e gratuitas) • Felizmente isso mudou com o RelStorage (palestra do Rogério) • O que isso tem a ver com performance ?
  • 9. Problema 03: Arquivos no ZODB • Arquivos enormes sendo armazenados diretamente no ZODB
  • 10. Solução 03: Arquivos no ZODB • Utilizar o produto FileSystemStorage para armazenar os arquivos no sistema de arquivos do servidor ou em um ponto de rede (cuidado com pontos de falha)
  • 11. Problema 04: Códigos • Códigos que utilizam getObject para pegar informações simples que estão disponíveis nos indices do catálogo • Pense no problema anterior (arquivos de 50mb, 100mb) sendo acessados via getObject para pegar apenas o título do Objeto
  • 12. Solução 04: Códigos • Utilizar getObject apenas em último caso • Em todos os outros casos, utilize as informações que já estão disponíveis no catálogo ou crie novos indices (imagens) • Sempre ter cuidado com a mega ultra power resolução de um problema
  • 13. Problema 05: Infraestrutura não otimizada • Alguns administradores costumam criar ambientes com as configurações “de fábrica” e não se preocupam com a performance por causa do mito: – Zope é lento mesmo ! Não adianta mexer em nada (Castas)
  • 14. Solução 05: Infraestrutura não otimizada • Otimização prematura é a causa de todo o mal ! • É preciso analisar cuidadosamente a arquitetura e todos os componentes que deverão ser utilizados • Exemplo: – Squid • Cache Peers • Storage (UFS) • Tamanho de objetos a serem cacheados
  • 15. Problema 06: Servers Multiprocessados • Zope com apenas uma instância não utiliza diversos cores • 100% em um core e 0% nos outros 15 • O cliente não quer saber do GIL do python e sim de uma solução...
  • 16. Solução 06: Servers Multiprocessados • … que existe ! • Utilize um servidor ZEO com várias instâncias (cuidado com isso !) e deixe o kernel determinar pra onde cada processo vai • Eu quero determinar pra qual core o meu processo vai – taskset (afinidade)
  • 17. Problema 07: Profilers Esquecidos • Legal ! Você utilizou um profiler para determinar onde estava o problema de performance • Só que... Ele ficou lá =)
  • 18. Solução 07: Profilers Esquecidos • Tatuar no braço: “Eu desabilito o meu profiler “ =) • Sempre lembre de desabilitar o profiler quando o portal for para produção
  • 19. Problema 08: O quase off-topic • Toma-que-é-teu
  • 20. Solução 08: O quase off-topic • Preparar a equipe para administrar Zope/Plone • O Zope é carente – Ele precisa de carinho e acompanhamento constante (na verdade, apenas até que a solução estabilize) • Por fim: Novamente, Zope não é PHP !!
  • 21. Outras Dicas Valiosas • Essa veio do Youtube, mas cai como uma luva: Cada um no seu quadrado ! • Utilize Varnish (“O” server de cache) =)
  • 22. Outras Dicas Valiosas • O diagrama do “Quadrado” =)
  • 23. E se nada resolver ?! • Utilize deploy estático – Utilize nginx – Frozer (Weimar) – Chute (não testado – “wget -m”)
  • 26. Fala que eu te escuto =)
  • 27. Contato Email : douglas@archlinux.org douglas.andrade@3pw.com.br MSN : douglas@tuxfamily.org Jabber : dsandrade@jabber.org Gtalk : dsandrade@gmail.com Muito Obrigado =)