Este documento descreve como aumentar a disponibilidade e desempenho da entrega de conteúdo para o portal UOL usando a JVM. Ele detalha como implementar cache, detecção de user agent, e configurações da JVM para suportar altas cargas de tráfego enquanto diminui acessos aos serviços backend e simplifica a infraestrutura.
12. Detecção de User Agent
WURFL
– Web patch
Fast detection
– Bot
– Desktop
13. 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
23. Apache DocRoot
Apache envia redirect
– /busca → /busca/
Problema: Algumas funções JavaScript se
apoiavam nesta “feature”
Erro: /buscamontecarlo.htm → 404 Not Found
24. Negando conexões
Após morte do Chico Anysio requisições não
estabeleciam
Pico de 160k reqs/minuto por servidor
Pico de 3200 reqs/segundo por servidor
25. Negando conexões
Tentativas:
– Aumento de threads do Apache
– Pré alocação de threads do Apache
– Testes com nginx
Solução: ajustes nos valores do sysctl
net.ipv4.ip_local_port_range e net.ipv4.tcp_tw_reuse
26. Long GC Pauses
– Requisições tinham tempo alto de resposta
sem nenhum evento especial
– Análise de gc.log
– Full GCs levando 12 ~ 15 segundos, mesmo
após ajustes em pré produção
27. Long GC Pauses
– Após o solução do problema anterior as
alterações do Apache não foram desfeitas
– Threads pré alocadas fizeram o servidor
começar a consumir swap
– Monitoração da swap desativada
28. 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. 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. Números
15k ~ 150k reqs/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/sec (-50%)
31. Próximos passos
Substituir Jetty → Netty
Armazenar uma semana de conteúdo em
memória
Integração com Metrics framework
Migração de outros serviços para a plataforma