Lumipat ang Cloudflare mula sa NGINX patungo sa sarili nitong Pingora proxy na nakasulat sa Rust

Inanunsyo ng Cloudflare na inililipat nito ang network ng paghahatid ng nilalaman nito upang gamitin ang Pingora proxy, na nakasulat sa Rust. Pinalitan ng bagong proxy ang NGINX server-based na configuration ng mga Lua script, at humahawak ng mahigit isang trilyong kahilingan kada araw. Nabanggit na ang paglipat sa isang dalubhasang proxy ay pinapayagan hindi lamang upang ipatupad ang mga bagong tampok at dagdagan ang seguridad dahil sa ligtas na trabaho na may memorya, ngunit humantong din sa isang makabuluhang pagtaas sa pagganap at pagtitipid ng mapagkukunan - isang solusyon batay sa Pingora ay hindi nangangailangan ng paggamit ng Lua, samakatuwid ito ay kumukonsumo ng 70% na mas kaunting mapagkukunan ng CPU at 67% na mas kaunting memorya habang pinangangasiwaan ang parehong dami ng trapiko.

Sa loob ng mahabang panahon, ang isang sistema para sa pag-proxy ng trapiko sa pagitan ng mga user at end server batay sa NGINX at Lua script ay nasiyahan sa mga pangangailangan ng Cloudflare, ngunit habang lumalago ang network at tumaas ang pagiging kumplikado nito, hindi sapat ang isang unibersal na solusyon, kapwa sa mga tuntunin ng pagganap, at dahil sa mga limitasyon sa pagpapalawak at pagpapatupad ng mga bagong pagkakataon para sa mga kliyente. Sa partikular, nagkaroon ng mga kahirapan sa pagdaragdag ng functionality na lampas sa isang simpleng gateway at load balancer. Halimbawa, kung sakaling mabigo ang server na iproseso ang isang kahilingan, naging kinakailangan na i-redirect ang kahilingan sa isa pang server, na binibigyan ito ng ibang hanay ng mga header ng HTTP.

Sa halip na isang arkitektura na may paghahati-hati ng mga kahilingan sa magkakahiwalay na proseso ng manggagawa (mga manggagawa), ang Pingora ay gumagamit ng isang multi-threaded na modelo, na sa Cloudflare na mga senaryo ng paggamit (mataas na konsentrasyon ng trapiko mula sa iba't ibang mga site na may malaking pagbabago sa istatistika) ay nagpakita ng isang mas mahusay na pamamahagi ng mga mapagkukunan sa pagitan Mga core ng CPU. Sa partikular, ang pagbubuklod ng mga hindi balanseng kahilingan sa mga proseso sa nginx ay humantong sa isang hindi balanseng pag-load sa mga core ng CPU, bilang isang resulta kung saan ang mga kahilingan na masinsinang mapagkukunan at pagharang sa I / O ay nagpabagal sa pagproseso ng iba pang mga kahilingan. Bilang karagdagan, hindi pinahintulutan ng pagbubuklod ng pool ng koneksyon sa mga proseso ng handler ang muling paggamit ng mga naitatag nang koneksyon mula sa iba pang mga proseso ng handler, na nagpapababa ng kahusayan kapag may malaking bilang ng mga proseso ng handler.

nginx:

Lumipat ang Cloudflare mula sa NGINX patungo sa sarili nitong Pingora proxy na nakasulat sa Rust

Pingora:

Lumipat ang Cloudflare mula sa NGINX patungo sa sarili nitong Pingora proxy na nakasulat sa Rust

Ang pagpapakilala ng Pingora ay naging posible na bawasan ang bilang ng mga bagong operasyon sa pagtatatag ng koneksyon ng 160 beses at pataasin ang bahagi ng mga muling ginamit na kahilingan mula 87.1% hanggang 99.92%. Bilang karagdagan sa pagbabawas ng mga muling pagkonekta at mas mahusay na paggamit ng mga core ng CPU, ang pagganap ng bagong proxy ay pangunahin dahil sa pag-alis sa mabagal na mga humahawak ng Lua na ginagamit sa nginx.

Pinili ang Rust na wika bilang nagbibigay-daan para sa mataas na pagganap kasama ang pagkakaroon ng mga tool na ligtas sa memorya. Nabanggit na sa kabila ng mataas na kwalipikasyon ng mga inhinyero ng Cloudflare at mga pagsusuri sa code na nakasulat sa wikang C, hindi posible na maiwasan ang mga error na humahantong sa mga problema sa memorya (halimbawa, isang kahinaan sa HTML parser). Tulad ng para sa bagong code, napag-usapan namin ang tungkol sa mga kaso ng pagsusuri ng mga pag-crash sa Pingora, na naging sanhi hindi ng mga problema sa application, ngunit ng isang bug sa Linux kernel at mga pagkabigo sa hardware.

Bukod pa rito, mapapansing nagkomento si Linus Torvalds sa pagsasama ng suporta para sa Rust na wika sa Linux kernel, na binibigkas sa Open-Source Summit Europe conference na nagaganap sa mga araw na ito. Ang 6.0 kernel ay hindi nagsama ng mga patch para sa pagbuo ng mga driver ng device sa Rust na wika, ngunit ayon kay Linus, ang mga ito ay malamang na pinagtibay sa 6.1 kernel, siya ay hindi pagpunta sa pull sa integration. Bilang isang motibo para sa pagdaragdag ng suporta para sa Rust, bilang karagdagan sa isang positibong epekto sa seguridad, tinatawag din ni Linus ang pagkakataong pataasin ang interes sa pagtatrabaho sa core ng mga bagong kalahok, na mahalaga sa konteksto ng pagtanda ng mga lumang-timer.

Pinagmulan: opennet.ru

Magdagdag ng komento