Oświadczenie : Ta sama rada dotyczy wszystkich usług oferujących przepływność powyżej 10 Gb / s. Obejmuje to między innymi usługi równoważenia obciążenia, serwery buforujące, serwery WWW (HAProxy, Varnish, nginx, tomcat, ...)
To, co chcesz zrobić, jest złe, nie rób tego
Zamiast tego użyj CDN
CDN mają na celu dostarczanie buforowanej zawartości statycznej. Użyj odpowiedniego narzędzia do pracy (akamai, MaxCDN, cloudflare, cloudfront, ...)
Każdy CDN, nawet darmowy, da sobie radę lepiej niż cokolwiek, co możesz osiągnąć na własną rękę.
Zamiast tego skaluj w poziomie
Oczekuję, że pojedynczy serwer poradzi sobie z gotową szybkością 1-5 Gb / s bez większego podkręcania (uwaga: serwowanie tylko plików statycznych). 8-10 Gb / s jest zwykle w zasięgu dzięki zaawansowanemu strojeniu.
Niemniej jednak istnieje wiele twardych ograniczeń co do pojedynczego pudełka. Powinieneś preferować skalowanie w poziomie.
Uruchom jedno urządzenie, wypróbuj rzeczy, zmierz, zmierz, testuj, optymalizuj ... aż to urządzenie będzie niezawodne i niezawodne, a jego możliwości zostaną dobrze określone, a następnie umieść więcej takich urządzeń za pomocą globalnego modułu równoważenia obciążenia.
Istnieje kilka globalnych opcji równoważenia obciążenia: większość CDN może to zrobić, roundrobin DNS, równoważenie obciążenia ELB / Google ...
Zignorujmy dobre praktyki i i tak to zróbmy
Zrozumienie wzorca ruchu
WITHOUT REVERSE PROXY
[request ] user ===(rx)==> backend application
[response] user <==(tx)=== [processing...]
Należy wziąć pod uwagę dwie rzeczy: szerokość pasma i kierunek (emisja lub odbiór).
Małe pliki to 50/50 tx / rx, ponieważ nagłówki HTTP i obciążenie TCP są większe niż zawartość pliku.
Duże pliki mają rozmiar 90/10 tx / rx, ponieważ rozmiar żądania jest pomijalny w porównaniu z rozmiarem odpowiedzi.
WITH REVERSE PROXY
[request ] user ===(rx)==> nginx ===(tx)==> backend application
[response] user <==(tx)=== nginx <==(rx)=== [processing...]
Odwrotny serwer proxy przekazuje wszystkie wiadomości w obu kierunkach. Obciążenie wynosi zawsze 50/50, a całkowity ruch jest podwojony.
Staje się bardziej złożony z włączonym buforowaniem. Żądania mogą być przekierowywane na dysk twardy, którego dane mogą być buforowane w pamięci.
Uwaga : zignoruję aspekt buforowania w tym poście. Skoncentrujemy się na uzyskaniu 10-40 Gb / s w sieci. Wiedząc, czy dane pochodzą z pamięci podręcznej i optymalizacja tej pamięci podręcznej to kolejny temat, przesuwa się ją w obie strony.
Ograniczenia monocore
Równoważenie obciążenia to monocore (szczególnie równoważenie TCP). Dodanie rdzeni nie przyspiesza, ale może spowolnić.
To samo dotyczy równoważenia HTTP w prostych trybach (np. Adres IP, adres URL, plik cookie. Odwrotny serwer proxy odczytuje nagłówki w locie, nie analizuje ani nie przetwarza żądań HTTP w ścisłym tego słowa znaczeniu).
W trybie HTTPS deszyfrowanie / szyfrowanie SSL jest bardziej intensywne niż wszystko inne wymagane do proxy. Ruch SSL może i powinien być podzielony na wiele rdzeni.
SSL
Biorąc pod uwagę, że robisz wszystko przez SSL. Będziesz chciał zoptymalizować tę część.
Szyfrowanie i deszyfrowanie 40 Gb / s w locie to spore osiągnięcie.
Weź procesor najnowszej generacji z instrukcjami AES-NI (używany do operacji SSL).
Dostrój algorytm używany przez certyfikaty. Istnieje wiele algorytmów. Chcesz ten, który jest najbardziej efektywny na twoim procesorze (wykonaj testy porównawcze) PODCZAS obsługiwania przez klientów ORAZ bycia wystarczająco bezpiecznym (bez konieczności nadmiernego szyfrowania).
IRQ i przypinanie rdzenia
Karta sieciowa generuje przerwania (IRQ), gdy pojawiają się nowe dane do odczytu, a procesor jest wstępnie opróżniany, aby natychmiast obsłużyć kolejkę. Jest to operacja działająca w jądrze i / lub sterownikach urządzeń i jest ściśle monocore.
Może być największym konsumentem procesora z miliardami pakietów wychodzących we wszystkich kierunkach.
Przypisz karcie sieciowej unikalny numer IRQ i przypnij ją do określonego rdzenia (zobacz ustawienia Linux lub BIOS).
Przypnij odwrotne proxy do innych rdzeni. Nie chcemy, aby te dwie rzeczy przeszkadzały.
Adapter Ethernet
Karta sieciowa wykonuje duże obciążenia. Wszystkie urządzenia i producenci nie są równi pod względem wydajności.
Zapomnij o zintegrowanym adapterze na płytach głównych (nie ma znaczenia, czy płyta główna serwera lub płyty głównej), po prostu są do bani.
Odciążanie TCP
TCP jest bardzo intensywnym protokołem pod względem przetwarzania (sumy kontrolne, ACK, retransmisja, ponowne składanie pakietów, ...) Jądro obsługuje większość pracy, ale niektóre operacje mogą zostać odciążone na karcie sieciowej, jeśli ją obsługuje.
Nie chcemy tylko stosunkowo szybkiej karty , chcemy tę z wszystkimi dzwonkami i gwizdkami.
Zapomnij o Intel, Mellanox, Dell, HP i cokolwiek innego. Nie obsługują tego wszystkiego.
Na stole jest tylko jedna opcja: SolarFlare - tajna broń firm HFT i CDN.
Świat jest podzielony na dwa rodzaje ludzi: „ tych, którzy znają SolarFlare ” i „ tych, którzy nie wiedzą ”. (pierwszy zestaw jest ściśle równoważny z „ ludźmi, którzy robią sieci 10 Gb / s i dbają o wszystko ”). Ale dygresję, skupmy się: D
Strojenie TCP jądra
Dostępne są opcje sysctl.conf
buforów sieciowych jądra. Co te ustawienia robią lub nie. Naprawdę nie wiem.
net.core.wmem_max
net.core.rmem_max
net.core.wmem_default
net.core.rmem_default
net.ipv4.tcp_mem
net.ipv4.tcp_wmem
net.ipv4.tcp_rmem
Zabawa z tymi ustawieniami jest ostatecznym znakiem nadmiernej optymalizacji (tj. Ogólnie bezużytecznej lub nieproduktywnej].
Wyjątkowo może to mieć sens, biorąc pod uwagę ekstremalne wymagania.
(Uwaga: 40 Gb / s na jednym urządzeniu to nadmierna optymalizacja. Rozsądną drogą jest skalowanie w poziomie.)
Niektóre ograniczenia fizyczne
Przepustowość pamięci
Niektóre liczby dotyczące przepustowości pamięci (głównie w GB / s): http://www.tweaktown.com/articles/6619/crucial-ddr4-memory-performance-overview-early-look-vs-ddr2-ddr3/index.html
Powiedzmy, że zakres wynosi 150-300 Gb / s dla przepustowości pamięci (maksymalny limit w idealnych warunkach).
W pewnym momencie wszystkie pakiety muszą znajdować się w pamięci. Samo pobieranie danych przy szybkości linii 40 Gb / s stanowi duże obciążenie dla systemu.
Czy pozostanie jakakolwiek moc do przetwarzania danych? Nie przejmujmy się zbytnio naszymi oczekiwaniami. Tylko mówię ^^
Magistrala PCI-Express
PCIe 2.0 to 4 Gb / s na linię. PCIe 3.0 ma przepustowość 8 Gb / s na linię (nie wszystkie są dostępne dla karty PCI).
Karta sieciowa 40 Gb / s z pojedynczym portem Ethernet obiecuje więcej niż magistrala PCIe, jeśli złącze ma długość mniejszą niż 16x w specyfikacji v3.0.
Inny
Możemy przekroczyć inne granice. Chodzi o to, że sprzęt ma twarde ograniczenia związane z prawem fizyki.
Oprogramowanie nie może działać lepiej niż sprzęt, na którym działa.
Szkielet sieci
Wszystkie te pakiety muszą gdzieś pójść, przełączyć przełączniki i routery. Przełączniki i router 10 Gb / s są [prawie] towarem. 40 Gb / s zdecydowanie nie jest.
Ponadto przepustowość musi być od końca do końca, więc jakie masz linki do użytkownika?
Ostatnim razem, gdy sprawdzałem z moim facetem z centrum danych, czy jest mały projekt 10 mln użytkowników, było całkiem jasne, że do Internetu będą mieć tylko 2x łącza 10 Gbits.
Dyski twarde
iostat -xtc 3
Metryki są podzielone według odczytu i zapisu. Sprawdź kolejkę (<1 jest dobra), opóźnienie (<1 ms jest dobra) i prędkość transferu (im wyższa, tym lepsza).
Jeśli dysk jest wolny, rozwiązaniem jest umieszczenie większej liczby I większych dysków SSD w rajdzie 10. (zwróć uwagę, że przepustowość dysku SSD rośnie liniowo wraz z rozmiarem dysku SSD).
Wybór procesora
IRQ i inne wąskie gardła działają tylko na jednym rdzeniu, więc celuj w procesor o najwyższej wydajności pojedynczego rdzenia (tj. Najwyższej częstotliwości).
Szyfrowanie / deszyfrowanie SSL wymaga instrukcji AES-NI, więc staraj się tylko najnowszej wersji procesora.
SSL korzysta z wielu rdzeni, więc celuj w wiele rdzeni.
Krótko mówiąc: idealny procesor to najnowszy z najwyższą dostępną częstotliwością i wieloma rdzeniami. Po prostu wybierz najdroższy i to chyba wszystko: D
Wyślij plik()
Sendfile ON
Po prostu największy postęp współczesnych jąder dla wysokowydajnych serwerów sieciowych.
Ostatnia uwaga
1 SolarFlare NIC 40 Gbps (pin IRQ and core)
2 SolarFlare NIC 40 Gbps (pin IRQ and core)
3 nginx master process
4 nginx worker
5 nginx worker
6 nginx worker
7 nginx worker
8 nginx worker
...
Jedna rzecz przypisana do jednego procesora. To jest właściwa droga.
Jedna karta sieciowa prowadząca do świata zewnętrznego. Jedna karta sieciowa prowadząca do sieci wewnętrznej. Podział obowiązków jest zawsze miły (choć podwójna karta sieciowa 40 Gb / s może być przesada).
To wiele rzeczy, które można dopracować, a niektóre z nich mogą być tematem małej książki. Miłej zabawy z testowaniem tego wszystkiego. Wróć, aby opublikować wyniki.