Contactar o apoio

Respondemos por e-mail, normalmente em dois dias.

Para prevenir abusos, o Google reCAPTCHA verifica este envio; alguns dados são transmitidos ao Google. O script só é carregado na abertura deste formulário.

← Todos os artigos

Imagens de contador em memória

Sobre o conteúdo e a sua revisão

Neste artigo

Perto de um quinto das imagens de contador que este serviço desenha já não muda nada. Um programa de seguimento do rato da geração anterior recarrega a imagem a cada movimento, e desde que esses pedidos deixaram de incrementar seja o que for, dois seguidos produzem a mesma imagem, byte a byte.

Um candidato óbvio a cache. As decisões interessantes foram onde pô-la e sobre o que fazer incidir a chave.

No disco não

Isto corre num servidor pequeno, e o disco é um cartão SD. Guardar aí as imagens desenhadas teria significado uns 70 MB de escrita por dia, em troca de uma poupança medida de 1,6 minutos de processador por dia.

É uma má troca. Os cartões SD morrem de escrever, e o que se compra é um erro de arredondamento numa máquina que não está limitada pelo processador. A cache vive por isso em /dev/shm, que é tmpfs, que é RAM. Medido ali: 0,027 ms a ler, 0,036 ms a escrever, 1,9 GB livres.

o que teria custado, por dia70 MBo que teria rendido, por dia1,6 minunidades diferentes de propósito — é essa a troca

Tudo desaparece ao reiniciar. Para uma cache isso não é uma perda, é o caso normal.

Na mesma máquina corre o Redis. Não foi usado, por uma razão que nada tem de técnica: pertence a outra aplicação e está protegido com palavra-passe para ela. Partilhar uma instância ligaria dois serviços sem relação, de modo que um dia mau de um se tornasse um dia mau do outro.

A chave contém os números

A chave de cache habitual é uma identidade mais um prazo, e o prazo é uma aposta: nos últimos cinco minutos nada de importante mudou. Num contador, aquilo que muda é exatamente aquilo que se mostra.

Os valores mostrados vão então para dentro da chave. Se um número muda, é outra chave, e a imagem é desenhada de novo. A aposta desaparece em vez de ser feita com cuidado. Cada visita contada incrementa pelo menos o total de sempre, portanto nenhuma visita contada pode receber uma imagem desatualizada. O prazo que resta é apenas um limite superior para os valores que não estão na chave — os números semanais, mensais e anuais.

O que houve que verificar primeiro

Uma cache só é segura se aquilo que guarda for função da sua chave. Isso é uma afirmação sobre cada modelo, e foi verificada em vez de presumida:

  • nenhum modelo usa rand(), mt_rand(), shuffle() ou uniqid()
  • nenhum modelo lê o relógio com mais finura do que à hora
  • os parâmetros de seguimento do programa antigo não são lidos em lado nenhum da árvore

Este último ponto produziu o melhor fracasso de todo o exercício. Enquanto esses parâmetros faziam parte da chave, cada pedido trazia coordenadas do rato ligeiramente diferentes, portanto cada chave era única. A cache correu um dia inteiro e registou 13 acertos. Funcionava na perfeição e não fazia nada, que é o tipo de avaria mais difícil de notar.

E se aqui alguma coisa falhar — diretório ilegível, disco cheio, entrada corrompida — a imagem é desenhada da forma normal. Uma cache nunca pode ser a razão de um contador não aparecer.

Publicidade