Dane uzyskane z polecenia ping: czy jest to podróż w obie strony, czy w jedną stronę?

28

Mam 2 serwery, każdy w dwóch osobnych lokalizacjach. Muszę hostować aplikację na jednym, a serwer bazy danych na drugim.

Z serwera aplikacji, jeśli pinguję serwer bazy danych, średnio otrzymuję około 30ms.

Moje pytanie brzmi:

When I query the database from the app;

Czy to zajmie 30 ms + database_server_query_run_time

Lub;

Czy to zajmie 30 ms + database_server_query_run_time+ 30ms

Chciałbym to zrozumieć.

Phil
źródło

Odpowiedzi:

24

Zazwyczaj zajmuje to więcej niż te dwie opcje.

Ping mierzy tylko czas od klienta do serwera iz powrotem (rtt - czas podróży w obie strony)

Zwykle bazy danych używają TCP, więc najpierw musisz wysłać pakiet SYN, aby rozpocząć uzgadnianie TCP (aby uprościć powiedzmy, że 15ms * + czas procesora, następnie otrzymasz SYN / ACK (15ms + procesor), odeślij ACK i żądanie (co najmniej 15ms + procesor), następnie czas na przetworzenie zapytania przez bazę danych, a następnie czas (15ms + procesor) na odzyskanie danych i jeszcze więcej na potwierdzenie i zamknięcie połączenia.

Oczywiście nie liczy się uwierzytelnienie (nazwa użytkownika / hasło) do bazy danych i brak szyfrowania (uzgadnianie ssl / DH lub cokolwiek jest potrzebne).

* połowa czasu podróży w obie strony, zakładając, że trasa tam iz powrotem jest symetryczna (połowa czasu, aby się tam dostać, a połowa, aby wrócić ... czas przetwarzania procesora na odpowiedź ping jest bardzo krótki)

mulaz
źródło
Problem trwałego uzgadniania trójstronnego można spotkać w przypadku trwałych sesji TCP.
Michuelnik
@Michuelnik, czy mógłbyś opracować? Naprawdę chciałbym to wszystko zrozumieć i znaleźć najlepszy sposób na zminimalizowanie opóźnienia w zapytaniach do DB.
Phil
2
Niestety większość oprogramowania (przynajmniej aplikacji internetowych) nie obsługuje tego: / Ale pomysł polega na ustanowieniu połączenia (raz) z bazą danych i utrzymywaniu połączenia działającego (otwartym) i wysyłaniu zapytań / otrzymywaniu odpowiedzi przez jeden, stale otwarte połączenie. Eliminuje to potrzebę uzgadniania tcp, uwierzytelniania itp. Za każdym razem.
mulaz
Mulaz, dziękuję za wyjaśnienie. Będę pracował z Pythonem, więc zobaczymy, jak to będzie. ;-)
Phil
Nie zapomnij o wielkości żądania i odpowiedzi. Na przykład, w przypadku łącza o przepustowości 1 MB / s, przesyłanie danych o pojemności 100 KB zajmuje dodatkowe 100 ms.
Dustin Boswell
7

Czas pingowania to podróż w obie strony. Jeśli się nad tym zastanowić - jak to zmierzyć w jedną stronę? Zajmie to 30 ms plus czas zapytania.

David Schwartz
źródło
1
Dodam tylko, że prawdopodobnie zajmie to trochę więcej niż tylko 30 sekund + czas zapytania. ponieważ Ping to ICMP, a twoje połączenie DB to TCP, będziesz mieć tam również konfigurację / uzgadnianie, inicjację połączenia DB itp.
Doon
@Doon: Tego można uniknąć dzięki trwałym połączeniom TCP / bazy danych
Michuelnik,
@Michuelnik, czy uważasz, że trwałe połączenie z DB to sposób na przejście tutaj? Czy spowoduje to inne problemy?
Phil
@michuelnik, oczywiście. Wskazałem tylko, że nie jest tak proste jak zapytanie RTT +. Istnieją również ograniczenia prędkości maksymalnej, na sesję z powodu opóźnień itp.)
Doon
@phil W większości przypadków trwałe połączenia z DB są korzystne, jeśli zamierzasz wykonywać wiele zapytań. Jeśli zapytania są rozłożone / sporadyczne, niepotrzebnie wiążesz zasoby, ale jeśli zapytania przychodzą przez cały czas itp. Zaoszczędzisz trywialną ilość kosztów ogólnych poprzez ponowne użycie istniejącego połączenia zamiast otwierania nowego połączenia na każde żądanie.
Doon