Cloudflare mudou de NGINX para seu próprio proxy Pingora, escrito em Rust

A Cloudflare anunciou a transição de sua rede de entrega de conteúdo para usar o proxy Pingora, escrito na linguagem Rust. O novo proxy substitui a configuração baseada no servidor NGINX por scripts Lua e processa mais de um trilhão de solicitações por dia. Note-se que a transição para um proxy especializado permitiu não só implementar novas funcionalidades e aumentar a segurança devido ao funcionamento seguro da memória, mas também conduziu a um aumento significativo no desempenho e poupança de recursos - a solução baseada em Pingora não requer o uso de Lua e, portanto, consome 70% menos recursos de CPU e 67% menos memória enquanto processa a mesma quantidade de tráfego.

Durante muito tempo, um sistema de proxy de tráfego entre usuários e servidores finais baseado em scripts NGINX e Lua satisfez as necessidades da Cloudflare, mas à medida que a rede crescia e sua complexidade aumentava, uma solução universal revelou-se insuficiente, tanto em termos de desempenho e devido a limitações de extensibilidade e implementação de novas oportunidades para clientes. Em particular, houve desafios em adicionar funcionalidades além de um simples gateway e balanceador de carga. Por exemplo, tornou-se necessário, se o servidor não conseguisse processar uma solicitação, reenviar a solicitação para outro servidor, fornecendo-lhe um conjunto diferente de cabeçalhos HTTP.

Em vez de uma arquitetura que separa as solicitações em processos de trabalho separados, a Pingora usa um modelo multithread, que nos casos de uso da Cloudflare (alta concentração de tráfego de sites diferentes com uma grande mudança estatística) mostrou uma distribuição mais eficiente de recursos entre os núcleos da CPU. Em particular, a ligação de solicitações desequilibradas a processos pelo nginx resultou em carga desequilibrada nos núcleos da CPU, resultando em solicitações com uso intensivo de recursos e bloqueio de E/S, retardando o processamento de outras solicitações. Além disso, vincular o pool de conexões aos processos manipuladores não permitiu a reutilização de conexões já estabelecidas de outros processos manipuladores, o que reduz a eficiência quando há um grande número de processos manipuladores.

NGINX:

Cloudflare mudou de NGINX para seu próprio proxy Pingora, escrito em Rust

Pingora:

Cloudflare mudou de NGINX para seu próprio proxy Pingora, escrito em Rust

A implementação do Pingora permitiu reduzir em 160 vezes o número de instalações de novas ligações e aumentar a quota de consultas reutilizadas de 87.1% para 99.92%. Além de reduzir as reconexões e usar mais eficientemente os núcleos da CPU, a melhoria de desempenho do novo proxy deveu-se principalmente à remoção dos lentos manipuladores Lua usados ​​com o nginx.

A linguagem Rust foi escolhida por atingir alto desempenho aliado à disponibilidade de ferramentas para garantir operação segura com memória. Menciona-se que apesar dos engenheiros altamente qualificados da Cloudflare e da revisão do código escrito na linguagem C, não foi possível evitar erros que levavam a problemas de memória (por exemplo, uma vulnerabilidade no analisador HTML). Já o novo código fala de casos de análise de falhas no Pingora, que acabaram sendo causadas não por problemas na aplicação, mas por erro no kernel do Linux e falhas de hardware.

Além disso, podemos notar o comentário de Linus Torvalds, pronunciado na conferência Open-Source Summit Europe que acontece nestes dias, sobre a inclusão de suporte para a linguagem Rust no kernel Linux. Patches para desenvolvimento de drivers de dispositivos na linguagem Rust não foram incluídos no kernel 6.0, mas de acordo com Linus, eles provavelmente serão aceitos no kernel 6.1; ele não vai atrasar a integração. Como motivação para agregar apoio ao Rust, além do impacto positivo na segurança, Linus também cita a oportunidade de aumentar o interesse em trabalhar no núcleo de novos participantes, o que é importante no contexto do envelhecimento dos veteranos.

Fonte: opennet.ru

Adicionar um comentário