Cloudflare bytte från NGINX till sin egen Pingora-proxy skriven i Rust

Cloudflare tillkännagav övergången av sitt innehållsleveransnätverk för att använda Pingora-proxyn, skriven på språket Rust. Den nya proxyn ersätter den NGINX-serverbaserade konfigurationen med Lua-skript och behandlar mer än en biljon förfrågningar per dag. Det noteras att övergången till en specialiserad proxy inte bara gjorde det möjligt att implementera nya funktioner och öka säkerheten på grund av säker drift av minnet, utan också ledde till en betydande ökning av prestanda och resursbesparingar - den Pingora-baserade lösningen kräver inte användning av Lua, och förbrukar därför 70 % mindre resurser CPU och 67 % mindre minne samtidigt som den bearbetar samma mängd trafik.

Ett system för proxysändning av trafik mellan användare och slutservrar baserat på NGINX- och Lua-skript tillfredsställde länge Cloudflares behov, men i takt med att nätverket växte och dess komplexitet ökade visade sig en universallösning vara otillräcklig, både m.t.t. prestanda och på grund av begränsningar i utökbarhet och implementering av nya möjligheter för kunder. I synnerhet fanns det utmaningar med att lägga till funktionalitet bortom en enkel gateway och lastbalanserare. Till exempel blev det nödvändigt, om servern misslyckas med att behandla en begäran, att skicka om begäran till en annan server och förse den med en annan uppsättning HTTP-rubriker.

Istället för en arkitektur som separerar förfrågningar i separata arbetsprocesser använder Pingora en flertrådad modell, som i Cloudflare-användningsfall (hög koncentration av trafik från olika sajter med en stor statistisk förskjutning) visade en mer effektiv fördelning av resurser mellan CPU-kärnor. I synnerhet resulterade nginx bindning av obalanserade förfrågningar till processer i obalanserad belastning på CPU-kärnorna, vilket resulterade i resurskrävande förfrågningar och blockering av I/O som saktar ner behandlingen av andra förfrågningar. Dessutom tillät inte bindning av anslutningspoolen till hanterarprocesser återanvändning av redan etablerade anslutningar från andra hanterarprocesser, vilket minskar effektiviteten när det finns ett stort antal hanterarprocesser.

NGINX:

Cloudflare bytte från NGINX till sin egen Pingora-proxy skriven i Rust

Pingora:

Cloudflare bytte från NGINX till sin egen Pingora-proxy skriven i Rust

Implementeringen av Pingora gjorde det möjligt att minska antalet installationer av nya anslutningar med 160 gånger och öka andelen återanvända förfrågningar från 87.1 % till 99.92 %. Förutom att minska återanslutningar och effektivare användning av CPU-kärnor, berodde den nya proxyns prestandaförbättring främst på borttagningen av långsamma Lua-hanterare som används med nginx.

Språket Rust valdes för att uppnå hög prestanda i kombination med tillgången på verktyg för att säkerställa säker drift med minne. Det nämns att trots de högt kvalificerade ingenjörerna av Cloudflare och granskning av koden skriven på C-språket, var det inte möjligt att undvika fel som ledde till minnesproblem (till exempel en sårbarhet i HTML-parsern). När det gäller den nya koden talar den om fall av analysfel i Pingora, som visade sig inte bero på problem i applikationen, utan av ett fel i Linux-kärnan och hårdvarufel.

Dessutom kan vi notera kommentaren från Linus Torvalds, uttryckt vid Open-Source Summit Europe-konferensen som äger rum i dagarna, angående inkluderingen av stöd för språket Rust i Linux-kärnan. Patchar för att utveckla enhetsdrivrutiner i Rust-språket ingick inte i 6.0-kärnan, men enligt Linus kommer de med största sannolikhet att accepteras i 6.1-kärnan, han kommer inte att fördröja integrationen. Som en motivering för att lägga till stöd för Rust, utöver den positiva inverkan på säkerheten, nämner Linus också möjligheten att öka intresset för att arbeta med kärnan av nya deltagare, vilket är viktigt i sammanhanget med åldrande oldtimers.

Källa: opennet.ru

Lägg en kommentar