Cloudflare a trecut de la NGINX la propriul proxy Pingora, scris în Rust

Cloudflare a anunțat tranziția rețelei sale de livrare de conținut pentru a utiliza proxy-ul Pingora, scris în limba Rust. Noul proxy înlocuiește configurația bazată pe serverul NGINX cu scripturi Lua și procesează mai mult de un trilion de solicitări pe zi. Se remarcă faptul că trecerea la un proxy specializat a permis nu numai implementarea de noi funcții și creșterea securității datorită funcționării în siguranță a memoriei, dar a dus și la o creștere semnificativă a performanței și a economisirii de resurse - soluția bazată pe Pingora nu necesită utilizarea de Lua și, prin urmare, consumă cu 70% mai puține resurse CPU și cu 67% mai puțină memorie în timp ce procesează aceeași cantitate de trafic.

Multă vreme, un sistem de proxy a traficului între utilizatori și serverele finale bazat pe scripturi NGINX și Lua a satisfăcut nevoile Cloudflare, dar pe măsură ce rețeaua creștea și complexitatea ei creștea, o soluție universală s-a dovedit a fi insuficientă, atât în ​​ceea ce privește performanță și datorită limitărilor în extensibilitate și implementare de noi oportunități pentru clienți. În special, au existat provocări în adăugarea de funcționalități dincolo de un simplu gateway și echilibrator de încărcare. De exemplu, a devenit necesar, dacă serverul nu reușește să proceseze o cerere, să retrimită cererea către un alt server, furnizându-i un set diferit de anteturi HTTP.

În loc de o arhitectură care separă cererile în procese de lucru separate, Pingora folosește un model multi-threaded, care în cazurile de utilizare Cloudflare (concentrație mare de trafic de la diferite site-uri cu o schimbare statistică mare) a arătat o distribuție mai eficientă a resurselor între nucleele CPU. În special, legarea de către nginx a cererilor dezechilibrate de procese a dus la o încărcare dezechilibrată a nucleelor ​​CPU, ducând la solicitări mari de resurse și blocând I/O, încetinind procesarea altor solicitări. În plus, legarea pool-ului de conexiuni la procesele handler nu a permis reutilizarea conexiunilor deja stabilite de la alte procese handler, ceea ce reduce eficiența atunci când există un număr mare de procese handler.

NGINX:

Cloudflare a trecut de la NGINX la propriul proxy Pingora, scris în Rust

Pinora:

Cloudflare a trecut de la NGINX la propriul proxy Pingora, scris în Rust

Implementarea Pingora a făcut posibilă reducerea de 160 de ori a numărului de instalații de conexiuni noi și creșterea ponderii cererilor reutilizate de la 87.1% la 99.92%. Pe lângă reducerea reconectărilor și utilizarea mai eficientă a nucleelor ​​CPU, îmbunătățirea performanței noului proxy s-a datorat în principal eliminării handlerelor Lua lente utilizate cu nginx.

Limbajul Rust a fost ales pentru a obține performanțe ridicate combinate cu disponibilitatea instrumentelor pentru a asigura funcționarea în siguranță cu memorie. Se menționează că, în ciuda inginerilor înalt calificați ai Cloudflare și a revizuirii codului scris în limbajul C, nu a fost posibilă evitarea erorilor care duc la probleme de memorie (de exemplu, o vulnerabilitate în parserul HTML). În ceea ce privește noul cod, se vorbește despre cazuri de analiză a defecțiunilor în Pingora, care s-au dovedit a fi cauzate nu de probleme în aplicație, ci de o eroare la kernel-ul Linux și defecțiuni hardware.

În plus, putem observa comentariul lui Linus Torvalds, exprimat la conferința Open-Source Summit Europe care are loc în aceste zile, cu privire la includerea suportului pentru limbajul Rust în nucleul Linux. Patch-urile pentru dezvoltarea driverelor de dispozitiv în limbajul Rust nu au fost incluse în nucleul 6.0, dar conform Linus, cel mai probabil vor fi acceptate în nucleul 6.1; el nu va întârzia integrarea. Ca o motivație pentru adăugarea de sprijin pentru Rust, pe lângă impactul pozitiv asupra securității, Linus menționează și oportunitatea de a crește interesul pentru lucrul la nucleul noilor participanți, ceea ce este important în contextul îmbătrânirii vechilor.

Sursa: opennet.ru

Adauga un comentariu