Escalabilidade e performance da infraestrutura Plone/Zope com CacheFU e Varnish
1. Consegi 2010
Oficina
Escalabilidade e performance da infraestrutura
Plone/Zope com CacheFU e Varnish
Lucas Brasilino
<brasilino@pgr.mpf.gov.br>
2. Sobre o instrutor
Servidor do MPF, lotado na PGR;
Integrante da equipe da Seção de Sistemas
Operacionais;
Consultor e Instrutor pela 4Linux
Cursos de Apache e Squid
Certificado LPIC-3 e LPIC-302
Pós-graduado em Administração de Redes
Linux pela UFLA.
3. Sobre a oficina
(aka alinhamento de espectativas)
Foco em:
Protocolo HTTP
Componentes de uma infra escalável
Customizações do S.O. Linux
Infra Zope
Aceleração HTTP via Varnish
Produto CacheFU
Não será abordado:
Programação Zope/Python
Criação de um Plone Site
4. Performance na Web
(alguns poucos mandamentos)
Minimizar o número de requisições HTTP
Habilitar conexões persistentes
Cuidado para não se consumir recursos
Número de conexões abertas
CPU / Memória
Melhor seria usar pipelining :)
5. Performance na Web
(alguns poucos mandamentos)
Habilitar compressão em arquivos texto
HTML
CSS
Javascript
XML
Usar figuras de tamanho apropriado
Usar Caching
Não há performance sem cache!!
6. Protocolo HTTP
Hyper Text Transfer Protocol
Baseado em requisições e respostas
Stateless: requisições são independentes entre si
Objetiva:
Buscar um objeto
Executar um código no servidor
Duas versões em uso: HTTP 1.0 e 1.1
7. Uniform Resource Locator
URL
Tem como função endereçar todo e qualquer
objeto na Web
Pode ser entendido como uma 'chave'
Pode ser manipulada durante toda a cadeia de
requisição e resposta
Por isto pode criar uma relação N para 1
9. Uniform Resource Locator
URL
Formato aplicado ao protocolo HTTP:
http://host[:port]/[path][?querystring]
host: nome do servidor/IP de onde se buscar o objeto
port: porta TCP para conexão
path: caminho no servidor a partir de um raiz onde
localiza-se o objeto
querystring: sequência pré-determinada de
argumentos e valores.
14. Protocolo HTTP
request line:
Método: GET, POST, HEAD, PUT, DELETE,
TRACE, OPTIONS
Parte path + query string da URL
Versão do protocolo HTTP
15. Protocolo HTTP
headers:
Par nome : valor
Lembrem-se de chave:dado :)
Classificados em:
Request headers: Aplicáveis apenas em requisições
Response headers: Aplicáveis apenas em respostas
General headers: Aplicáveis tanto em requisições quanto
respostas
Entity headers: Descreve o entity body
16. Protocolo HTTP
Entity body
Corpo da mensagem
Em requisições, só estão presentes quando usado
os métodos POST e PUT.
17. Protocolo HTTP
Exemplo de resposta:
HTTP/1.1 200 OK
Date: Sat, 14 Feb 2009 11:35:05 GMT
Server: Apache
Last-Modified: Tue, 27 Nov 2007 20:35:25 GMT
ETag: "40d56-129f-43fef05453d40"
Accept-Ranges: bytes
Content-Length: 4767
Cache-Control: max-age=1209600
Expires: Sat, 28 Feb 2009 11:35:05 GMT
Connection: close
Content-Type: image/gif
◄
GIF89a ^@Z^@ç^@^@^B^B^B^B<82>î<99>h...
20. Protocolo HTTP
Código de respostas (status code)
status code categoria de resposta status code descrição textual
1xx Informação 200 OK
2xx Sucesso 206 Partial Content
3xx Redirecionamento 301 Moved Permanently
4xx Erro do cliente 302 Found
5xx Erro do servidor 304 Not Modified
403 Forbidden
404 Not Found
500 Internal Server Error
503 Service Unaviable
22. Protocolo HTTP
Versão 1.0
Não suportam Virtual Hosts (header Host):
Conexão não é persistente
Apenas um funcionalidade de caching (header
Expires):
Obs: Na prática, os clientes e servidores suportam
virtual hosts e conexão persistente.
23. Protocolo HTTP
Versão 1.1
Introduz o conceito de Virtual Hosts
Por padrão a conexão é persistente
Suporta pipelining
Introduz dois mecanismos de caching:
Baseado em expiração
Baseado em validação
24. Protocolo HTTP
Conceitos em torno do Caching
Objeto válido
O objeto pode ser reutilizado e, portanto, armazenado
em cache.
Objeto inválido
O objeto não pode ser reutilizada, ou seja, não pode ser
armazenado em cache e deve ser descartado o quanto
antes.
TTL
Tempo de vida em que o objeto é válido
25. Protocolo HTTP
Expiração
Ato do objeto válido tornar-se inválido
Validação (ou revalidação)
Ato de tornar um objeto expirado válido
26. Protocolo HTTP
Modelo baseado em expiração
Header Expires
Define o tempo absoluto para expiração
HTTP/1.0 200 OK
Server: Apache
Content-Type: image/gif
Date: Fri, 27 Feb 2009 21:13:45 GMT
Last-Modified: Wed, 07 Jun 2006 19:50:30 GMT
Expires: Sun, 17 Jan 2038 19:14:07 GMT
Connection: Keep-Alive
27. Protocolo HTTP
Modelo baseado em expiração
Header Cache-Control
Define o tempo relativo para expiração
HTTP/1.1 200 OK
Server: Apache
Content-Type: image/gif
Date: Fri, 27 Feb 2009 21:13:45 GMT
Cache-Control: max-age=3600, public
Last-Modified: Wed, 07 Jun 2006 19:50:30 GMT
Connection: Keep-Alive
28. Protocolo HTTP
Modelo baseado em expiração
Vantagens:
Diminui o número de requisições HTTP
Diminui a latência
Diminui a carga no servidor de origem
Geralmente aplicado em:
Conteúdos estáticos como figuras, CSS,
documentos (PDF, ODT, ODP), código JavaScript,
páginas HTML estáticas, etc.
29. Protocolo HTTP
Modelo baseado em validação
O servidor adiciona à resposta o header
Last-Modified com a data de última
modificação do objeto
O cliente armazena a data informada pelo
Last-Modified e a cada requisição ele inclui
o header If-Modified-Since com esta
data.
Requisição condicional
30. Protocolo HTTP
Modelo baseado em validação
Se o objeto foi modificado:
Siginifica que a condição é verdadeira
O objeto no cliente é inválido
A resposta conterá o status code 200 'OK'
No corpo da resposta (entity body) estará presente
o novo objeto, ou seja, o objeto será enviado
novamente ao cliente
Possivelmente será adicionado a nova data de
modificação no header Last-Modified
31. Protocolo HTTP
Modelo baseado em validação
Se o objeto não foi modificado:
Siginifica que a condição é falsa
A resposta conterá o status code 304 'Not Modified'
O objeto não precisará ser enviado
O objeto foi revalidado
32. Protocolo HTTP
Modelo baseado em validação
Vantagens:
Diminui a largura de banda necessária para
transferir o objeto
Diminui a latência
Geralmente aplicado em:
Informações onde há necessidade tempestiva de
se acessar a última versão do objeto
38. Customização da Pilha TCP/IP do
Linux
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_fin_timeout = 5
net.core.rmem_max=16777216
net.core.wmem_max=16777216
net.ipv4.tcp_rmem=4096 87380 16777216
net.ipv4.tcp_wmem=4096 65536 16777216
39. Customização da Pilha TCP/IP do
Linux
Adicionem esta configuração no /etc/sysctl.conf.
Executem: sysctl -p
No ambiente (shell) que executar um serviço
aumente o número máximo de descritores:
ulimit -HSn 16384
44. Varnish
Acelerador HTTP
Eficiente pois utiliza técnicas modernas de IPC e
acesso ao conteúdo em cache
Utiliza shared memory como IPC
Utiliza memory mapped file para armazenar objetos
É extremamente flexível, através de sua linguagem de
configuração VCL
Trata-se de um DSL
Em minha opinião é sua característica matadora
45. Varnish Configuration Language
VCL
Sintaxe similar ao Perl e C
Operadores:
Atribuição: =
Se a atribuição for a um atributo, usa-se o
operador 'set'
Comparação: ==, !=
Boleano: !, &&, ||
Regex: ~
Suporta blocos '{ }', testes com if mas não loops
46. Varnish Configuration Language
VCL
Exemplos
set req.http.connection = close
if (req.http.host != "www.pgr.mpf.gov.br") {
set req.http.host = www.pgr.mpf.gov.br;
}
47. Varnish Configuration Language
VCL
Subrotinas:
vcl_recv
Chamada ao ser recebido a requisição do cliente
vcl_pipe
Chamada ao se entrar no modo pipe
vcl_pass
Chamada so se entrar no modo pass
vcl_hash
Chamada ao se procurar um objeto em cache
48. Varnish Configuration Language
VCL
Subrotinas:
vcl_hit;
Chamada quando o objeto é encontrado em cache
vcl_miss
Chamada quando o objeto não é encontrado em cache
vcl_fetch
Chamada após recebe objeto do backend
vcl_deliver
Chamada antes do objeto se entregue ao cliente
49. Varnish Configuration Language
VCL
Retorno das subrotinas:
pipe
Entra no modo pipe (passa para vcl_pipe)
pass
Entra no modo pass (passa para vcl_pass)
lookup
Procura objeto no cache (passa para vcl_hash)
hash
Passa para vcl_hi ou vcl_miss
50. Varnish Configuration Language
VCL
Retorno das subrotinas:
deliver
Passa para vcl_deliver
A partir da versão 2.1 deve-se usar a palavra-
chave 'return':
return(pass);
55. CacheFU
É um produto para o Plone
Cria políticas de caching
Conjunto de headers HTTP (header set)
Conjunto de objetos Plone/Zope a que se aplica um
header set
Remove do cache, via método PURGE, um
objeto que foi modificado