Cloudflare przeszło z NGINX na własny serwer proxy Pingora, napisany w Rust

Cloudflare ogłosiło przejście swojej sieci dostarczania treści na korzystanie z serwera proxy Pingora napisanego w języku Rust. Nowy serwer proxy zastępuje konfigurację opartą na serwerze NGINX skryptami Lua i przetwarza ponad bilion żądań dziennie. Należy zauważyć, że przejście na specjalizowany serwer proxy pozwoliło nie tylko wdrożyć nowe funkcje i zwiększyć bezpieczeństwo dzięki bezpiecznej pracy pamięci, ale także doprowadziło do znacznego wzrostu wydajności i oszczędności zasobów – rozwiązanie oparte na Pingorze nie wymaga użycia Lua i dlatego zużywa 70% mniej zasobów procesora i 67% mniej pamięci przy przetwarzaniu tej samej ilości ruchu.

Przez długi czas system proxy ruchu pomiędzy użytkownikami a serwerami końcowymi oparty o skrypty NGINX i Lua zaspokajał potrzeby Cloudflare, jednak wraz z rozrastaniem się sieci i wzrostem jej złożoności uniwersalne rozwiązanie okazało się niewystarczające, zarówno pod względem wydajności oraz ze względu na ograniczenia w rozszerzalności i wdrażaniu nowych możliwości dla klientów. W szczególności istniały wyzwania związane z dodawaniem funkcjonalności wykraczających poza prostą bramę i moduł równoważenia obciążenia. Na przykład, jeśli serwer nie przetworzy żądania, konieczne stało się ponowne wysłanie żądania do innego serwera, dostarczając mu inny zestaw nagłówków HTTP.

Zamiast architektury rozdzielającej żądania na osobne procesy robocze, Pingora wykorzystuje model wielowątkowy, który w przypadkach użycia Cloudflare (duża koncentracja ruchu z różnych witryn przy dużym przesunięciu statystycznym) wykazała bardziej efektywną dystrybucję zasobów pomiędzy rdzeniami procesora. W szczególności powiązanie przez nginx niezrównoważonych żądań z procesami spowodowało niezrównoważone obciążenie rdzeni procesora, co skutkowało żądaniami wymagającymi dużych zasobów i blokowaniem operacji we/wy, spowalniając przetwarzanie innych żądań. Ponadto powiązanie puli połączeń z procesami obsługi nie pozwoliło na ponowne wykorzystanie już ustanowionych połączeń z innych procesów obsługi, co zmniejsza wydajność, gdy istnieje duża liczba procesów obsługi.

NGINX:

Cloudflare przeszło z NGINX na własny serwer proxy Pingora, napisany w Rust

Pingora:

Cloudflare przeszło z NGINX na własny serwer proxy Pingora, napisany w Rust

Wdrożenie Pingory umożliwiło 160-krotne zmniejszenie liczby instalacji nowych połączeń i zwiększenie udziału ponownie wykorzystanych żądań z 87.1% do 99.92%. Oprócz ograniczenia liczby ponownych połączeń i bardziej wydajnego wykorzystania rdzeni procesora, poprawa wydajności nowego proxy wynikała głównie z usunięcia powolnych procedur obsługi Lua używanych z Nginx.

Wybrano język Rust, aby osiągnąć wysoką wydajność w połączeniu z dostępnością narzędzi zapewniających bezpieczną pracę z pamięcią. Wspomina się, że pomimo wysoko wykwalifikowanych inżynierów Cloudflare i przeglądu kodu napisanego w języku C, nie udało się uniknąć błędów prowadzących do problemów z pamięcią (np. luka w parserze HTML). Jeśli chodzi o nowy kod, mowa jest w nim o przypadkach analizy awarii w Pingorze, które okazały się być spowodowane nie problemami w aplikacji, a błędem w jądrze Linuksa i awariami sprzętu.

Dodatkowo możemy odnotować komentarz Linusa Torvaldsa wygłoszony podczas odbywającej się obecnie konferencji Open-Source Summit Europe, dotyczący włączenia obsługi języka Rust do jądra Linuksa. Łatki do tworzenia sterowników urządzeń w języku Rust nie zostały uwzględnione w jądrze 6.0, ale zdaniem Linusa najprawdopodobniej zostaną one przyjęte w jądrze 6.1 i nie zamierza on opóźniać integracji. Jako motywację do dodania wsparcia dla Rusta, poza pozytywnym wpływem na bezpieczeństwo, Linus przytacza także możliwość zwiększenia zainteresowania pracą nad rdzeniem nowych uczestników, co jest ważne w kontekście starzenia się weteranów.

Źródło: opennet.ru

Dodaj komentarz