Ping-Daten: Hin- und Rückflug oder einfache Fahrt?

28

Ich habe 2 Server an jeweils zwei verschiedenen Standorten. Ich muss eine Anwendung auf einem und den Datenbankserver auf dem anderen hosten.

Wenn ich vom App-Server den Datenbankserver anpinge, erhalte ich durchschnittlich 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 + 30ms dauern 30 ms + database_server_query_run_time?

Ich möchte das bitte verstehen.

Phil
quelle

Antworten:

24

In der Regel sind mehr als diese beiden Optionen erforderlich.

Ping misst nur die Zeit vom Client zum Server und zurück (RTT - Roundtrip Time)

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

Dies ist natürlich nicht die Authentifizierung (Benutzername / Passwort) in der Datenbank und keine Verschlüsselung (SSL-Handshakes / DH oder was auch immer benötigt wird) zu zählen.

* Eine halbe Umlaufzeit, vorausgesetzt, die Route dorthin und zurück ist symmetrisch (die Hälfte der Zeit, um dorthin zu gelangen, und die andere Hälfte, um zurückzukehren ... Die CPU-Verarbeitungszeit für die Ping-Antwort ist sehr kurz.)

Mulaz
quelle
Das Problem des Drei-Wege-Handshakes kann bei dauerhaften TCP-Sitzungen auftreten.
Michuelnik
@Michuelnik, könntest du das bitte näher erläutern? Ich möchte diese ganze Sache wirklich verstehen und den besten Weg finden, um die Latenz für die Abfrage der DB zu minimieren.
Phil
2
Leider wird dies von den meisten Softwareprogrammen (zumindest von Webanwendungen) nicht unterstützt: ständig offene Verbindung. Dadurch entfallen jedes Mal TCP-Handshakes, Authentifizierungen usw.
Mulaz
mulaz, danke für die erklärung. Ich werde mit Python arbeiten, also werden wir sehen, wie es geht. ;-)
Phil
Vergessen Sie nicht die Größe der Anfrage und die Antwort. Über eine Verbindung mit 1 MB / s würde eine Nutzlast von 100 KB zusätzliche 100 ms zum Transport benötigen.
Dustin Boswell
7

Die Ping-Zeit ist Hin- und Rückfahrt. Wenn Sie darüber nachdenken - wie könnte es die Zeit in eine Richtung messen? Es dauert also 30 ms plus die Abfragezeit.

David Schwartz
quelle
1
Ich möchte nur hinzufügen, dass dies wahrscheinlich etwas länger dauern wird als nur die 30 Sekunden + Abfragezeit. Da Ping ICMP ist und Ihre DB-Verbindung TCP ist, haben Sie auch Setup / Handshake und DB-Verbindungsaufbau usw.
Doon
@Doon: Was mit dauerhaften TCP / Datenbank-Verbindungen "vermieden" werden könnte
Michuelnik
@Michuelnik, denkst du, dass eine dauerhafte DB-Verbindung der richtige Weg ist? Wird es einige andere Probleme verursachen?
Phil
@michuelnik natürlich. Ich habe nur darauf hingewiesen, dass es nicht so einfach ist wie RTT + Query. Es gibt auch Beschränkungen für die maximale Geschwindigkeit pro Sitzung aufgrund von Latenz usw.)
Doon
@phil In den meisten Fällen sind dauerhafte DB-Verbindungen von Vorteil, wenn Sie mehrere Abfragen durchführen möchten. Wenn Abfragen verteilt / sporadisch sind, werden Ressourcen unnötig gebunden. Wenn jedoch ständig Abfragen usw. eingehen, sparen Sie nicht unbedeutenden Overhead, indem Sie die vorhandene Verbindung wiederverwenden, anstatt bei jeder Anforderung eine neue zu öffnen.
Doon