stamatios
← Voltar ao feed
Prensa hidráulica comprime contêiner gigante em uma mala, economia de memória no cache DNS do 1.1.1.1
Dev & Engenharia

Cloudflare economiza 100 TB de memória otimizando cache do 1.1.1.1

resumo de ~3 min

Escala e medição

A plataforma Big Pineapple, que sustenta o 1.1.1.1 e outros serviços DNS da Cloudflare, mantém mais de 250 bilhões de entradas de cache simultaneamente. Nesse volume, cada byte economizado por entrada representa mais de 250 GB de memória em toda a frota. A equipe mediu as mudanças com entradas aleatórias que aproximavam a distribuição de produção - 56% de registros A, 25% de AAAA e 19% de TXT - e acompanhou tanto o uso de memória quanto o desempenho. Como os testes não reproduzem exatamente o tráfego real, a Cloudflare também observou a memória residente de instâncias em produção durante a implantação.

Cinco mudanças no armazenamento

A primeira otimização substituiu Vec<T> e String por Box<[T]> e Box<str>, eliminando o campo de capacidade e o espaço reservado para crescimento em estruturas que não são modificadas após o armazenamento. Como cada entrada tinha oito desses campos, a alteração economizou 64 bytes por entrada, além do espaço excedente no armazenamento dinâmico.

Depois, as listas separadas para as seções answer, authority e additional foram combinadas em uma lista única, com deslocamentos de 2 bytes para indicar o início de cada seção. Isso substituiu ponteiros e comprimentos maiores e economizou 28 bytes por entrada. A equipe também compactou campos booleanos em sinalizadores de bits; por causa do preenchimento inserido pelo Rust para alinhamento, a estrutura diminuiu mais do que apenas o tamanho dos campos removidos.

Outra mudança eliminou o nome do proprietário dos registros quando ele é igual ao domínio consultado, recuperando essa informação a partir da chave do cache durante a leitura. Nomes diferentes, como os associados a respostas com CNAME, continuam armazenados integralmente.

A equipe ainda alterou o armazenamento do enum RecordData. Como o enum tinha o tamanho de sua maior variante, registros A e AAAA, que representam mais de 80% do tráfego, ocupavam muito mais espaço do que seus dados exigiam. Variantes maiores foram inicialmente colocadas em alocações separadas, mas isso trouxe custos de alocação e pior localidade de memória. A solução final armazena os dados dos registros como bytes brutos contíguos, com prefixos de comprimento, mantendo o restante da entrada estruturado. Essa abordagem reduz alocações, melhora a localidade e permite copiar diretamente vários tipos para a resposta; registros com nomes, como CNAME, NS, MX e SOA, ainda precisam ser analisados para aplicar compressão DNS.

Resultado e próximos passos

Nos testes, as mudanças reduziram o espaço líquido por entrada de 953 para 420 bytes, uma queda de 56%, e as alocações de 1,1 KB para 461 bytes. Em produção, a memória residente no percentil 99 caiu de 9,3 GB para 5,3 GB por instância, redução de 43%; no percentil 90, passou de 6,5 GB para 3,8 GB, queda de 42%. A economia agregada foi de aproximadamente 100 TB na frota.

O desempenho também melhorou: a taxa de inserção subiu de 625 mil para 893 mil entradas por segundo, enquanto a latência de busca caiu de 828 para 670 nanossegundos. A Cloudflare afirma que pretende usar a memória liberada para aumentar a capacidade do cache sem elevar o consumo, o que pode melhorar as taxas de acerto e reduzir consultas aos servidores upstream.