Prezentacja Cloudflare niedawno kto migruje? Twoja sieć dostarczania treści do korzystania z serwera proxy «pingora», który wyróżnia się tym, że jest napisany w Rust. The zastąpiono nowy serwer proxy Konfiguracja oparta na serwerze NGINX ze skryptami Lua i obsługuje ponad miliard żądań dziennie.
Należy zauważyć, że przejście na wyspecjalizowany serwer proxy «Pingora» pozwoliło nie tylko na wdrożenie nowych funkcji i zwiększenie bezpieczeństwa dzięki bezpiecznej pracy z pamięcią, ale także doprowadziło do znacznego wzrostu wydajności i oszczędności zasobów.
Rozwiązanie oparte na Pingora nie wymaga użycia Lua i wykorzystuje zoptymalizowaną pod względem obciążenia architekturę Cloudflare, zużywając 70% mniej zasobów procesora i 67% mniej pamięci przy przetwarzaniu tego samego ruchu.
Przez długi czas, system proxy ruchu między użytkownikami a serwerami końcowymi oparty na skryptach NGINX i Lua spełniłem potrzeby Cloudflare, ale wraz z rozwojem sieci i wzrostem jej złożoności, uniwersalne rozwiązanie nie wystarczyło, zarówno pod względem wydajności, jak i ograniczeń w rozszerzalności i realizacji nowych możliwości dla klientów.
W szczególności wystąpiły trudności w dodawaniu funkcjonalności poza prostą bramą i systemem równoważenia obciążenia. Na przykład w przypadku, gdy serwer nie był w stanie przetworzyć żądania, konieczne było przekierowanie żądania na inny serwer, dostarczając mu inny zestaw nagłówków HTTP.
Zamiast architektury ze zgłoszeniami podzielonymi na odrębne procesy robocze (pracownicy), Pingora korzysta z modelu wielowątkowego, co w scenariuszach użytkowania Cloudflare (wysoka koncentracja ruchu z różnych witryn z dużą zmianą statystyczną) wykazywało bardziej wydajną dystrybucję zasobów między rdzeniami procesora.
W szczególności wiązanie niezrównoważonych żądań z procesami w nginx prowadziło do niezrównoważonego obciążenia rdzeni procesora, w wyniku czego żądania wymagające dużej ilości zasobów i blokowanie we/wy spowalniały przetwarzanie innych żądań.
Ponadto powiązanie puli połączeń z procesami kontrolera nie pozwalało na ponowne wykorzystanie już ustanowionych połączeń z innych procesów kontrolera, co zmniejsza wydajność w przypadku dużej liczby procesów kontrolera.
Wprowadzenie Pingory umożliwiło 160-krotne zmniejszenie liczby operacji nawiązywanie nowych połączeń oraz zwiększyć odsetek powtórnie wykorzystanych żądań z 87,1% do 99,92%. Oprócz zmniejszenia liczby ponownych połączeń i wydajniejszego wykorzystania rdzeni procesora, poprawa wydajności nowego serwera proxy wynikała głównie z usunięcia wolnych sterowników Lua używanych z nginx.
Wybrano język Rust, ponieważ pozwala on na wysoką wydajność w połączeniu z dostępnością narzędzi bezpiecznych dla pamięci. Wspomina się, że pomimo wysoko wykwalifikowanych inżynierów Cloudflare i przeglądu kodu, programy napisane w języku C nie mogły uniknąć błędów, które prowadzą do problemów z pamięcią (na przykład luki w parserze HTML).
Jeśli chodzi o nowy kod, mówiliśmy o przypadkach analizy awarii w Pingorze, które okazały się spowodowane nie problemami w aplikacji, ale błędem w jądrze Linuksa i awariami sprzętu.
Dodatkowo można zauważyć, że Linus Torvalds skomentował włączenie obsługi języka Rust w jądrze Linuksa, wyrażone podczas odbywającej się w tych dniach konferencji Open-Source Summit Europe. Kernel 6.0 nie zawierał łatek do tworzenia sterowników urządzeń w języku Rust, ale według Linusa prawdopodobnie zostaną one zaakceptowane w jądrze 6.1, nie skorzystasz z integracji.
Jako powód do dodania wsparcia dla Rusta, oprócz pozytywnego wpływu na bezpieczeństwo, Linus korzysta również z okazji, aby zwiększyć zainteresowanie pracą nad jądrem ze strony nowych uczestników, co jest ważne w kontekście starzejących się weteranów.
W końcu jeśli chcesz dowiedzieć się więcej na ten temat, możesz sprawdzić szczegóły w poniższy link.