Entregando conteúdo em ambientes extremos na JVM

Preview:

DESCRIPTION

Palestra apresentada no QCon SP em 05/08/2012.

Citation preview

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