Cloudflare przeszedł z NGINX na własny proxy Pingora, napisany w języku Rust

Firma Cloudflare ogłosiła przeniesienie swojej sieci dostarczania treści na użycie proxy Pingora, napisanego w języku Rust. Nowe proxy zastąpiło konfigurację opartą na serwerze NGINX z skryptami Lua i obsługuje ponad bilion zapytań dziennie. Zauważono, że przejście na wyspecjalizowane proxy pozwoliło nie tylko na wdrożenie nowych możliwości i zwiększenie bezpieczeństwa poprzez bezpieczne zarządzanie pamięcią, ale także doprowadziło do znaczącego zwiększenia wydajności i oszczędności zasobów — rozwiązanie oparte na Pingora nie wymaga użycia Lua, dlatego zużywa o 70% mniej zasobów CPU i o 67% mniej pamięci przy przetwarzaniu tego samego wolumenu ruchu.

Przez długi czas system do proxowania ruchu między użytkownikami a końcowymi serwerami na bazie NGINX i skryptów Lua zaspokajał potrzeby Cloudflare, ale wraz ze wzrostem sieci i zwiększeniem jej złożoności uniwersalne rozwiązanie okazało się niewystarczające, zarówno pod względem wydajności, jak i z powodu ograniczeń w rozszerzalności oraz wdrażaniu nowych możliwości dla klientów. W szczególności pojawiły się trudności w dodawaniu funkcjonalności wykraczającej poza prosty bramę i load balancer. Na przykład, pojawiła się potrzeba w przypadku awarii przetwarzania zapytania serwerem przekierować zapytanie na inny serwer, dostarczając mu inny zestaw nagłówków HTTP.

Zamiast architektury z podziałem zapytań pomiędzy poszczególnymi procesami-obsługującymi (worker) w Pingora zastosowano model wielowątkowy, który w scenariuszach użycia Cloudflare (wysoka koncentracja ruchu z różnych stron przy dużym statystycznym przesunięciu) wykazał bardziej efektywne rozdzielenie zasobów pomiędzy rdzeniami CPU. W szczególności, przypisanie nieskoordynowanych zapytań do procesów w nginx prowadziło do nierównomiernego obciążenia rdzeni CPU, przez co zasobożerne zapytania i blokujący I/O spowalniały przetwarzanie innych zapytań. Ponadto, przypisanie puli połączeń do procesów-obsługujących nie pozwalało na ponowne wykorzystanie już nawiązanych połączeń innych procesów-obsługujących, co zmniejsza efektywność działania przy dużej liczbie procesów-obsługujących.

NGINX:

Cloudflare przeszedł z NGINX na własny proxy Pingora, napisany w języku Rust

Pingora:

Cloudflare przeszedł z NGINX na własny proxy Pingora, napisany w języku Rust

Wdrożenie Pingora pozwoliło na 160-krotne zmniejszenie liczby operacji instancjonowania nowych połączeń i zwiększenie udziału powtórnie używanych zapytań z 87,1% do 99,92%. Oprócz redukcji powtórnych połączeń i bardziej efektywnego wykorzystania jąder CPU, wzrost wydajności nowego proxy był przede wszystkim skutkiem rezygnacji z używanych w Nginx wolnych przetworników napisanych w języku Lua.

Język Rust został wybrany jako ten, który pozwala na uzyskanie wysokiej wydajności przy jednoczesnym zapewnieniu bezpieczeństwa pracy z pamięcią. Wspomina się, że pomimo wysokich kwalifikacji inżynierów Cloudflare i przeglądów kodu w napisanym w języku C nie udało się uniknąć błędów prowadzących do problemów z pamięcią (np. podatność w parserze HTML). Jeśli chodzi o nowy kod, wspomniano o przypadkach awarii w Pingora, które okazały się wynikiem błędów w jądrze Linux i usterek sprzętowych.

Dodatkowo warto zauważyć komentarz Linusa Torvaldsa na odbywającej się w tych dniach konferencji Open-Source Summit Europe, dotyczący wprowadzenia wsparcia dla języka Rust w jądrze Linux. W jądrze 6.0 łatki dla rozwoju sterowników urządzeń w języku Rust nie zostały wprowadzone, ale według Linusa prawdopodobnie zostaną zaakceptowane w jądrze 6.1, nie planuje zwlekać z integracją. Jako motywację do dodania wsparcia dla Rust, poza pozytywnym wpływem na bezpieczeństwo, Linus wymienia również możliwość zwiększenia zainteresowania pracą nad jądrem nowych uczestników, co jest aktualne w kontekście starzejących się weteranów.

Źródło: opennet.ru

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster