Oferta Realizacje Stała opieka CRM i AI Blog O mnie Kontakt
Zadzwoń: 501 178 850 Napisz wiadomość

Cloudflare odzyskało ponad 100 TB pamięci RAM dzięki lepszemu haszowaniu

Cloudflare zmniejszyło zużycie pamięci RAM w usłudze równoważenia obciążenia o ponad 100 TB. Inżynierowie zoptymalizowali implementację spójnego haszowania w bibliotece pingora-ketama, zmniejszając liczbę punktów haszujących dla każdego serwera oraz upakowując struktury danych w języku Rust. Nowy mechanizm wdrożono stopniowo, aby uniknąć masowej utraty pamięci podręcznej i nagłego przeciążenia serwerów źródłowych.

Cloudflare odzyskało ponad 100 TB pamięci RAM dzięki lepszemu haszowaniu

Wewnętrzne rozwiązanie Pingora Backend Router odpowiada w infrastrukturze Cloudflare za rozdzielanie żądań kwalifikujących się do pamięci podręcznej pomiędzy serwerami zaplecza. Ze względu na konieczność obsługi serwerów o różnych wagach oraz zróżnicowanych kombinacji funkcji, system tworzył wiele pierścieni haszujących. Wygenerowało to ogromny narzut pamięciowy, za który odpowiadały struktury danych w bibliotece pingora-ketama.

Matematyczna analiza pozwoliła usunąć 90 procent haszy

Inżynierowie Cloudflare zastosowali rachunek prawdopodobieństwa, aby obliczyć minimalną liczbę punktów haszujących niezbędną do utrzymania wymaganego rozkładu obciążenia. Z dotychczasowych analiz wynikało, że każdy kolejny krok w dół marginesu błędu wymagał niemal dziesięciokrotnego zwiększenia liczby haszy przypadających na pojedynczy serwer, przez co kolejne zagęszczanie pierścienia przynosiło coraz mniejsze korzyści.

Przykładowo, dodanie ostatnich 90 000 haszy poprawiało precyzję rozkładu ruchu o zaledwie 0,7%. Co więcej, zgodnie z paradoksem dnia urodzin, wraz ze wzrostem liczby 32-bitowych punktów gwałtownie rosło prawdopodobieństwo kolizji, co wprowadzało dodatkowy błąd w równoważeniu obciążenia. Wnioski te pozwoliły zespołowi zredukować liczbę haszy na każdy serwer o około 90% bez zauważalnego pogorszenia precyzji działania systemu.

Zmniejszenie struktur w Rust i ochrona pamięci podręcznej

Drugim etapem prac była optymalizacja samych struktur danych w języku Rust. Dotychczasowa reprezentacja pojedynczego punktu w pierścieniu, zdefiniowana jako Point, zajmowała 8 bajtów. Inżynierowie przeprojektowali tę strukturę, mieszcząc sam hasz oraz indeks serwera w 6 bajtach, co przyniosło dalsze oszczędności pamięci operacyjnej.

Istotnym wyzwaniem okazał się sam proces publikacji zmian. Modyfikacja pierścienia haszującego zmienia lokalizację, do której trafiają poszczególne zapytania. Natychmiastowe przełączenie całej sieci unieważniłoby niemal całą zawartość pamięci podręcznej, co doprowadziłoby do gwałtownego skoku ruchu kierowanego bezpośrednio do serwerów źródłowych. Aby temu zapobiec, Cloudflare uruchomiło nową implementację równolegle ze starą, przenosząc ruch stopniowo.

Nie była to jedyna operacja tego typu w firmie: w sierpniu zespół Cloudflare odpowiedzialny za DNS opisał analogiczną redukcję zużycia pamięci podręcznej poprzez uproszczenie i optymalizację wewnętrznych struktur danych.

Opracowanie na podstawie: InfoQ

Powiązane wpisy

Chcesz, żebym się tym zajął?

Jeśli wolisz nie grzebać w tym samodzielnie, chętnie pomogę. Robię to od 14 lat.

Zobacz, jak mogę pomóc →
Zadzwoń Napisz Awaria / WP