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 su server NGINX con script Lua e gestisce oltre un trilione di richieste al giorno. Si segnala che il passaggio a un proxy specializzato ha permesso non solo di implementare nuove funzionalità e aumentare la sicurezza grazie a una gestione della memoria sicura, ma ha anche portato a un significativo aumento delle prestazioni e al risparmio di risorse: la soluzione basata su Pingora richiede il 70% in meno di risorse CPU e il 67% in meno di memoria per gestire lo stesso volume di traffico.
Per lungo tempo, il sistema di proxying del traffico tra gli utenti e i finali server basato su NGINX e script Lua ha soddisfatto le esigenze di Cloudflare, ma con la crescita della rete e l'aumento della sua complessità, la soluzione universale si è rivelata insufficiente sia in termini di prestazioni sia a causa delle limitazioni in termini di scalabilità e implementazione di nuove funzionalità per i clienti. In particolare, sono emerse difficoltà nell'aggiungere funzionalità che andassero oltre un semplice gateway e bilanciatore di carico. Ad esempio, si è rivelata necessaria, in caso di errore nel trattamento della richiesta, server reindirizzare nuovamente la richiesta a un altro server, fornendo un diverso set di intestazioni HTTP.
Invece di un'architettura con la suddivisione delle richieste in singoli processi gestori (worker), Pingora utilizza un modello multithreading, che negli scenari di utilizzo di Cloudflare (alta concentrazione di traffico da diversi siti con un grande spostamento statistico) ha dimostrato una distribuzione delle risorse più efficace tra i core CPU. In particolare, l'assegnazione di richieste non bilanciate a processi in nginx portava a un carico sbilanciato sui core CPU, di conseguenza, richieste ad alta intensità di risorse e input/output bloccanti rallentavano l'elaborazione di altre richieste. Inoltre, l'assegnazione di un pool di connessioni a processi gestori non permetteva di riutilizzare connessioni già stabilite da altri processi gestori, il che riduceva l'efficienza del lavoro con un numero elevato di processi gestori.
NGINX:

Pingora:

L'implementazione di Pingora ha permesso di ridurre 160 volte il numero di operazioni per l'installazione di nuove connessioni e di aumentare la proporzione di richieste riutilizzabili dall'87,1% al 99,92%. Oltre alla riduzione delle connessioni ripetute e a un utilizzo più efficiente dei core CPU, l'aumento delle prestazioni del nuovo proxy è stato principalmente facilitato dall'eliminazione dei gestori lenti scritti in Lua utilizzati con nginx.
Il linguaggio Rust è stato scelto per la sua capacità di offrire elevate prestazioni con la combinazione di strumenti per garantire un uso sicuro della memoria. Si segnala che, nonostante l'alta qualificazione degli ingegneri di Cloudflare e la revisione del codice scritto in C, non si è riusciti a evitare errori che portano a problemi di memoria (ad esempio, una vulnerabilità nel parser HTML). Per quanto riguarda il nuovo codice, sono stati riportati casi di parsing di errori in Pingora, causati non da problemi nell'applicazione, ma da un errore nel kernel Linux e da guasti hardware.
Inoltre, si può evidenziare il commento di Linus Torvalds riguardo all'inclusione del supporto per il linguaggio Rust nel kernel Linux, espresso alla conferenza Open-Source Summit Europe in corso. Nei patch del kernel 6.0 non sono state incluse le patch per lo sviluppo di driver di dispositivi scritti in Rust, ma secondo Linus, saranno probabilmente accettate nel kernel 6.1, non ha intenzione di ritardare l'integrazione. Tra le motivazioni per aggiungere il supporto a Rust, oltre al suo impatto positivo sulla sicurezza, Linus menziona anche la possibilità di aumentare l'interesse dei nuovi partecipanti nel lavorare sul kernel, cosa rilevante considerando il pensionamento dei veterani.
Fonte: opennet.ru
