Archive for the ‘Produção’ Category

Meta-plugin

Wednesday, October 3rd, 2007

    O peso das páginas web sempre foi para mim um assunto de grande interesse e preocupação. Soluções simples como compressores de conteúdo web são capazes de reduzir muito o tamanho de uma página, ou qualquer outro tipo de conteúdo. O problema é que a utilização destes compressores pode gerar um overhead possivelmente impeditivo. Por exemplo, a principal ferramenta de compressão do Apache, o módulo mod_gzip, que usa a técnica gzip de compressão de conteúdo, comprime logo antes da entrega do conteúdo ao usuário, levando de 100 a 1000 milissegundos, dependendo do tipo e do tamanho do conteúdo a ser entregue. O browser do usuário precisa ainda aceitar, neste caso, o encoding gzip.

    Tirando proveito do fato de a Globo.com cachear seus templates, resolvi implementar uma solução neste sentido, usando uma técnica um pouco diferente, bem simples e performática. Numa das minhas madrugadas insones, fiz uma extensão para o Apache que comprime apenas páginas no exato momento em que são cacheadas. Note que, em termos de custo computacional, isto é bem diferente de comprimir quando o usuário faz um request. Na verdade, não é bem uma técnica compressão, como as usuais. O algoritmo simplesmente retira white spaces, caracteres de tabulação e caracteres return dispensáveis do html cacheado, sem prejudicar, no entanto, a legibilidade do source da página.

    Esta solução foi desenvolvida a partir do módulo apache desenvolvido pelo Luiz Silva, que está em vias de substituir o módulo proprietário da Vignette em produção. Chegou a reduzir de 104 para 74 KBytes o peso do html da home do G1, por exemplo. Levando em consideração o número de page views dos nossos produtos, não só melhoraríamos a experiência do usuário, como também deixaríamos de transmitir centenas de GBytes diariamente.

    A má notícia, no entanto, é que, para comprimir uma página no momento em que é cacheada, o algoritmo leva em média 7 milissegundos na minha máquina de desenvolvimento, o que, a pesar de ser um tempo relativamente pequeno, pode representar um custo muito elevado, dependendo da taxa de cache dos sites. Não tenho noções quanto ao comportamento deste custo durante um teste de carga, por exemplo. Mas considerando as enormes proporções do nosso portal, acredito que infelizmente uma solução deste gênero tem grandes chances de não ser aplicável a nossa realidade.

    Bom pessoal, espero que tenham achado interessante este teste. Postem aqui bastantes sugestões e idéias. Mas também estou pronto para ser apedrejado agora: não exite em registrar o seu protesto.

Documentação Wiki:
http://wiki.globoi.com/view/WebMedia/MinimizacaoHTML

Links relacionados:

http://www.websiteoptimization.com
Livro sobre métodos de otimização de HTML, CSS, JavaScript e multimídia.

http://www.webperformance.org/compression/
Coleção de artigos e links sobre compressão de conteúdo.

http://www.innerjoin.org/apache-compression/
Ferramentas de compressão para o Apache e IIS.

http://perl.apache.org/docs/tutorials/client/compression/compression.html
Um FAQ sobre Web compression.