Pesquisar

quinta-feira, 3 de setembro de 2009

Cache encurtando viagens


Cache é importante?

Me lembro quando comprei meu processador Atlhon XP 2400, na época tinha o maior cache maior da categoria. Tinha um cache L1 para dados e instruções de 64KB (cada) e L2 com 256KB. Hoje um E8400 tem cache L1 de 32KB pra dados e 32KB para instruções e um L2 com 6MB (compartilhado entre os núcleos) indo além disso um Core i7 adiciona mais um nível (LEVEL) o L3. ( ele tem L1 = 32KB pra dados e 32KB pra instruções, L2 = 4 x 256KB e L3 = 8MB compartilhada com todos núcleos). Bem, se os projetistas de hardware já se preocuparam com isso pra que eu vou fazer cache?

O que é um Cache?

O processo de armazenamento temporário de informações recentemente acessadas em um subsistema de memória especial para acesso mais rápido. (Windows Vista Center Help)
É um dispositivo de acesso rápido, interno a um sistema, que serve de intermediário entre um operador de um processo e o dispositivo de armazenamento ao qual esse operador acede. A vantagem principal na utilização de uma cache consiste em evitar o acesso ao dispositivo de armazenamento - que pode ser demorado -, armazenando os dados em meios de acesso mais rápidos. (Wikipedia)

Exemplo (ridículo) do uso de Cache (sun.misc.Cache)

Cache cache = MCache.get(); //singleton, session, jndi, cache distributed server...
if (cache.get("homePageNews")==null){
//busco no banco
//quando busco no banco
//atualizo também o cache.
}else{
//salvei tempo
Set news = (Set)cache.get("homePageNews");
}
Senta que lá vem história, experiência quase-real

Numa consultoria 0800 à um amigo Php-Ense; ele me retratava que apesar de ser um servidor não tão parrudo o sistema estava apresentando lentidão (demora de 0,5 a 1,8 segundos), as telas estavam demorando muito a serem carregadas... Já cheguei pensando que seria uma batalha(tanto pelo pouco conhecimento em PHP, quanto pela descrição do problema). Se tratava de uma aplicação simples com poucos 'Gruds' (cerca de 30). Na demonstração percebi que algumas telas demoravam mais do que outras para carregar , e uma demorava quase 2 segundos (essa que encomodava-o) que era a gestão de clientes, nela havia três combos: países, estados e cidades. Uma outra era a página inicial que carregava : últimas notícias, o perfil de três clientes (randômicos), três serviços prestados (randômicos), um texto sobre a "empresa" e uma mensagem. Tudo isso era carregado do banco a cada requisição, se 100 pessoas abrissem o browser naquele site seriam enviados 100 equisições ao banco (que provavelmente por se tratar do mesmo dado os teria em cache, ôoo o banco também tem cache, todo mundo têm eu também quero... será? ) mesmo que o banco lhe salve um pouco de processamento, você continua enviando e recebendo dados pela rede e isso é danoso. Sugeri a ele usar um framework de Cache ou criar um simples e sincronizá-lo com a base de N minutos a N minutos. Depois que ele seguiu meus conselhos ele disse ter uma melhora bem melhor do que esperava. Isso, claro, não significa que todos os problemas de performance serão sanados com uso de cache, alias o uso indiscriminado de tal recurso pode também afetar a performance negativamente. Agora imagine que uma aplicação esteja distribuída em vários servidores em clustes um único sistema de Cache não irá ajudar muito, para tanto já existem sistemas de Cache distribuidos (acredite que isso é mais simples do que minha mente temerosa de computação distribuída possa imaginar).

Nenhum comentário: