Jakie są opóźnienia w centrum danych? Pytam o to, zakładając, że istnieją rzędy wielkości różnicy

18

Próbuję znaleźć coś, na co po prostu nie mogę znaleźć dobrej odpowiedzi.

Jeśli powiem, że pamięć podręczna REDIS (lub zewnętrzna pamięć podręczna w pamięci) znajduje się w centrum danych, a serwer aplikacji znajduje się w tym samym centrum danych, jaka będzie szybkość połączenia sieciowego (opóźnienie, przepustowość) do odczytu danych między tymi dwiema maszynami?

Czy na przykład „prędkość” sieci będzie nadal co najmniej o rząd wielkości wyższa niż prędkość pamięci RAM, która szuka moich danych poza pamięcią podręczną w REDIS?

Moje ostateczne pytanie brzmi - czy to wszystko siedzi w pamięci na REDIS faktycznie zapewniając jakieś narzędzie? W przeciwieństwie do tego, czy REDIS buforował to wszystko na dysku SSD? Pamięć jest droga. Jeśli sieć rzeczywiście nie jest wąskim gardłem W centrum danych, pamięć ma wartość. W przeciwnym razie nie.

Wydaje mi się, że moje ogólne pytanie brzmi: pomimo ogromnych niewiadomych w centrach danych i niemożności uogólnienia, jak również wariancji, czy mówimy o wystarczających rzędach wielkości między opóźnieniem pamięci w systemie komputerowym a nawet najlepszymi sieciami wewnętrznymi dla DC, które pamięć skrócone opóźnienia nie zapewniają znaczącej poprawy wydajności? Rozumiem, że istnieje wiele zmiennych, ale jak blisko jest? Czy jest tak blisko, że te zmienne mają znaczenie? Weźmy na przykład postawę hiperboliczną, napęd taśmowy jest WOLNIE wolniejszy niż sieć, więc taśma nie jest idealna do pamięci podręcznej.

Neeraj Murarka
źródło
1
Zależy to również od liczby podróży w obie strony na transakcję, jest to często prawdziwy problem, który jest serializowany w sekwencji zapytań. Bardziej złożony interfejs zapytań, procedura po stronie serwera lub pamięć podręczna denormalizwd mogą zmniejszyć wpływ.
eckes

Odpowiedzi:

20

Istnieje kilka wersji „wykresów opóźnień, które każdy powinien znać”, takich jak:

Chodzi o to, że w rzeczywistości istnieje coś więcej niż tylko opóźnienie. To kombinacja czynników.

Jakie jest opóźnienie sieci w centrum danych? Opóźnienie, powiedziałbym, że „zawsze” poniżej 1ms. Czy to jest szybsze niż pamięć RAM? Nie. Czy jest blisko pamięci RAM? Nie wydaje mi się

Pozostaje jednak pytanie, czy jest istotne. Czy to jest podstawa, którą musisz znać? Twoje pytanie ma dla mnie sens. Ponieważ wszystko ma swój koszt, powinieneś dostać więcej pamięci RAM, aby wszystkie dane mogły pozostać w pamięci RAM lub od czasu do czasu można czytać z dysku.

Twoim „założeniem” jest to, że jeśli opóźnienie sieci jest większe (wolniejsze) niż prędkość dysku SSD, nie zyskasz, mając wszystkie dane w pamięci RAM, ponieważ będziesz mieć wolne w sieci.

I tak by się wydawało. Ale musisz również wziąć pod uwagę współbieżność. Jeśli otrzymasz 1000 żądań danych jednocześnie, czy dysk może wykonać 1000 równoczesnych żądań? Oczywiście, że nie, więc ile czasu zajmie obsłużenie tych 1000 próśb? W porównaniu do pamięci RAM?

Trudno sprowadzić go do jednego czynnika, takiego jak duże obciążenia. Ale tak, jeśli wykonałeś jedną operację, opóźnienie sieci jest takie, że prawdopodobnie nie zauważysz różnicy między dyskiem SSD a pamięcią RAM.

Podobnie jak do momentu pojawienia się na rynku dysku 12 Gb / s, łącze sieciowe 10 Gb / s nie byłoby przeciążone przez pojedynczy strumień, ponieważ dysk stanowił wąskie gardło.

Pamiętaj jednak, że twój dysk robi wiele innych rzeczy, twój proces nie jest jedynym procesem na komputerze, twoja sieć może przenosić różne rzeczy itp.

Ponadto nie cała aktywność dysku oznacza ruch sieciowy. Zapytanie do bazy danych pochodzące z aplikacji na serwer bazy danych to tylko bardzo minimalny ruch sieciowy. Odpowiedź serwera bazy danych może być bardzo mała (pojedyncza liczba) lub bardzo duża (tysiąc wierszy z wieloma polami). Aby wykonać operację, serwer (serwer bazy danych lub nie) może wymagać wykonania wielu operacji wyszukiwania, odczytu i zapisu na dysku, ale wysyłania bardzo małej ilości danych z powrotem przez sieć. Zdecydowanie nie jest to RAM-dysk sieciowy jeden na jednego.


Do tej pory unikałem pewnych szczegółów twojego pytania - w szczególności części Redis.

Redis to open source (licencjonowany BSD), magazyn struktur danych w pamięci, wykorzystywany jako baza danych, pamięć podręczna i broker komunikatów. - https://redis.io/

OK, to znaczy, że wszystko jest w pamięci. Przepraszamy, ten szybki dysk SSD ci tutaj nie pomoże. Redis może utrwalać dane na dysku, dzięki czemu można je załadować do pamięci RAM po ponownym uruchomieniu. To tylko po to, aby nie „utracić” danych ani nie trzeba ponownie wypełniać zimnej pamięci podręcznej po ponownym uruchomieniu. W takim przypadku musisz użyć pamięci RAM, bez względu na wszystko. Musisz mieć wystarczającą ilość pamięci RAM, aby pomieścić swój zestaw danych. Za mało pamięci RAM i myślę, że twój system operacyjny zużyje swap- prawdopodobnie nie jest to dobry pomysł.

ETL
źródło
Dzięki. To jest rzeczywiście przydatne. Rzeczywiście istnieje wiele różnic kontekstowych, które mają na to wpływ. Jeśli przez chwilę zignorujemy duże obciążenia, z twojej odpowiedzi wynika, że ​​rzeczywiście opóźnienie w sieci jest wąskim gardłem, więc dodatkowe opóźnienie SSD w porównaniu z pamięcią RAM nie jest wystarczająco znaczące, aby miało znaczenie. Ale teraz, jeśli weźmiemy pod uwagę duże obciążenia, różnice opóźnień SSD w stosunku do pamięci RAM zaczynają się pogłębiać, a teraz pamięć RAM będzie świecić. Czy to do tego sprowadza się?
Neeraj Murarka,
1
Trudno to sprowadzić do jednego czynnika dużych obciążeń. Ale tak, jeśli wykonałeś jedną operację, opóźnienie sieci jest takie, że prawdopodobnie nie zauważysz różnicy między dyskiem SSD a pamięcią RAM. Podobnie jak do momentu pojawienia się na rynku dysku 12 Gb / s, łącze sieciowe 10 Gb / s nie byłoby przeciążone przez pojedynczy strumień, ponieważ dysk stanowił wąskie gardło. Ale pamiętaj, że twój dysk robi wiele innych rzeczy, twój proces nie jest jedynym procesem na maszynie itp.
ETL
1
Zauważ także, że oprócz opóźnień należy wziąć pod uwagę wiele innych czynników, w szczególności, że większość prawdziwych usług musi uruchamiać wiele instancji programu serwera na różnych komputerach, więc „wszystko w pamięci RAM lokalnie” zwykle nie jest praktyczną opcją.
Chrylis -on strike-
Ale łącze sieciowe 10 g jest niskiej jakości. Moje serwery są podłączone do mojego kręgosłupa za pomocą 200 gigabit (tak, łącza 2x100 g).
TomTom,
3

Istnieje wiele warstw pamięci podręcznej w systemach komputerowych. Wstawienie jednego w warstwie aplikacji może być korzystne, buforowanie zapytań API i baz danych. I ewentualnie tymczasowe dane, takie jak sesje użytkownika.

Magazyny danych, takie jak Redis, zapewniają taką usługę przez gniazdo sieciowe (szybkie) lub UNIX (jeszcze szybsze), podobnie jak w przypadku bazy danych.

Musisz zmierzyć, jak naprawdę działa aplikacja, ale stwórzmy przykład. Powiedz, że zwykłe żądanie użytkownika wykonuje 5 zapytań API, które zajmują 50 ms każde. 250 ms to opóźnienie wykrywalne przez użytkownika. Kontrast do buforowania wyników. Nawet jeśli pamięć podręczna znajduje się w innej strefie dostępności w mieście (nie jest optymalna), trafienia mają prawdopodobnie najwyżej 10 ms. Co byłoby przyspieszeniem 5x.

W rzeczywistości bazy danych i systemy pamięci mają również własne pamięci podręczne. Zazwyczaj jednak uzyskanie wcześniej pobranego wyniku jest szybsze niż ponowne przejście przez silnik bazy danych i warstwy systemu pamięci masowej. Ponadto warstwa buforująca może znacznie obciążyć bazę danych za nią.

Na przykład takiej pamięci podręcznej w środowisku produkcyjnym nie szukaj dalej na blogu poświęconym architekturze infrastruktury stosu przepełnienia stosu . Setki tysięcy żądań HTTP generujących miliardy trafień Redis są dość znaczące.

Pamięć jest droga.

Pamięć DRAM przy czasach dostępu 100 ns jest około 100 razy szybsza niż pamięć stała. Jest stosunkowo niedrogi jak na tę wydajność. W przypadku wielu aplikacji nieco więcej pamięci RAM zapewnia cenną szybkość i czas reakcji.

John Mahowald
źródło
Czy możesz wyjaśnić, w jaki sposób obliczyłeś, że każde z tych 5 zapytań API zajmuje 50 ms każde? Czy to pod przykrywką aplikacji uderzającej w bazę danych, wykonującej zapytanie i obliczającej zestaw wyników, a nie po prostu uderzającej w pamięć podręczną w całym mieście, która zdarzyła się, że buforował sam ciąg zapytania jako klucz, i miał buforowaną kopię tego wyniku zestaw?
Neeraj Murarka,
1
Wymyśliłem te liczby, ale tak. Wykonanie zapytania i ponowne obliczenie wyniku będzie prawdopodobnie wolniejsze niż uzyskanie wcześniej obliczonego wyniku. Implementacje takie jak Redis zwykle są w pamięci dla uproszczenia i szybkości. Przejście przez sieć IP lub transport gniazda UNIX może być również dość szybkie. To powiedziawszy, to buforowanie nie jest wymagane dla każdego projektu.
John Mahowald
Zrozumiany. Myślę, że mniej więcej rozumiem. Wydaje się, że w wielu przypadkach, ale nie przez cały czas, nawet przejście z centrum danych do pobliskiej pamięci podręcznej, która może znajduje się w tym samym stanie USA (lub prowincji kanadyjskiej itp.) (Może region jest dobrym semantycznym), może często być wielką przewagą nad procesem próbującym ponownie obliczyć wartość algorytmicznie z własnej lokalnej bazy danych, jeśli w rzeczywistości spowoduje to trafienie w pamięć podręczną. Ale pamięć podręczna, która może być zdalnie sterowana, nie oferuje dużej wartości, ponieważ znajduje się w pamięci. Równie dobrze może być oparty na SSD.
Neeraj Murarka,
1
Zdalne centrum danych jest najgorszym przypadkiem, najlepiej warstwa pamięci podręcznej jest mniejsza niż 1 ms od swoich klientów. Być może ta sama strefa dostępności lub nawet na tym samym hoście. Jeśli chcesz, możesz buforować w pamięci trwałej. Możesz też użyć tego półprzewodnikowego magazynu dla podstawowej bazy danych, przyspieszyć wszystkie zapytania i być może nie potrzebować warstwy buforowania. Istnieje wiele możliwych projektów.
John Mahowald