entregando conteúdo em ambientes extremos na jvm

33
Entregando conteúdo em ambientes extremos na JVM ROd

Upload: rodrigo-zaccara

Post on 08-Jul-2015

753 views

Category:

Documents


3 download

DESCRIPTION

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

TRANSCRIPT

Page 1: Entregando conteúdo em ambientes extremos na JVM

Entregando conteúdo em ambientes extremos

na JVM

ROd

Page 2: Entregando conteúdo em ambientes extremos na JVM

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

Page 3: Entregando conteúdo em ambientes extremos na JVM

Objetivo

Aumentar a disponibilidade da entrega de conteúdo do

Portal

Page 4: Entregando conteúdo em ambientes extremos na JVM

Objetivo

Diminuir acesso aos serviços de backend

Page 5: Entregando conteúdo em ambientes extremos na JVM

Objetivo

Simplificar a infraestrutura de entrega de conteúdo

Page 6: Entregando conteúdo em ambientes extremos na JVM

Objetivo

Suportar múltiplos formatos do conteúdo na

mesma URL

Page 7: Entregando conteúdo em ambientes extremos na JVM

noticias.uol.com.br

Page 8: Entregando conteúdo em ambientes extremos na JVM

noticias.uol.com.br

Page 9: Entregando conteúdo em ambientes extremos na JVM

noticias.uol.com.br

Page 10: Entregando conteúdo em ambientes extremos na JVM

MARRAKESH

Page 11: Entregando conteúdo em ambientes extremos na JVM

Premissas

Estado imutável

Detecção de User Agent

Cache

Melhores práticas do HTTP

Proxy da engine de template

Page 12: Entregando conteúdo em ambientes extremos na JVM

Detecção de User Agent

WURFL

– Web patch

Fast detection

– Bot

– Desktop

Page 13: Entregando conteúdo em ambientes extremos na JVM

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

Page 14: Entregando conteúdo em ambientes extremos na JVM

HttpHandler

Content-Encoding: gzip

ETag e Last-Modified

– 11% da audiência ainda utiliza HTTP/1.0

Cache-Control

Connection: Close

Page 15: Entregando conteúdo em ambientes extremos na JVM

Ambiente original

Page 16: Entregando conteúdo em ambientes extremos na JVM

Novo ambiente

Page 17: Entregando conteúdo em ambientes extremos na JVM

PRÉ PRODUÇÃO

Page 18: Entregando conteúdo em ambientes extremos na JVM

Testes

Teste no hardware final

Ferramentas:

– HAProxy

– ab, request-simulator, siege

– visualvm e visualgc

Page 19: Entregando conteúdo em ambientes extremos na JVM

JVM

-Xms == -Xmx

-XX:+AggressiveOpts

-XX:+UseAdaptiveSizePolicy

-XX:+UseParNewGC

-XX:ParallelGCThreads

Page 20: Entregando conteúdo em ambientes extremos na JVM

JVM

-verbose:gc

-XX:+PrintGCDetails

-XX:+PrintGCDateStamps

-Dnetworkaddress.cache.ttl

-Dnetworkaddress.cache.negative.ttl

Page 21: Entregando conteúdo em ambientes extremos na JVM

EM PRODUÇÃO

Page 22: Entregando conteúdo em ambientes extremos na JVM

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

Page 23: Entregando conteúdo em ambientes extremos na JVM

Apache DocRoot

Apache envia redirect

– /busca /busca/→

Problema: Algumas funções JavaScript se

apoiavam nesta “feature”

Erro: /buscamontecarlo.htm 404 Not Found →

Page 24: Entregando conteúdo em ambientes extremos na JVM

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

Page 25: Entregando conteúdo em ambientes extremos na JVM

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

Page 26: Entregando conteúdo em ambientes extremos na JVM

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

Page 27: Entregando conteúdo em ambientes extremos na JVM

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

Page 28: Entregando conteúdo em ambientes extremos na JVM

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

Page 29: Entregando conteúdo em ambientes extremos na JVM

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

Page 30: Entregando conteúdo em ambientes extremos na JVM

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

Page 31: Entregando conteúdo em ambientes extremos na JVM

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

Page 32: Entregando conteúdo em ambientes extremos na JVM

Obrigado =)http://slideshare.net/rzdrigo/entregando-conteudo-em-

ambientes-extremos-na-jvm

Page 33: Entregando conteúdo em ambientes extremos na JVM

Entregando conteúdo em ambientes extremos

na JVM

ROd