SlideShare uma empresa Scribd logo
1 de 39
Baixar para ler offline
Performance Tunning
de Clusters Plone
Performance Tunning de Clusters Plone
Fabiano Weimar dos Santos [Xiru]
xiru@xiru.org
II PyCon Brasil - 2006
Interlegis - Brasília - DF
O que iremos ver?
●
O Problema
– Uma breve explanação sobre os problemas relacionados
a otimização de performance de aplicações web
dinâmicas
●
Medindo Performance
– Considerações sobre métricas e as armadilhas
encodidas por nas ferramentas de benchmark
●
Benchmarks
– Zope, Plone, Plone + CacheFu + Squid e Apache
●
Dicas de Otimização de Performance
O que não iremos ver?
●
Como configurar o Plone em cluster
●
Detalhes sobre as otimizações do CacheFu
O Problema
●
Todo site dinâmico é lento, principalmente com
grandes quantidades de acessos.
●
Geralmente não é possível prever a quantidade de
acessos de um site.
●
Toda aplicação está sujeita a picos de acessos em
situações imprevisíveis, mas a infra- estrutura de
um site deve estar preparada para catástrofes!
Algumas situações
imprevisíveis...
O Congresso da Vergonha Nacional
Mensalão, sanguessugas, dinheiro na cueca, dança
da pizza... O parlamento vive a mais grave crise
moral desde a redemocratização do país. É a
instituição em que o brasileiro menos confia. O
descrédito impera até entre parlamentares. “É o
pior Congresso da história”, desabada o
presidente do Conselho de Ética da Câmara,
Ricardo Izar.
(capa do Correio Braziliense, 21 de maio)
Crise em São Paulo aumenta audiência
de portais da internet em 30%, na média
São Paulo - Mesmo com queda de usuários, sites
como iG, UOL e Globo.com experimentam picos de
tráfego nesta segunda- feira graças aos ataques do
PCC.
(IDGNow, 16 de maio de 2006)
Medindo Performance
●
Tarefa não trivial.
●
Ferramentas dificilmente simulam o
comportamento real das aplicações.
●
Apache Benchmark - ab – costuma ser a forma
mais simples de medir a performance de um site.
– Não testa o carregamento de css, javascript, imagens e
não leva em consideração o cache que um browser
faria, por exemplo.
●
Há muitas outras ferramentas de Benchmark
– http:/ / www.opensourcetesting.org/ performance.php
Zope 2.8.6 Padrão
$ ab -n 10 http://localhost:9999/
Concurrency Level: 1
Time taken for tests: 0.309 seconds
Complete requests: 10
Failed requests: 0
Broken pipe errors: 0
Total transferred: 32560 bytes
HTML transferred: 30530 bytes
Requests per second: 32.36 [#/sec] (mean)
Time per request: 30.90 [ms] (mean)
Time per request: 30.90 [ms] (mean, across all concurrent
requests)
Transfer rate: 105.37 [Kbytes/sec] received
Plone 2.1 Padrão
$ ab -n 10 http://localhost:9999/pyconbrasil/
Concurrency Level: 1
Time taken for tests: 5.354 seconds
Complete requests: 10
Failed requests: 0
Broken pipe errors: 0
Total transferred: 242910 bytes
HTML transferred: 240120 bytes
Requests per second: 1.87 [#/sec] (mean)
Time per request: 535.40 [ms] (mean)
Time per request: 535.40 [ms] (mean, across all concurrent
requests)
Transfer rate: 45.37 [Kbytes/sec] received
Plone 2.1
(sem PlacelessTranslationService)
$ ab -n 10 http://localhost:9999/pyconbrasil/
Concurrency Level: 1
Time taken for tests: 3.729 seconds
Complete requests: 10
Failed requests: 0
Broken pipe errors: 0
Total transferred: 242980 bytes
HTML transferred: 240190 bytes
Requests per second: 2.68 [#/sec] (mean)
Time per request: 372.90 [ms] (mean)
Time per request: 372.90 [ms] (mean, across all concurrent
requests)
Transfer rate: 65.16 [Kbytes/sec] received
Plone 2.1
(com CacheFu)
$ ab -n 10 http://localhost:9999/pyconbrasil/
Concurrency Level: 1
Time taken for tests: 0.385 seconds
Complete requests: 10
Failed requests: 0
Broken pipe errors: 0
Total transferred: 245320 bytes
HTML transferred: 240280 bytes
Requests per second: 25.97 [#/sec] (mean)
Time per request: 38.50 [ms] (mean)
Time per request: 38.50 [ms] (mean, across all concurrent
requests)
Transfer rate: 637.19 [Kbytes/sec] received
Está començando a
melhorar...
mas o que aconteceria
quando tivessemos
alguns usuários
concorrentes?
Zope 2.8.6 Padrão
(mais requests!)
$ ab -n 1000 -c 10 http://localhost:9999/
Concurrency Level: 10
Time taken for tests: 15.728 seconds
Complete requests: 1000
Failed requests: 0
Broken pipe errors: 0
Total transferred: 3259256 bytes
HTML transferred: 3056053 bytes
Requests per second: 63.58 [#/sec] (mean)
Time per request: 157.28 [ms] (mean)
Time per request: 15.73 [ms] (mean, across all concurrent
requests)
Transfer rate: 207.23 [Kbytes/sec] received
Zope 2.8.6 Padrão
(RAM Cache Manager)
$ ab -n 1000 -c 10 http://localhost:9999/
Concurrency Level: 10
Time taken for tests: 9.132 seconds
Complete requests: 1000
Failed requests: 0
Broken pipe errors: 0
Total transferred: 3256000 bytes
HTML transferred: 3053000 bytes
Requests per second: 109.51 [#/sec] (mean)
Time per request: 91.32 [ms] (mean)
Time per request: 9.13 [ms] (mean, across all concurrent
requests)
Transfer rate: 356.55 [Kbytes/sec] received
Plone 2.1
(com CacheFu e mais requests!)
$ ab -n 1000 -c 10 http://localhost:9999/pyconbrasil/
Concurrency Level: 10
Time taken for tests: 28.717 seconds
Complete requests: 1000
Failed requests: 0
Broken pipe errors: 0
Total transferred: 24532000 bytes
HTML transferred: 24028000 bytes
Requests per second: 34.82 [#/sec] (mean)
Time per request: 287.17 [ms] (mean)
Time per request: 28.72 [ms] (mean, across all concurrent
requests)
Transfer rate: 854.27 [Kbytes/sec] received
Conclusões iniciais
●
Processando 34,8 requests/ s, uma intranet
corporativa processaria, durante as 8 horas de
expediente da empresa, aproximadamente 1
milhão de hits.
●
Apesar de parecer que já obtemos uma
performance satisfatória, na prática isso
provavelmente não seria o suficiente.
●
Vejamos então o que conseguimos usando um
proxy/ cache Squid...
CacheFu/ squid/ squid.cfg
[python]
binary: /usr/bin/python
[squid]
binary: /opt/squid/sbin/squid
user: www
config_dir: /opt/squid/etc
log_dir: /opt/squid/var/logs
cache_dir: /opt/squid/var/cache
cache_size_mb: 1000
direct: True
port: 3128
admin_email: xiru@xiru.org
[supported-protocols]
http: 80
[accelerated-hosts]
pyconbrasil.xiru.intranet: 127.0.0.1:9999/pyconbrasil
Gerando configurações do Squid
$ export PYTHONPATH=/opt/zope/zope-
2.8.6/lib/python
$ python makeconfig
Configuration file [squid.cfg]:
Template directory [templates]:
Output directory [output]:
Generating files for standalone squid
Generating output/deploy
Generating output/iRedirector.py
Generating output/purge_squid
Generating output/squid.conf
Generating output/squidAcl.py
Generating output/squidRewriteRules.py
Generating output/timing.py
Instalando configurações do Squid
$ cd output
$ sudo ./deploy
Copying config / helper files to /opt/squid/etc
Giving www ownership of its config and helper
files
Giving www read and execute access to its config
/ helper files
Giving www write access to /opt/squid/var/logs
and /opt/squid/var/cache
Remember to initialize the squid cache (squid -z)
Plone 2.1
(com CacheFu e Squid)
$ ab -n 1000 -c 10 http://pyconbrasil.xiru.intranet/
Concurrency Level: 10
Time taken for tests: 5.198368 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 24615782 bytes
HTML transferred: 23985524 bytes
Requests per second: 192.37 [#/sec] (mean)
Time per request: 51.984 [ms] (mean)
Time per request: 5.198 [ms] (mean, across all concurrent
requests)
Transfer rate: 4624.14 [Kbytes/sec] received
Plone 2.1
(com CacheFu e Squid e m ais requests
ainda!)
$ ab -n 10000 -c 50 http://pyconbrasil.xiru.intranet/
Concurrency Level: 50
Time taken for tests: 30.693625 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 246174925 bytes
HTML transferred: 239867942 bytes
Requests per second: 325.80 [#/sec] (mean)
Time per request: 153.468 [ms] (mean)
Time per request: 3.069 [ms] (mean, across all concurrent
requests)
Transfer rate: 7832.41 [Kbytes/sec] received
P
a
d
r
ã
o
(
1
0
r
e
q
.
)
S
e
m
P
T
S
(
1
0
r
e
q
.
)
C
a
c
h
e
F
u
(
1
0
r
e
q
.
)
C
a
c
h
e
F
u
(
1
0
0
0
r
e
q
.
,
1
0
s
i
m
.
)
C
a
c
h
e
F
u
e
S
q
u
i
d
(
1
0
0
0
r
e
q
.
,
1
0
s
i
m
.
)
C
a
c
h
e
F
u
e
S
q
u
i
d
(
1
0
0
0
0
r
e
q
.
,
5
0
s
i
m
.
)
0
25
50
75
100
125
150
175
200
225
250
275
300
325
350
Benchmark CacheFu
Performance
Mais conclusões
●
Processando 325,8 requests/ s, a mesma intranet
do exemplo anterior processaria
aproximadamente 9,3 milhões de hits.
●
Servidores de médio porte conseguem processar
(com folga) cerca de 800 requests/ s. Servidores
mais rápidos e bem configurados podem chegar a
processar mais de 3000 requests/ s.
●
Squid é rápido! Mas o que acontece ao
compararmos essa arquitetura com um servidor
Apache, servindo conteúdo estático?
Apache Padrão
$ ab -n 10000 -c 50 http://localhost/
Concurrency Level: 50
Time taken for tests: 78.525 seconds
Complete requests: 10000
Failed requests: 0
Broken pipe errors: 0
Total transferred: 18752360 bytes
HTML transferred: 14600768 bytes
Requests per second: 127.35 [#/sec] (mean)
Time per request: 392.62 [ms] (mean)
Time per request: 7.85 [ms] (mean, across all concurrent
requests)
Transfer rate: 238.81 [Kbytes/sec] received
O Apache padrão está
aproximadamente 2,5
vezes mais lento que o
Plone!?
Tem algo errado aqui...
Apache Padrão
(“contornando” o MultiViews)
$ ab -n 10000 -c 50 http://localhost/index.html.pt-br
Concurrency Level: 50
Time taken for tests: 12.694 seconds
Complete requests: 10000
Failed requests: 0
Broken pipe errors: 0
Total transferred: 23177742 bytes
HTML transferred: 20427330 bytes
Requests per second: 787.77 [#/sec] (mean)
Time per request: 63.47 [ms] (mean)
Time per request: 1.27 [ms] (mean, across all concurrent
requests)
Transfer rate: 1825.88 [Kbytes/sec] received
Agora o Apache está
aproximadamente 2,5
vezes mais rápido que o
Plone
(rodando com Squid e CacheFu).
Vejamos então alguns ajustes nas
configurações no Apache para
implementar uma política de cache
similar ao CacheFu...
mod_expires
ExpiresActive On
ExpiresDefault "access plus 5 minutes"
ExpiresByType image/gif "access plus 1 day"
ExpiresByType image/jpeg "access plus 1 day"
ExpiresByType image/png "access plus 1 day"
ExpiresByType text/css "access plus 1 day"
ExpiresByType application/x-javascript "access plus 1 day"
mod_proxy
ProxyRequests On
ProxyVia On
<Directory proxy:*>
Order deny,allow
Deny from all
Allow from localhost
</Directory>
CacheRoot "/private/var/run/proxy"
CacheSize 5
CacheGcInterval 4
CacheMaxExpire 24
CacheLastModifiedFactor 0.1
CacheDefaultExpire 1
Plone Apache Zope
0
50
100
150
200
250
300
350
400
450
500
550
600
650
700
750
800
Melhores Performances
Performance
Mais conclusões
●
Apesar do Apache parecer ser o mais rápido,
convém lembrar que estamos comparando coisas
muito diferentes.
●
É importante perceber que o “Plone + CacheFu +
Squid” não perdem muito para o Apache (bem...
perdem, mas não tanto quanto o Plone padrão :- )
Mais conclusões
●
Com um Performance Tunning adequado, um
cluster Plone pode rodar tão rápido quanto um
servidor Apache.
●
O servidor HTTP do Zope é lento, mesmo
configurado para fazer cache em memória RAM.
Dicas
●
Cuidado para não “acordar” muitos objetos do
ZODB.
– Evite usar o método getObject do brain quando fizer
uma busca no portal_catalog.
– Não use o método objectValues, objectIds. Use o
ExtendedPathIndex ou o NavtreeIndexNG.
– Evite usar o método listFolderContents (Plone 2.0).
●
Ajuste do tamanho do cache do ZODB.
●
Evite usar aquisição.
●
Evite usar redirects.
Dicas
●
Não tente advinhar porque seu site está lento: use
um profiler:
ZopeProfiler
– http:/ / www.dieter.handshake.de/ pyprojects/ zope
CallProfiler
– http:/ / zope.org/ Members/ richard/ CallProfiler
PTProfiler
– http:/ / zope.org/ Members/ guido_w/ PTProfiler
Dicas
●
Combine múltiplos arquivos javascript e css em um
único arquivo (ResourceRegistry).
●
Entenda como os cabeçalhos HTTP funcionam.
●
Depure os cabeçalhos HTTP de sua aplicação
usando a extensão Live HTTP Headers do Firefox.
– http:/ / livehttpheaders.mozdev.org
●
Faça cache no browser de javascript, css e imagens.
●
Use NTP para sincronizar os relógios dos
servidores.
Links
●
Make Plone Go Fast
– http:/ / tinyurl.com/ hcyl3
●
CacheFu
– http:/ / plone.org/ products/ cachefu
●
Cacheability Engine Query
– http:/ / www.web- caching.com/ cacheability.html
●
Caching Tutorial for Web Authors and Webmasters
– http:/ / www.web- caching.com/ mnot_tutorial/
Links
●
The Definitive Guide to Plone – Chapter 14 -
Administering and Scaling Plone
– http:/ / docs.neuroinf.de/ PloneBook/ ch14.rst

Mais conteúdo relacionado

Semelhante a Performance Tuning de Clusters Plone - PyConBrasil 2 (2006)

A Arte do Deployment - WebDevCamp
A Arte do Deployment - WebDevCampA Arte do Deployment - WebDevCamp
A Arte do Deployment - WebDevCampGeorge Guimarães
 
Arquitetura Serverless para Machine Learning
Arquitetura Serverless para Machine LearningArquitetura Serverless para Machine Learning
Arquitetura Serverless para Machine LearningFelipe Santos
 
ASP.Net Performance – A pragmatic approach - Luis Paulino
ASP.Net Performance – A pragmatic approach - Luis PaulinoASP.Net Performance – A pragmatic approach - Luis Paulino
ASP.Net Performance – A pragmatic approach - Luis PaulinoComunidade NetPonto
 
TDC2018SP | Trilha Serveless - Pra que SERVErless?
TDC2018SP | Trilha Serveless - Pra que SERVErless?TDC2018SP | Trilha Serveless - Pra que SERVErless?
TDC2018SP | Trilha Serveless - Pra que SERVErless?tdc-globalcode
 
Dicas e Truques de Performance: Como obter o maximo do Windows Server 2008 R2...
Dicas e Truques de Performance: Como obter o maximo do Windows Server 2008 R2...Dicas e Truques de Performance: Como obter o maximo do Windows Server 2008 R2...
Dicas e Truques de Performance: Como obter o maximo do Windows Server 2008 R2...Rodrigo Immaginario
 
Otimização holistica de ambiente computacional
Otimização holistica de ambiente computacionalOtimização holistica de ambiente computacional
Otimização holistica de ambiente computacionalRodrigo Campos
 
Como desenvolver com um sistema com um front-end colossal?
Como desenvolver com um sistema com um front-end colossal?Como desenvolver com um sistema com um front-end colossal?
Como desenvolver com um sistema com um front-end colossal?Mozart Diniz
 
HTTP, Requisição e Resposta
HTTP, Requisição e RespostaHTTP, Requisição e Resposta
HTTP, Requisição e RespostaThiago Rondon
 
Aumente a performance de seu site de maneira disciplinada
Aumente a performance de seu site de maneira disciplinadaAumente a performance de seu site de maneira disciplinada
Aumente a performance de seu site de maneira disciplinadaHenrique Lima
 
Entregando conteúdo em ambientes extremos na JVM
Entregando conteúdo em ambientes extremos na JVMEntregando conteúdo em ambientes extremos na JVM
Entregando conteúdo em ambientes extremos na JVMRodrigo Zaccara
 
Drupal Performance - Dicas e técnicas para levar seu Drupal às nuvens
Drupal Performance - Dicas e técnicas para levar seu Drupal às nuvensDrupal Performance - Dicas e técnicas para levar seu Drupal às nuvens
Drupal Performance - Dicas e técnicas para levar seu Drupal às nuvensPaulino Michelazzo
 
(A04 e A05) LabMM3 - JavaScript
(A04 e A05) LabMM3 - JavaScript(A04 e A05) LabMM3 - JavaScript
(A04 e A05) LabMM3 - JavaScriptCarlos Santos
 
Apache traffic server uma alternativa ao squid para web caches - fisl 14
Apache traffic server  uma alternativa ao squid para web caches - fisl 14Apache traffic server  uma alternativa ao squid para web caches - fisl 14
Apache traffic server uma alternativa ao squid para web caches - fisl 14Heitor Ganzeli
 
Do Rest Ao Restfull - Rio Jug
Do Rest Ao Restfull - Rio JugDo Rest Ao Restfull - Rio Jug
Do Rest Ao Restfull - Rio JugSergio Azevedo
 
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!Intel Software Brasil
 
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!Luciano Palma
 
Performance e disponibilidade ‐ Um estudo de caso: website dos Correios
Performance e disponibilidade ‐ Um estudo de caso: website dos CorreiosPerformance e disponibilidade ‐ Um estudo de caso: website dos Correios
Performance e disponibilidade ‐ Um estudo de caso: website dos CorreiosAlex Hübner
 
Minicurso IOT com javascript - SBTI
Minicurso IOT com javascript - SBTIMinicurso IOT com javascript - SBTI
Minicurso IOT com javascript - SBTImarcochella
 

Semelhante a Performance Tuning de Clusters Plone - PyConBrasil 2 (2006) (20)

A Arte do Deployment - WebDevCamp
A Arte do Deployment - WebDevCampA Arte do Deployment - WebDevCamp
A Arte do Deployment - WebDevCamp
 
Arquitetura Serverless para Machine Learning
Arquitetura Serverless para Machine LearningArquitetura Serverless para Machine Learning
Arquitetura Serverless para Machine Learning
 
ASP.Net Performance – A pragmatic approach - Luis Paulino
ASP.Net Performance – A pragmatic approach - Luis PaulinoASP.Net Performance – A pragmatic approach - Luis Paulino
ASP.Net Performance – A pragmatic approach - Luis Paulino
 
dnad12
dnad12dnad12
dnad12
 
TDC2018SP | Trilha Serveless - Pra que SERVErless?
TDC2018SP | Trilha Serveless - Pra que SERVErless?TDC2018SP | Trilha Serveless - Pra que SERVErless?
TDC2018SP | Trilha Serveless - Pra que SERVErless?
 
Dicas e Truques de Performance: Como obter o maximo do Windows Server 2008 R2...
Dicas e Truques de Performance: Como obter o maximo do Windows Server 2008 R2...Dicas e Truques de Performance: Como obter o maximo do Windows Server 2008 R2...
Dicas e Truques de Performance: Como obter o maximo do Windows Server 2008 R2...
 
Otimização holistica de ambiente computacional
Otimização holistica de ambiente computacionalOtimização holistica de ambiente computacional
Otimização holistica de ambiente computacional
 
Como desenvolver com um sistema com um front-end colossal?
Como desenvolver com um sistema com um front-end colossal?Como desenvolver com um sistema com um front-end colossal?
Como desenvolver com um sistema com um front-end colossal?
 
Automação de Data Center
Automação de Data CenterAutomação de Data Center
Automação de Data Center
 
HTTP, Requisição e Resposta
HTTP, Requisição e RespostaHTTP, Requisição e Resposta
HTTP, Requisição e Resposta
 
Aumente a performance de seu site de maneira disciplinada
Aumente a performance de seu site de maneira disciplinadaAumente a performance de seu site de maneira disciplinada
Aumente a performance de seu site de maneira disciplinada
 
Entregando conteúdo em ambientes extremos na JVM
Entregando conteúdo em ambientes extremos na JVMEntregando conteúdo em ambientes extremos na JVM
Entregando conteúdo em ambientes extremos na JVM
 
Drupal Performance - Dicas e técnicas para levar seu Drupal às nuvens
Drupal Performance - Dicas e técnicas para levar seu Drupal às nuvensDrupal Performance - Dicas e técnicas para levar seu Drupal às nuvens
Drupal Performance - Dicas e técnicas para levar seu Drupal às nuvens
 
(A04 e A05) LabMM3 - JavaScript
(A04 e A05) LabMM3 - JavaScript(A04 e A05) LabMM3 - JavaScript
(A04 e A05) LabMM3 - JavaScript
 
Apache traffic server uma alternativa ao squid para web caches - fisl 14
Apache traffic server  uma alternativa ao squid para web caches - fisl 14Apache traffic server  uma alternativa ao squid para web caches - fisl 14
Apache traffic server uma alternativa ao squid para web caches - fisl 14
 
Do Rest Ao Restfull - Rio Jug
Do Rest Ao Restfull - Rio JugDo Rest Ao Restfull - Rio Jug
Do Rest Ao Restfull - Rio Jug
 
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!
 
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!
FISL14: Como domar uma fera de 1 TFlop que cabe na palma da sua mão!
 
Performance e disponibilidade ‐ Um estudo de caso: website dos Correios
Performance e disponibilidade ‐ Um estudo de caso: website dos CorreiosPerformance e disponibilidade ‐ Um estudo de caso: website dos Correios
Performance e disponibilidade ‐ Um estudo de caso: website dos Correios
 
Minicurso IOT com javascript - SBTI
Minicurso IOT com javascript - SBTIMinicurso IOT com javascript - SBTI
Minicurso IOT com javascript - SBTI
 

Mais de Fabiano Weimar

Plone, Zope e Python - Da Universidade ao Governo - SulComp II (2006)
Plone, Zope e Python - Da Universidade ao Governo - SulComp II (2006)Plone, Zope e Python - Da Universidade ao Governo - SulComp II (2006)
Plone, Zope e Python - Da Universidade ao Governo - SulComp II (2006)Fabiano Weimar
 
Meu Plone Site está lento. O que fazer???
Meu Plone Site está lento. O que fazer???Meu Plone Site está lento. O que fazer???
Meu Plone Site está lento. O que fazer???Fabiano Weimar
 
Portal SEBRAE - Quando o Plone Gerencia o Conteúdo Alheio
Portal SEBRAE - Quando o Plone Gerencia o Conteúdo AlheioPortal SEBRAE - Quando o Plone Gerencia o Conteúdo Alheio
Portal SEBRAE - Quando o Plone Gerencia o Conteúdo AlheioFabiano Weimar
 
Introducao ao sistema de gerenciamento de conteúdo Plone
Introducao ao sistema de gerenciamento de conteúdo PloneIntroducao ao sistema de gerenciamento de conteúdo Plone
Introducao ao sistema de gerenciamento de conteúdo PloneFabiano Weimar
 
Integração de sistemas legados com Plone
Integração de sistemas legados com PloneIntegração de sistemas legados com Plone
Integração de sistemas legados com PloneFabiano Weimar
 
Algoritmos genéticos em python - PyConBrasil 3 (2007)
Algoritmos genéticos em python - PyConBrasil 3 (2007)Algoritmos genéticos em python - PyConBrasil 3 (2007)
Algoritmos genéticos em python - PyConBrasil 3 (2007)Fabiano Weimar
 
Faça seu portal voar usando o plone.app.caching
Faça seu portal voar usando o plone.app.cachingFaça seu portal voar usando o plone.app.caching
Faça seu portal voar usando o plone.app.cachingFabiano Weimar
 
Adaptando o Plone para plataformas móveis
Adaptando o Plone para plataformas móveisAdaptando o Plone para plataformas móveis
Adaptando o Plone para plataformas móveisFabiano Weimar
 
Plone Yak Shaving and Bikeshedding
Plone Yak Shaving and BikesheddingPlone Yak Shaving and Bikeshedding
Plone Yak Shaving and BikesheddingFabiano Weimar
 
Otimização de infra estrutura para hospedagem de websites
Otimização de infra estrutura para hospedagem de websitesOtimização de infra estrutura para hospedagem de websites
Otimização de infra estrutura para hospedagem de websitesFabiano Weimar
 
Understanding Plone Security
Understanding Plone SecurityUnderstanding Plone Security
Understanding Plone SecurityFabiano Weimar
 
Tips and Tricks about Plone Development for Mobile Platforms
Tips and Tricks about Plone Development for Mobile PlatformsTips and Tricks about Plone Development for Mobile Platforms
Tips and Tricks about Plone Development for Mobile PlatformsFabiano Weimar
 
Dicas e truques de otimização de websites python
Dicas e truques de otimização de websites pythonDicas e truques de otimização de websites python
Dicas e truques de otimização de websites pythonFabiano Weimar
 
Conhecendo o ubuntu enterprise cloud - UEC
Conhecendo o ubuntu enterprise cloud - UECConhecendo o ubuntu enterprise cloud - UEC
Conhecendo o ubuntu enterprise cloud - UECFabiano Weimar
 
Sistema de protocolo de documentos - SPDO
Sistema de protocolo de documentos - SPDOSistema de protocolo de documentos - SPDO
Sistema de protocolo de documentos - SPDOFabiano Weimar
 
Reconhecimento de fala em português brasileiro
Reconhecimento de fala em português brasileiroReconhecimento de fala em português brasileiro
Reconhecimento de fala em português brasileiroFabiano Weimar
 

Mais de Fabiano Weimar (20)

Plone, Zope e Python - Da Universidade ao Governo - SulComp II (2006)
Plone, Zope e Python - Da Universidade ao Governo - SulComp II (2006)Plone, Zope e Python - Da Universidade ao Governo - SulComp II (2006)
Plone, Zope e Python - Da Universidade ao Governo - SulComp II (2006)
 
Meu Plone Site está lento. O que fazer???
Meu Plone Site está lento. O que fazer???Meu Plone Site está lento. O que fazer???
Meu Plone Site está lento. O que fazer???
 
Portal SEBRAE - Quando o Plone Gerencia o Conteúdo Alheio
Portal SEBRAE - Quando o Plone Gerencia o Conteúdo AlheioPortal SEBRAE - Quando o Plone Gerencia o Conteúdo Alheio
Portal SEBRAE - Quando o Plone Gerencia o Conteúdo Alheio
 
Introducao ao sistema de gerenciamento de conteúdo Plone
Introducao ao sistema de gerenciamento de conteúdo PloneIntroducao ao sistema de gerenciamento de conteúdo Plone
Introducao ao sistema de gerenciamento de conteúdo Plone
 
Integração de sistemas legados com Plone
Integração de sistemas legados com PloneIntegração de sistemas legados com Plone
Integração de sistemas legados com Plone
 
Algoritmos genéticos em python - PyConBrasil 3 (2007)
Algoritmos genéticos em python - PyConBrasil 3 (2007)Algoritmos genéticos em python - PyConBrasil 3 (2007)
Algoritmos genéticos em python - PyConBrasil 3 (2007)
 
Faça seu portal voar usando o plone.app.caching
Faça seu portal voar usando o plone.app.cachingFaça seu portal voar usando o plone.app.caching
Faça seu portal voar usando o plone.app.caching
 
Adaptando o Plone para plataformas móveis
Adaptando o Plone para plataformas móveisAdaptando o Plone para plataformas móveis
Adaptando o Plone para plataformas móveis
 
Plone Yak Shaving and Bikeshedding
Plone Yak Shaving and BikesheddingPlone Yak Shaving and Bikeshedding
Plone Yak Shaving and Bikeshedding
 
Otimização de infra estrutura para hospedagem de websites
Otimização de infra estrutura para hospedagem de websitesOtimização de infra estrutura para hospedagem de websites
Otimização de infra estrutura para hospedagem de websites
 
Understanding Plone Security
Understanding Plone SecurityUnderstanding Plone Security
Understanding Plone Security
 
Tips and Tricks about Plone Development for Mobile Platforms
Tips and Tricks about Plone Development for Mobile PlatformsTips and Tricks about Plone Development for Mobile Platforms
Tips and Tricks about Plone Development for Mobile Platforms
 
Segurança no plone
Segurança no ploneSegurança no plone
Segurança no plone
 
Dicas e truques de otimização de websites python
Dicas e truques de otimização de websites pythonDicas e truques de otimização de websites python
Dicas e truques de otimização de websites python
 
Conhecendo o ubuntu enterprise cloud - UEC
Conhecendo o ubuntu enterprise cloud - UECConhecendo o ubuntu enterprise cloud - UEC
Conhecendo o ubuntu enterprise cloud - UEC
 
Sistema de protocolo de documentos - SPDO
Sistema de protocolo de documentos - SPDOSistema de protocolo de documentos - SPDO
Sistema de protocolo de documentos - SPDO
 
Novidades do plone 4
Novidades do plone 4Novidades do plone 4
Novidades do plone 4
 
O novo plone 4
O novo plone 4O novo plone 4
O novo plone 4
 
Reconhecimento de fala em português brasileiro
Reconhecimento de fala em português brasileiroReconhecimento de fala em português brasileiro
Reconhecimento de fala em português brasileiro
 
IPv6
IPv6IPv6
IPv6
 

Performance Tuning de Clusters Plone - PyConBrasil 2 (2006)

  • 2. Performance Tunning de Clusters Plone Fabiano Weimar dos Santos [Xiru] xiru@xiru.org II PyCon Brasil - 2006 Interlegis - Brasília - DF
  • 3. O que iremos ver? ● O Problema – Uma breve explanação sobre os problemas relacionados a otimização de performance de aplicações web dinâmicas ● Medindo Performance – Considerações sobre métricas e as armadilhas encodidas por nas ferramentas de benchmark ● Benchmarks – Zope, Plone, Plone + CacheFu + Squid e Apache ● Dicas de Otimização de Performance
  • 4. O que não iremos ver? ● Como configurar o Plone em cluster ● Detalhes sobre as otimizações do CacheFu
  • 5. O Problema ● Todo site dinâmico é lento, principalmente com grandes quantidades de acessos. ● Geralmente não é possível prever a quantidade de acessos de um site. ● Toda aplicação está sujeita a picos de acessos em situações imprevisíveis, mas a infra- estrutura de um site deve estar preparada para catástrofes!
  • 7. O Congresso da Vergonha Nacional Mensalão, sanguessugas, dinheiro na cueca, dança da pizza... O parlamento vive a mais grave crise moral desde a redemocratização do país. É a instituição em que o brasileiro menos confia. O descrédito impera até entre parlamentares. “É o pior Congresso da história”, desabada o presidente do Conselho de Ética da Câmara, Ricardo Izar. (capa do Correio Braziliense, 21 de maio)
  • 8. Crise em São Paulo aumenta audiência de portais da internet em 30%, na média São Paulo - Mesmo com queda de usuários, sites como iG, UOL e Globo.com experimentam picos de tráfego nesta segunda- feira graças aos ataques do PCC. (IDGNow, 16 de maio de 2006)
  • 9. Medindo Performance ● Tarefa não trivial. ● Ferramentas dificilmente simulam o comportamento real das aplicações. ● Apache Benchmark - ab – costuma ser a forma mais simples de medir a performance de um site. – Não testa o carregamento de css, javascript, imagens e não leva em consideração o cache que um browser faria, por exemplo. ● Há muitas outras ferramentas de Benchmark – http:/ / www.opensourcetesting.org/ performance.php
  • 10. Zope 2.8.6 Padrão $ ab -n 10 http://localhost:9999/ Concurrency Level: 1 Time taken for tests: 0.309 seconds Complete requests: 10 Failed requests: 0 Broken pipe errors: 0 Total transferred: 32560 bytes HTML transferred: 30530 bytes Requests per second: 32.36 [#/sec] (mean) Time per request: 30.90 [ms] (mean) Time per request: 30.90 [ms] (mean, across all concurrent requests) Transfer rate: 105.37 [Kbytes/sec] received
  • 11. Plone 2.1 Padrão $ ab -n 10 http://localhost:9999/pyconbrasil/ Concurrency Level: 1 Time taken for tests: 5.354 seconds Complete requests: 10 Failed requests: 0 Broken pipe errors: 0 Total transferred: 242910 bytes HTML transferred: 240120 bytes Requests per second: 1.87 [#/sec] (mean) Time per request: 535.40 [ms] (mean) Time per request: 535.40 [ms] (mean, across all concurrent requests) Transfer rate: 45.37 [Kbytes/sec] received
  • 12. Plone 2.1 (sem PlacelessTranslationService) $ ab -n 10 http://localhost:9999/pyconbrasil/ Concurrency Level: 1 Time taken for tests: 3.729 seconds Complete requests: 10 Failed requests: 0 Broken pipe errors: 0 Total transferred: 242980 bytes HTML transferred: 240190 bytes Requests per second: 2.68 [#/sec] (mean) Time per request: 372.90 [ms] (mean) Time per request: 372.90 [ms] (mean, across all concurrent requests) Transfer rate: 65.16 [Kbytes/sec] received
  • 13. Plone 2.1 (com CacheFu) $ ab -n 10 http://localhost:9999/pyconbrasil/ Concurrency Level: 1 Time taken for tests: 0.385 seconds Complete requests: 10 Failed requests: 0 Broken pipe errors: 0 Total transferred: 245320 bytes HTML transferred: 240280 bytes Requests per second: 25.97 [#/sec] (mean) Time per request: 38.50 [ms] (mean) Time per request: 38.50 [ms] (mean, across all concurrent requests) Transfer rate: 637.19 [Kbytes/sec] received
  • 14. Está començando a melhorar... mas o que aconteceria quando tivessemos alguns usuários concorrentes?
  • 15. Zope 2.8.6 Padrão (mais requests!) $ ab -n 1000 -c 10 http://localhost:9999/ Concurrency Level: 10 Time taken for tests: 15.728 seconds Complete requests: 1000 Failed requests: 0 Broken pipe errors: 0 Total transferred: 3259256 bytes HTML transferred: 3056053 bytes Requests per second: 63.58 [#/sec] (mean) Time per request: 157.28 [ms] (mean) Time per request: 15.73 [ms] (mean, across all concurrent requests) Transfer rate: 207.23 [Kbytes/sec] received
  • 16. Zope 2.8.6 Padrão (RAM Cache Manager) $ ab -n 1000 -c 10 http://localhost:9999/ Concurrency Level: 10 Time taken for tests: 9.132 seconds Complete requests: 1000 Failed requests: 0 Broken pipe errors: 0 Total transferred: 3256000 bytes HTML transferred: 3053000 bytes Requests per second: 109.51 [#/sec] (mean) Time per request: 91.32 [ms] (mean) Time per request: 9.13 [ms] (mean, across all concurrent requests) Transfer rate: 356.55 [Kbytes/sec] received
  • 17. Plone 2.1 (com CacheFu e mais requests!) $ ab -n 1000 -c 10 http://localhost:9999/pyconbrasil/ Concurrency Level: 10 Time taken for tests: 28.717 seconds Complete requests: 1000 Failed requests: 0 Broken pipe errors: 0 Total transferred: 24532000 bytes HTML transferred: 24028000 bytes Requests per second: 34.82 [#/sec] (mean) Time per request: 287.17 [ms] (mean) Time per request: 28.72 [ms] (mean, across all concurrent requests) Transfer rate: 854.27 [Kbytes/sec] received
  • 18. Conclusões iniciais ● Processando 34,8 requests/ s, uma intranet corporativa processaria, durante as 8 horas de expediente da empresa, aproximadamente 1 milhão de hits. ● Apesar de parecer que já obtemos uma performance satisfatória, na prática isso provavelmente não seria o suficiente. ● Vejamos então o que conseguimos usando um proxy/ cache Squid...
  • 19. CacheFu/ squid/ squid.cfg [python] binary: /usr/bin/python [squid] binary: /opt/squid/sbin/squid user: www config_dir: /opt/squid/etc log_dir: /opt/squid/var/logs cache_dir: /opt/squid/var/cache cache_size_mb: 1000 direct: True port: 3128 admin_email: xiru@xiru.org [supported-protocols] http: 80 [accelerated-hosts] pyconbrasil.xiru.intranet: 127.0.0.1:9999/pyconbrasil
  • 20. Gerando configurações do Squid $ export PYTHONPATH=/opt/zope/zope- 2.8.6/lib/python $ python makeconfig Configuration file [squid.cfg]: Template directory [templates]: Output directory [output]: Generating files for standalone squid Generating output/deploy Generating output/iRedirector.py Generating output/purge_squid Generating output/squid.conf Generating output/squidAcl.py Generating output/squidRewriteRules.py Generating output/timing.py
  • 21. Instalando configurações do Squid $ cd output $ sudo ./deploy Copying config / helper files to /opt/squid/etc Giving www ownership of its config and helper files Giving www read and execute access to its config / helper files Giving www write access to /opt/squid/var/logs and /opt/squid/var/cache Remember to initialize the squid cache (squid -z)
  • 22. Plone 2.1 (com CacheFu e Squid) $ ab -n 1000 -c 10 http://pyconbrasil.xiru.intranet/ Concurrency Level: 10 Time taken for tests: 5.198368 seconds Complete requests: 1000 Failed requests: 0 Write errors: 0 Total transferred: 24615782 bytes HTML transferred: 23985524 bytes Requests per second: 192.37 [#/sec] (mean) Time per request: 51.984 [ms] (mean) Time per request: 5.198 [ms] (mean, across all concurrent requests) Transfer rate: 4624.14 [Kbytes/sec] received
  • 23. Plone 2.1 (com CacheFu e Squid e m ais requests ainda!) $ ab -n 10000 -c 50 http://pyconbrasil.xiru.intranet/ Concurrency Level: 50 Time taken for tests: 30.693625 seconds Complete requests: 10000 Failed requests: 0 Write errors: 0 Total transferred: 246174925 bytes HTML transferred: 239867942 bytes Requests per second: 325.80 [#/sec] (mean) Time per request: 153.468 [ms] (mean) Time per request: 3.069 [ms] (mean, across all concurrent requests) Transfer rate: 7832.41 [Kbytes/sec] received
  • 25. Mais conclusões ● Processando 325,8 requests/ s, a mesma intranet do exemplo anterior processaria aproximadamente 9,3 milhões de hits. ● Servidores de médio porte conseguem processar (com folga) cerca de 800 requests/ s. Servidores mais rápidos e bem configurados podem chegar a processar mais de 3000 requests/ s. ● Squid é rápido! Mas o que acontece ao compararmos essa arquitetura com um servidor Apache, servindo conteúdo estático?
  • 26. Apache Padrão $ ab -n 10000 -c 50 http://localhost/ Concurrency Level: 50 Time taken for tests: 78.525 seconds Complete requests: 10000 Failed requests: 0 Broken pipe errors: 0 Total transferred: 18752360 bytes HTML transferred: 14600768 bytes Requests per second: 127.35 [#/sec] (mean) Time per request: 392.62 [ms] (mean) Time per request: 7.85 [ms] (mean, across all concurrent requests) Transfer rate: 238.81 [Kbytes/sec] received
  • 27. O Apache padrão está aproximadamente 2,5 vezes mais lento que o Plone!? Tem algo errado aqui...
  • 28. Apache Padrão (“contornando” o MultiViews) $ ab -n 10000 -c 50 http://localhost/index.html.pt-br Concurrency Level: 50 Time taken for tests: 12.694 seconds Complete requests: 10000 Failed requests: 0 Broken pipe errors: 0 Total transferred: 23177742 bytes HTML transferred: 20427330 bytes Requests per second: 787.77 [#/sec] (mean) Time per request: 63.47 [ms] (mean) Time per request: 1.27 [ms] (mean, across all concurrent requests) Transfer rate: 1825.88 [Kbytes/sec] received
  • 29. Agora o Apache está aproximadamente 2,5 vezes mais rápido que o Plone (rodando com Squid e CacheFu). Vejamos então alguns ajustes nas configurações no Apache para implementar uma política de cache similar ao CacheFu...
  • 30. mod_expires ExpiresActive On ExpiresDefault "access plus 5 minutes" ExpiresByType image/gif "access plus 1 day" ExpiresByType image/jpeg "access plus 1 day" ExpiresByType image/png "access plus 1 day" ExpiresByType text/css "access plus 1 day" ExpiresByType application/x-javascript "access plus 1 day"
  • 31. mod_proxy ProxyRequests On ProxyVia On <Directory proxy:*> Order deny,allow Deny from all Allow from localhost </Directory> CacheRoot "/private/var/run/proxy" CacheSize 5 CacheGcInterval 4 CacheMaxExpire 24 CacheLastModifiedFactor 0.1 CacheDefaultExpire 1
  • 33. Mais conclusões ● Apesar do Apache parecer ser o mais rápido, convém lembrar que estamos comparando coisas muito diferentes. ● É importante perceber que o “Plone + CacheFu + Squid” não perdem muito para o Apache (bem... perdem, mas não tanto quanto o Plone padrão :- )
  • 34. Mais conclusões ● Com um Performance Tunning adequado, um cluster Plone pode rodar tão rápido quanto um servidor Apache. ● O servidor HTTP do Zope é lento, mesmo configurado para fazer cache em memória RAM.
  • 35. Dicas ● Cuidado para não “acordar” muitos objetos do ZODB. – Evite usar o método getObject do brain quando fizer uma busca no portal_catalog. – Não use o método objectValues, objectIds. Use o ExtendedPathIndex ou o NavtreeIndexNG. – Evite usar o método listFolderContents (Plone 2.0). ● Ajuste do tamanho do cache do ZODB. ● Evite usar aquisição. ● Evite usar redirects.
  • 36. Dicas ● Não tente advinhar porque seu site está lento: use um profiler: ZopeProfiler – http:/ / www.dieter.handshake.de/ pyprojects/ zope CallProfiler – http:/ / zope.org/ Members/ richard/ CallProfiler PTProfiler – http:/ / zope.org/ Members/ guido_w/ PTProfiler
  • 37. Dicas ● Combine múltiplos arquivos javascript e css em um único arquivo (ResourceRegistry). ● Entenda como os cabeçalhos HTTP funcionam. ● Depure os cabeçalhos HTTP de sua aplicação usando a extensão Live HTTP Headers do Firefox. – http:/ / livehttpheaders.mozdev.org ● Faça cache no browser de javascript, css e imagens. ● Use NTP para sincronizar os relógios dos servidores.
  • 38. Links ● Make Plone Go Fast – http:/ / tinyurl.com/ hcyl3 ● CacheFu – http:/ / plone.org/ products/ cachefu ● Cacheability Engine Query – http:/ / www.web- caching.com/ cacheability.html ● Caching Tutorial for Web Authors and Webmasters – http:/ / www.web- caching.com/ mnot_tutorial/
  • 39. Links ● The Definitive Guide to Plone – Chapter 14 - Administering and Scaling Plone – http:/ / docs.neuroinf.de/ PloneBook/ ch14.rst