L'azienda Cloudflare ha annunciato il passaggio della sua rete di distribuzione dei contenuti all'utilizzo del proxy Pingora, scritto in Rust. Il nuovo proxy ha sostituito la configurazione basata sul server NGINX con script Lua e gestisce oltre un trilione di richieste al giorno. Si segnala che il passaggio a un proxy specializzato ha non solo permesso di implementare nuove funzionalità e aumentare la sicurezza grazie a una gestione sicura della memoria, ma ha anche portato a un significativo aumento delle prestazioni e a un risparmio di risorse: la soluzione basata su Pingora non richiede l'uso di Lua, riducendo così il consumo di CPU del 70% e della memoria del 67% per gestire lo stesso volume di traffico.
Per lungo tempo, il sistema per il proxying del traffico tra utenti e finali server basata su NGINX e script Lua soddisfaceva le esigenze di Cloudflare, ma con la crescita della rete e l'aumento della sua complessità, una soluzione universale si è rivelata insufficiente, sia dal punto di vista delle prestazioni che a causa delle limitazioni nella scalabilità e nell'implementazione di nuove funzionalità per i clienti. In particolare, sono emerse difficoltà nell'aggiungere funzioni che superassero il semplice ruolo di gateway e bilanciatore di carico. Ad esempio, è emersa la necessità, in caso di errore nel trattamento della richiesta, server di reindirizzare la richiesta a un altro server, fornendogli un diverso insieme di intestazioni HTTP.
Invece dell'architettura con separazione delle richieste tra processi gestori (worker), Pingora utilizza un modello multithreading, che ha dimostrato una distribuzione delle risorse più efficace tra i core CPU negli scenari di utilizzo di Cloudflare (alta concentrazione di traffico da diversi siti con un grande spostamento statistico). In particolare, il legame di richieste squilibrate ai processi in nginx portava a un carico sbilanciato sui core CPU, il che comportava che richieste intensive di risorse e operazioni di input/output bloccanti rallentassero l'elaborazione di altre richieste. Inoltre, il legame di un pool di connessioni ai processi gestori non consentiva il riutilizzo delle connessioni già stabilite da altri processi gestori, riducendo così l'efficienza operativa con un gran numero di processi gestori.
NGINX:

Pingora:

L'implementazione di Pingora ha consentito di ridurre di 160 volte il numero di operazioni per l'installazione di nuove connessioni e di aumentare la quota di richieste riutilizzate dall'87,1% al 99,92%. Oltre alla riduzione delle riconnessioni e a un uso più efficiente dei core CPU, il miglioramento delle prestazioni del nuovo proxy è stato principalmente attribuito all'eliminazione dei gestori lenti utilizzati con nginx scritti in Lua.
Il linguaggio Rust è stato scelto per garantire elevate prestazioni insieme a strumenti per garantire un uso sicuro della memoria. Si menziona che, nonostante le elevate competenze degli ingegneri di Cloudflare e la revisione del codice scritto in C, non è stato possibile evitare errori che portano a problemi di memoria (ad esempio, una vulnerabilità nel parser HTML). Per quanto riguarda il nuovo codice, sono stati forniti esempi di crash in Pingora causati non da problemi nell'applicazione, ma da un errore nel kernel di Linux e da guasti hardware.
Inoltre, si può notare il commento di Linus Torvalds riguardo l'inclusione del supporto per il linguaggio Rust nel kernel Linux, pronunciato durante la conferenza Open-Source Summit Europe in corso. Le patch per lo sviluppo di driver in Rust non sono state incluse nel kernel 6.0, ma secondo Linus saranno probabilmente accettate nel kernel 6.1, e non ha intenzione di rimandarne l'integrazione. Come motivazione per aggiungere il supporto per Rust, oltre al suo impatto positivo sulla sicurezza, Linus menziona anche la possibilità di suscitare l'interesse di nuovi partecipanti nel lavoro sul kernel, che è importante considerando l'invecchiamento degli sviluppatori veterani.
Fonte: opennet.ru
