Entregando conteúdo em ambientes extremos na JVM

Post on 27-Jun-2015

278 views 2 download

description

Palestra realizada no evento "É dia de Java" em 24/08/2012 (http://www2.dc.ufscar.br/diadejava/) sobre a plataforma de entrega de conteúdo do UOL.

Transcript of Entregando conteúdo em ambientes extremos na JVM

Entregando conteúdo em ambientes extremos na JVM

ROd

ROdrzaccara@uolinc.com

@rzdrigo

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 =)

Academia UOL 06/07/2012

Objetivo

Aumentar a disponibilidade

da entrega de conteúdo do

Portal

Academia UOL 06/07/2012

Objetivo

Diminuir acesso aos

serviços de backend

Academia UOL 06/07/2012

Objetivo

Simplificar a infraestrutura

de entrega de conteúdo

Academia UOL 06/07/2012

Objetivo

Suportar múltiplos formatos

do conteúdo na mesma URL

Academia UOL 06/07/2012

noticias.uol.com.br

Academia UOL 06/07/2012

noticias.uol.com.br

Academia UOL 06/07/2012

noticias.uol.com.br

MARRAKESH

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

Academia UOL 06/07/2012

Detecção de User Agent

• WURFL

● Web patch

• Fast detection

● Bot

● Desktop

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

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

Academia UOL 06/07/2012

Ambiente original

Academia UOL 06/07/2012

Novo ambiente

PRÉ PRODUÇÃO

Academia UOL 06/07/2012

Testes

• Teste no hardware final

• Ferramentas

● HAProxy

● ab, request-simulator, siege

● visualvm e visualgc

Academia UOL 06/07/2012

JVM

• -Xms == -Xmx

• -XX:+AggressiveOpts

• -XX:+UseAdaptiveSizePolicy

• -XX:+UserParNewGC

• -XX:ParallelGCThreads

Academia UOL 06/07/2012

JVM

• -verbose:gc

• -XX:+PrintGCDetails

• -XX:+PrintGCDateStamps

• -Dnetworkaddress.cache.ttl

• -Dnetworkaddress.cache.negative.ttl

EM PRODUÇÃO

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

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

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

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

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

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

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

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

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%)

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

Apresentação disponível em http://www.uolhost.com.br/ciclodepalestras/

Entregando conteúdo em ambientes extremos na JVM

ROd