Motivação
- A rede global da Cloudflare processa mais de 60 milhões de requisições HTTP por segundo
- Reduziu o uso de CPU e melhorou a capacidade de processamento do CDN usando um novo crate open source em Rust
- Pingora é o núcleo do serviço de proxy da Cloudflare baseado em Rust, e foi disponibilizado como open source
- O serviço Pingora-origin tem o papel de encaminhar as requisições do usuário ao destino real
- Quando a requisição sai da Cloudflare, é necessário remover informações internas
- Esse trabalho acontece com muita frequência e representa 1,7% do uso de CPU
Benchmarking
- O crate Rust Criterion foi usado para medir o desempenho da função em nanossegundos
- A função original
clear_internal_headers levava em média 3,65µs
Reduzindo operações de leitura
- As operações de leitura foram reduzidas invertendo a direção da remoção dos headers
- Com essa mudança, o tempo de execução da função melhorou de 3,65µs para 1,53µs
- O uso de CPU caiu de 1,71% para 0,717%
Busca em estruturas de dados
- Foi testada uma abordagem para armazenar e buscar headers internos usando um hashmap
- O tempo de leitura do hashmap é linear, proporcional ao tamanho da chave
- Outras estruturas de dados, como conjunto ordenado ou máquina de estados, também foram testadas
- A implementação com expressões regulares foi duas vezes mais lenta que o hashmap
Uso de trie
- Trie é uma estrutura de dados em árvore usada para busca por prefixo ou sistemas de autocomplete
- O trie consegue identificar rapidamente quando uma string não está presente
- Implementações existentes de trie eram mais lentas que o hashmap
- A Cloudflare desenvolveu sua própria implementação otimizada de trie, chamada trie-hard
Trie Hard
- O trie-hard armazena relações entre nós nos bits de inteiros e usa memória contígua para ganhar velocidade
- Reduziu o tempo de execução da função
clear_internal_headers para 0,93µs
- O uso de CPU caiu de 1,71% para 0,43%
- Em produção real, o desempenho do trie-hard correspondeu ao observado nos benchmarks
Conclusão
- É importante identificar e otimizar as partes lentas do código
- Pequenas otimizações podem se acumular e trazer grandes ganhos de desempenho
- A Connected Cloud da Cloudflare oferece recursos como proteção de rede, aceleração de aplicações de internet e defesa contra ataques DDoS
Resumo do GN⁺
- A Cloudflare reduziu o uso de CPU e melhorou a capacidade de processamento do CDN com um novo crate open source em Rust
- Otimizou a remoção de headers internos no serviço Pingora-origin, reduzindo o uso de CPU em 1,28%
- Desenvolveu o trie-hard, sua própria implementação otimizada de trie, melhorando significativamente o desempenho
- O artigo destaca a importância da otimização de código e da escolha de estruturas de dados, mostrando que pequenas otimizações podem gerar grandes ganhos de desempenho
- Projetos com funcionalidades semelhantes incluem NGINX e HAProxy
1 comentários
Comentários do Hacker News
Houve várias especulações sobre a forma como a Cloudflare armazena e remove cabeçalhos internos
No início, acharam ineficiente mapear caracteres UTF-8 para uma bitmask
a-ze seis caracteres especiaisA-Ze seis caracteres especiaisHouve questionamentos sobre se a otimização da Cloudflare realmente vale a pena
Não entendem muito de otimização de estruturas de dados, mas se surpreenderam por terem descartado tabelas hash tão rapidamente
Foi usada uma estrutura de dados fancy para montar os itens a remover e, com base nisso, removê-los do mapa de cabeçalhos
Finalmente saiu um post de blog usando trie
Queriam saber se testaram um Bloom Filter pequeno
Queriam saber se tentaram uma tabela hash perfeita, já que estão casando um conjunto estático de itens
A otimização é interessante
Queriam saber por que o crate
regexnão funcionou melhor