Entregando conteúdo em ambientes extremos
na JVM
ROd
ROdDesenvolvedor 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 =)@rzdrigo
Objetivo
Aumentar a disponibilidade da entrega de conteúdo do
Portal
Objetivo
Diminuir acesso aos serviços de backend
Objetivo
Simplificar a infraestrutura de entrega de conteúdo
Objetivo
Suportar múltiplos formatos do conteúdo na
mesma URL
noticias.uol.com.br
noticias.uol.com.br
noticias.uol.com.br
MARRAKESH
Premissas
Estado imutável
Detecção de User Agent
Cache
Melhores práticas do HTTP
Proxy da engine de template
Detecção de User Agent
WURFL
– Web patch
Fast detection
– Bot
– Desktop
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
HttpHandler
Content-Encoding: gzip
ETag e Last-Modified
– 11% da audiência ainda utiliza HTTP/1.0
Cache-Control
Connection: Close
Ambiente original
Novo ambiente
PRÉ PRODUÇÃO
Testes
Teste no hardware final
Ferramentas:
– HAProxy
– ab, request-simulator, siege
– visualvm e visualgc
JVM
-Xms == -Xmx
-XX:+AggressiveOpts
-XX:+UseAdaptiveSizePolicy
-XX:+UseParNewGC
-XX:ParallelGCThreads
JVM
-verbose:gc
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Dnetworkaddress.cache.ttl
-Dnetworkaddress.cache.negative.ttl
EM PRODUÇÃO
Migração
Beta com noticias.uol.com.br
Migração de todos os dominios de conteúdo
em 2 meses
– 42 áreas principais
– Mais de 80 dominios
Apache DocRoot
Apache envia redirect
– /busca /busca/→
Problema: Algumas funções JavaScript se
apoiavam nesta “feature”
Erro: /buscamontecarlo.htm 404 Not Found →
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
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
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
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
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
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
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%)→
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
Obrigado =)http://slideshare.net/rzdrigo/entregando-conteudo-em-
ambientes-extremos-na-jvm
Entregando conteúdo em ambientes extremos
na JVM
ROd