2. Desenvolvedor especialista
em arquiteturas de alta
performance relacionadas
a publicação, busca e
entrega de conteúdo para
o portal UOL.
Mestre pelo IME-USP em
07/2012 =)
ROd
rzaccara@uolinc.com
@rzdrigo
3. Academia UOL 06/07/2012
Objetivo
Aumentar a disponibilidade
da entrega de conteúdo do
Portal
4. Academia UOL 06/07/2012
Objetivo
Diminuir acesso aos
serviços de backend
5. Academia UOL 06/07/2012
Objetivo
Simplificar a infraestrutura
de entrega de conteúdo
6. Academia UOL 06/07/2012
Objetivo
Suportar múltiplos formatos
do conteúdo na mesma URL
11. Academia UOL 06/07/2012
Premissas
• Estado imutável
• Detecção de User Agent
• Cache
• Melhores práticas do HTTP
• Proxy da engine de template
12. Academia UOL 06/07/2012
Detecção de User Agent
• WURFL
●
Web patch
• Fast detection
●
Bot
●
Desktop
13. Academia UOL 06/07/2012
Cache
• Cache replicado em todas as máquinas
do pool
• Separação entre conteúdo e máquina de
estado
• Cache de conteúdo “gzipado”
• Bots não adicionam conteúdo no cache
14. Academia UOL 06/07/2012
HttpHandler
• Content-Encoding: gzip
• Etag e Last-Modified
●
11% da audiência utiliza HTTP/1.0
• Cache-Control
• Connection: close
22. Academia UOL 06/07/2012
Migração
• Beta com noticias.uol.com.br
• Migração de todos os domínios de
coteúdo em 2 meses
●
42 áreas principais
●
Mais de 80 domínios
23. Academia UOL 06/07/2012
Apache DocRoot
• Apache envia redirect
●
/busca → /busca/
• Problema: Algumas funções JavaScript se
apoiavam nesta “feature”
• Erro: /buscamontecarlo.htm → 404 Not Found
24. Academia UOL 06/07/2012
Negando conexões
• Após morte do Chico Anysio requisições
não estabeleciam
• Pico de 160k req/minuto por servidor
• Pico de 3200 req/segundo por servidor
25. Academia UOL 06/07/2012
Negando conexões
• Tentativas:
●
Aumento de threads do Apache
●
Pré alocação de threads do Apache
●
Testes com nginx
●
Solução: ajuestes nos valores do sysctl
net.ipv4.ip_local_port_range e net.ipv4.tcp_tw_reuse
26. Academia UOL 06/07/2012
Long GC Pauses
• Requisições tinham tempo alto de
resposta sem nenhum evento especial
• Análise de gc.log
• FullGCs levando 12 ~ 15 segundos,
mesmo após ajustes em pré produção
27. Academia UOL 06/07/2012
Long GC Pauses
• Após resolução do problema anterior as
alterações do Apache não foram
desfeitas
• Thread pré alocadas fizeram o servidor
começar a consumir swap
• Monitoração da swap desativada
28. Academia UOL 06/07/2012
500 Server Internal Error
• Diversas requisições retornando 500
• No mesmo momento outras retornando
“200 OK” para o mesmo resource
• Nenhuma mensagem de erro no log da
aplicação
29. Academia UOL 06/07/2012
500 Server Internal Error
• Suspeita: Connection Pool do Jetty
• Análise: Sniffer entre Apache e Jetty
• Problema:
●
queryString no Apache 2.0.x não suporta
UTF-8
●
Somente IE realizava esta transformação
30. Academia UOL 06/07/2012
Números
• 15 ~ 150 req/min (230k no pico → 3833 req/s)
• 98% cache hits
• 125 Mbps (225 Mbps pico)
• 55% de respostas “Not Modified” (304)
• Redução de consultas ao Sistema de busca
●
500 → 250 queries/segundo (-50%)
31. Academia UOL 06/07/2012
Próximos passos
• Substituir Jetty → Netty
• Armazenar uma semana de conteúdo em
memória
• Integração com o Metrics framework
• Migração de outros serviços para a
plataforma