Meta-plugin
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.
October 8th, 2007 at 1:49 pm
Anselmo
a compressão atua após o plugin escrever o html em disco, atuando portanto em cima deste arquivo cacheado em disco?
October 15th, 2007 at 5:06 pm
Muito bom Anselmo, acredito que este custo a mais na geração do cache seja inferior ao custo de transmitir bytes e mais bytes inuteis.
Uma coisa a ser testada é para html que possui a tag . Essa tag respeita os espaços e quebras de linha existentes no arquivo. Foi previsto o tratamento diferenciado para conteudo dentro desta tag?
October 30th, 2007 at 3:45 pm
Oi anselmo, excelente iniciativa, só agora estou conseguindo colocar a leitura do Blog em dia.
O que vc fez foi um módulo de Apache que faz um tipo de minimização, ou seja, retira o espaço inútil e com isso economiza uns bons bytes. O ideal é que todo arquivo texto passe por este processo antes de ir para o browser do usuário.
Para o caso de CSS aqui tem umas boas ferramentas de otimização/minimização:
http://www.bloggingpro.com/archives/2006/08/17/css-optimization/
Obfuscar um JS, por exemplo, tb pode ser usado como uma forma de “compressão”.
Excelente iniciativa, abs
October 30th, 2007 at 5:22 pm
Oi Gustavo. Só hoje recebi o e-mail de notificação do seu comentário. Muito boa sua pergunta. Respondendo: sim, atualmente a compressão atua logo após o plugin escrever o html em disco, atuando portanto em cima do arquivo cacheado em disco. Tomei esta decisão no intuito de garantir o cacheamento para os usuários o quanto antes, mesmo sem a minimização da página. Porém, isto pode ser modificado facilmente: posso minimizar a página ainda em memória. Esta é exatamente uma das questões que eu gostaria de discutir com as pessoas. Valeu Gustavo!
October 30th, 2007 at 5:29 pm
Oi Tiago. Só hoje recebi o e-mail de notificação do seu comentário. Sua dúvida será completamente esclarecida com a documentação que eu estou preparando no wiki (http://wiki.globoi.com/view/WebMedia/MinimizacaoHTML). Lá eu vou colocar um exemplo de uma página submetida a este processo. []’s!
February 19th, 2008 at 10:23 am
Será que vc teria a iniciativa de economizar uns bytes sem ter conhecido Nelson Quilula Vasconcellos?