Frage Daten vom Ping erhalten: ist es Hin- oder Rückweg?


Ich habe 2 Server, jeder an zwei verschiedenen Orten. Ich muss eine Anwendung auf einem und den Datenbankserver auf dem anderen hosten.

Wenn ich den Datenbankserver vom App-Server anpinge, erhalte ich im Durchschnitt ungefähr 30 ms.

Meine Frage ist:

When I query the database from the app;

Wird es dauern? 30 ms + database_server_query_run_time

Oder;

Wird es dauern? 30 ms + database_server_query_run_time + 30ms

Ich möchte das bitte verstehen.


19
2017-10-15 12:44


Ursprung




Antworten:


Es wird normalerweise mehr als diese zwei Optionen brauchen.

Ping misst nur die Zeit vom Client zum Server und zurück (rtt - round trip time)

Normalerweise verwenden Datenbanken TCP, also müssen Sie zuerst ein SYN-Paket senden, um den TCP-Handshake zu starten (um 15 ms * + CPU-Zeit zu vereinfachen, dann erhalten Sie und SYN / ACK (15ms + CPU-Zeit), senden ein ACK und ein Anfrage (mindestens 15ms + CPU-Zeit), dann die Zeit für die DB, die Abfrage zu verarbeiten, und dann die Zeit (15ms + CPU), um die Daten zurück zu bekommen, und ein bisschen mehr zu bestätigen, und schließen Sie die Verbindung.

Dies zählt natürlich nicht die Authentifizierung (Benutzername / Passwort) für die Datenbank und keine Verschlüsselung (SSL Handshakes / DH oder was auch immer benötigt wird).

* die Hälfte einer Hin- und Rückfahrtzeit, vorausgesetzt, die Strecke hin und zurück ist symmetrisch (die Hälfte der Zeit, um dorthin zu gelangen, und die Hälfte, um zurück zu kommen ... CPU-Verarbeitungszeit für Ping-Antwort ist sehr kurz)


17
2017-10-15 12:50



Das Problem des Drei-Wege-Handshakes könnte bei persistenten TCP-Sitzungen auftreten. - Michuelnik
@Michuellik, könntest du bitte ausarbeiten? Ich würde wirklich gerne diese ganze Sache verstehen und den besten Weg finden, die Latenz für die Abfrage der DB zu minimieren. - Phil
Leider, die meisten Software (atleast Web-Anwendungen) nicht unterstützt dies: / Aber die Idee ist, die Verbindung (einmal) mit der DB zu etablieren, und halten Sie die Verbindung läuft (offen), und weiter Anfragen senden / bekommen Antworten über einen, ständig offene Verbindung. Dies macht TCP-Handshakes, Authentifizierung usw. jedes Mal überflüssig. - mulaz
Mulaz, danke für die Erklärung. Ich werde mit Python arbeiten, damit wir sehen, wie es läuft. ;-) - Phil
Vergessen Sie nicht die Größe der Anfrage und der Antwort. Bei einer Verbindung von beispielsweise 1 MB / s würde eine Nutzlast von 100 KB zusätzliche 100 ms zum Transport benötigen. - Dustin Boswell


Die Ping-Zeit ist eine Rundreise. Wenn Sie darüber nachdenken - wie könnte es die Einwegzeit messen? Also dauert es 30ms plus die Abfragezeit.


7
2017-10-15 12:48



Ich füge einfach hinzu, dass das wahrscheinlich etwas länger dauert als nur die 30 Sekunden + Abfragezeit. Da Ping ICMP ist und Ihre DB-Verbindung TCP ist, werden Sie auch Setup / Handshake und DB Connection-Initiierung usw. haben - Doon
@Doon: Was mit permanenten TCP / Datenbank-Verbindungen "vermieden" werden könnte - Michuelnik
@Michuelnik, denkst du, dass ständige DB-Verbindung der Weg ist, hier zu gehen? Wird es einige andere Probleme verursachen? - Phil
@michuellik, natürlich. War nur darauf hingewiesen, es ist nicht so einfach wie RTT + Query. Es gibt auch Limits auf maximale Geschwindigkeit, pro Sitzung aufgrund von Latenz, etc ..) - Doon
@phil In den meisten Fällen sind dauerhafte DB-Verbindungen von Vorteil, wenn Sie mehrere Abfragen ausführen. Wenn Abfragen verteilt / sporadisch sind, binden Sie unnötigerweise Ressourcen, aber wenn Abfragen die ganze Zeit usw. kommen, sparen Sie einen nicht geringen Overhead, indem Sie die vorhandene Verbindung wiederverwenden, anstatt bei jeder Anfrage eine neue zu öffnen. - Doon