Memorystore for Redis bietet zwar serverseitige Echtzeitmesswerte zur Überwachung von Durchsatz, CPU-Auslastung und Arbeitsspeichernutzung, aber diese Daten allein erklären möglicherweise nicht, warum in Ihrer Clientanwendung in komplexen verteilten Systemen eine hohe Latenz auftritt.
Clientseitige Messwerte schaffen hier Abhilfe, indem sie Transparenz in den gesamten Anfrage-Antwort-Zyklus bringen. Sie messen einen Befehl ab dem Zeitpunkt, an dem die Anwendung ihn initiiert, bis die Anwendung die Antwort verarbeitet. Durch das Erfassen dieser Datenpunkte können Sie genau bestimmen, ob die Latenz von der Anwendungslogik, dem Netzwerkpfad oder dem Redis-Server stammt.
Hinweis
Achten Sie darauf, dass Ihre Clientanwendung ein Dienstkonto verwendet und ihr die folgenden IAM-Rollen (Identity and Access Management) zugewiesen sind:
roles/cloudtrace.agent(Cloud Trace-Agent)roles/monitoring.metricWriter(Monitoring-Messwert-Autor)
Weitere Informationen zum Zuweisen von Rollen finden Sie in der Kurzanleitung IAM-Rolle über die Google Cloud Console zuweisen.
Cloud Monitoring API aktivieren
Wenn Sie clientseitige Messwerte nach Monitoring exportieren möchten, muss die Monitoring API für Ihre Anwendung aktiviert sein. Durch das Exportieren und Visualisieren dieser Messwerte in Monitoring können Sie die Ursache von Engpässen ermitteln und feststellen, wo die Latenz entsteht.
So aktivieren Sie die Monitoring API:
Rufen Sie in der Google Cloud Console die Seite APIs und Dienste auf.
Wählen Sie das Projekt aus, in dem Sie die Memorystore for Redis-Instanz erstellt haben.
Klicken Sie auf APIs und Dienste aktivieren.
Suchen Sie nach
monitoring.Klicken Sie in den Suchergebnissen auf Cloud Monitoring API.
Wenn API aktiviert angezeigt wird, ist die API bereits aktiviert. Klicken Sie andernfalls auf Aktivieren.
Cloud Trace API aktivieren
Wenn Sie verteilte Traces in Trace ansehen möchten, müssen Sie die Trace API aktivieren. Anschließend können Sie mit dem Trace Explorer diese Traces ansehen, Engpässe diagnostizieren und die Quelle der Latenz in Ihrer Anwendung isolieren.
So aktivieren Sie die Trace API:
Rufen Sie in der Google Cloud Console die Seite APIs und Dienste auf.
Wählen Sie das Projekt aus, in dem Sie die Memorystore for Redis-Instanz erstellt haben.
Klicken Sie auf APIs und Dienste aktivieren.
Suchen Sie nach
trace.Klicken Sie in den Suchergebnissen auf Cloud Trace API.
Wenn API aktiviert angezeigt wird, ist die API bereits aktiviert. Klicken Sie andernfalls auf Aktivieren.
Clientseitige Messwerte aktivieren
Wenn Sie clientseitige Messwerte aktivieren möchten, fügen Sie dem Code Ihrer Anwendung das OpenTelemetry SDK, den Cloud Monitoring-Exporter und den Cloud Trace-Exporter hinzu. Die OpenTelemetry-Instrumentierung, die direkt in der Redis-Clientbibliothek Ihrer Anwendung ausgeführt wird, erfasst die Messwerte. So kann Ihre Anwendung Latenzdatenpunkte aufzeichnen und zur Visualisierung nach Monitoring und Trace exportieren.
Sie können clientseitige Messwerte in Go, Java, Node.js, oder Python aktivieren. Informationen zum Aktivieren der Messwerte für jede Sprache finden Sie auf den folgenden Tabs.
Go
Führen Sie die folgenden Befehle in Ihrem Terminal aus, um die erforderlichen OpenTelemetry- und Google Cloud Exporter Abhängigkeiten zu installieren:
go get github.com/gomodule/redigo/redis@latest go get go.opentelemetry.io/otel go get go.opentelemetry.io/otel/sdk/trace go get go.opentelemetry.io/otel/sdk/metric go get github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace go get github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric
Erstellen Sie eine
main.go-Datei und fügen Sie ihr den folgenden Code hinzu, um die clientseitigen Messwerte zu aktivieren:Führen Sie Ihre Anwendung mindestens eine Minute lang aus, damit der Exporter genügend Zeit hat, die veröffentlichten Messwerte zu verarbeiten und an Monitoring zu senden.
Java
Fügen Sie der Datei
pom.xmlIhrer Anwendung den folgenden Code hinzu, um die erforderlichen OpenTelemetry- und Google Cloud Exporter Abhängigkeiten zu installieren:Erstellen Sie eine
RedisTelemetryApp.java-Datei und fügen Sie ihr den folgenden Code hinzu, um die clientseitigen Messwerte zu aktivieren:Führen Sie Ihre Anwendung mindestens eine Minute lang aus, damit der Exporter genügend Zeit hat, die veröffentlichten Messwerte zu verarbeiten und an Monitoring zu senden.
Node.js
Führen Sie die folgenden Befehle in Ihrem Terminal aus, um die erforderlichen OpenTelemetry- und Google Cloud Exporter Abhängigkeiten zu installieren:
npm install redis@^4.6.0 @opentelemetry/api@^1.9.0 @opentelemetry/sdk-trace-node@^2.1.0 @opentelemetry/sdk-trace-base@^2.1.0 @opentelemetry/sdk-metrics@^2.1.0 @opentelemetry/instrumentation@^0.205.0 @opentelemetry/instrumentation-redis@^0.67.0 @google-cloud/opentelemetry-cloud-trace-exporter@^3.0.0 @google-cloud/opentelemetry-cloud-monitoring-exporter@^0.21.0 @opentelemetry/resources@^2.1.0
Erstellen Sie eine
server.js-Datei und fügen Sie ihr den folgenden Code hinzu, um die clientseitigen Messwerte zu aktivieren:Führen Sie Ihre Anwendung mindestens eine Minute lang aus, damit der Exporter genügend Zeit hat, die veröffentlichten Messwerte zu verarbeiten und an Monitoring zu senden.
Python
Führen Sie die folgenden Befehle in Ihrem Terminal aus, um die erforderlichen OpenTelemetry- und Google Cloud Exporter Abhängigkeiten zu installieren:
pip install redis==7.0.1 opentelemetry-api==1.39.1 opentelemetry-sdk==1.39.1 opentelemetry-instrumentation-redis==0.60b1 opentelemetry-exporter-gcp-trace==1.11.0 opentelemetry-exporter-gcp-monitoring==1.11.0a0
Erstellen Sie eine
main.py-Datei und fügen Sie ihr den folgenden Code hinzu, um die clientseitigen Messwerte zu aktivieren:Führen Sie Ihre Anwendung mindestens eine Minute lang aus, damit der Exporter genügend Zeit hat, die veröffentlichten Messwerte zu verarbeiten und an Monitoring zu senden.
Messwerte in Monitoring ansehen
Nachdem Sie clientseitige Messwerte aktiviert und Ihre Anwendung mindestens eine Minute lang ausgeführt haben, damit der Exporter genügend Zeit hat, Messwerte zu verarbeiten und an Monitoring zu senden, können Sie Ihre Messwerte in Monitoring visualisieren, nach Vorgang oder Instanz gruppieren und Aggregatoren anwenden, um die Leistung Ihrer Anwendung zu überwachen.
So rufen Sie Messwerte in Monitoring auf:
Wechseln Sie in der Google Cloud Console zur Seite Metrics Explorer.
Wählen Sie Ihr Google Cloud Projekt aus.
Klicken Sie auf Messwert auswählen.
Suchen Sie nach
workload.googleapis.com/redis.Wählen Sie einen clientseitigen Messwert aus. Gruppieren Sie die Daten nach Bedarf nach
operationundinstanceund wählen Sie einen Aggregator aus. Weitere Optionen finden Sie unter Messwerte bei Verwendung von Metrics Explorer auswählen.
Verteilte Traces in Trace ansehen
Nachdem Ihre Anwendung mit dem Exportieren von Daten begonnen hat, können Sie mit Trace den gesamten Anfrage-Antwort-Zyklus Ihrer Redis-Befehle visualisieren. Wenn Sie Ihre verteilten Traces in Trace ansehen, können Sie Engpässe diagnostizieren und so die genaue Quelle der Latenz in Ihrer Anwendung schnell isolieren.
So rufen Sie verteilte Traces in Trace auf:
Rufen Sie in der Google Cloud Console die Seite Trace Explorer auf.
Wählen Sie einen aktuellen Trace aus, der durch einen Punkt im Streudiagramm dargestellt wird.
Untersuchen Sie die Wasserfallansicht, um die Quelle der Latenz zu isolieren, indem Sie die folgenden Engpässe ermitteln:
Gesamtdauer der Anfrage: Der Balken der obersten Ebene (übergeordnet) zeigt die Gesamt zeit an, die Sie warten müssen, bis der Vorgang abgeschlossen ist.
Netzwerk- und Serverlatenz (Round-Trip-Zeit, RTT): Die untergeordneten Balken (z. B. mit der Bezeichnung
GEToderSET) zeigen die Zeit an, die der Befehl für die Übertragung im Netzwerk und die Ausführung auf dem Memorystore for Redis-Server benötigt hat.Blockierung der Clientverbindung: Wenn vor dem Beginn des untergeordneten Redis-Spans eine große, leere horizontale Lücke vorhanden ist, wartet der Anwendungsthread auf eine verfügbare TCP-Verbindung aus dem Verbindungspool.
Blockierung der Anwendungsparser: Wenn nach dem Ende des untergeordneten Redis-Spans eine große, leere horizontale Lücke vorhanden ist, hat die Anwendung Schwierigkeiten, die zurückgegebene Nutzlast zu parsen oder zu verarbeiten. Dies tritt häufig bei JSON-Strings mit mehreren Megabyte auf.
Wiederholungen: Wenn Sie mehrere kurze untergeordnete Spans für denselben Befehl sehen, die nacheinander im selben übergeordneten Trace auftreten, kann es sein, dass bei Ihrem Client Netzwerkpaketverluste auftreten und er seine exponentielle Backoff-Wiederholungsschleife auslösen muss.
Fehlerbehebung
In diesem Abschnitt werden häufige Leistungsprobleme aufgeführt, die Sie mithilfe clientseitiger Messwerte ermitteln können. Außerdem werden die Ursachen dieser Probleme erläutert und Anleitungen zur Fehlerbehebung gegeben.
| Problem | Ursache | Fehlerbehebung |
|---|---|---|
In Ihrer Anwendung tritt ein plötzlicher Latenzspike auf, aber Memorystore for Redis scheint völlig fehlerfrei zu sein.
|
Der Engpass befindet sich ausschließlich in Ihrer Anwendung. Ihre
Threads versuchen, Redis-Befehle auszuführen, aber der Verbindungspool ist vollständig
ausgeschöpft. Die hohe redis_client_blocking_latency gibt die Zeit an, die Ihr Code auf einen verfügbaren TCP-Socket wartet, bevor der Befehl an das Netzwerk gesendet wird. |
Erhöhen Sie die Grenzwerte für die Größe des Verbindungspools in Ihrer Redis-Clientkonfiguration, um den höheren gleichzeitigen Traffic zu bewältigen (z. B. MaxActive für Go, MaxTotal für Java oder max_connections für Node.js und Python). |
Die Anfrage wird abgeschlossen, aber der Endpunkt benötigt deutlich länger als erwartet. Es gibt keine Probleme mit dem Zustand Ihres Netzwerks oder Servers.
|
Memorystore for Redis führt den Befehl aus und das Netzwerk überträgt die
Nutzlast schnell (niedrige RTT). Die zurückgegebene Nutzlast ist jedoch groß (z.
B. ein 15 MB großer JSON-String). In Ihrer Anwendung tritt eine hohe
redis_application_blocking_latency auf, da die Anwendung
übermäßig viele Ressourcen verbraucht, während sie Arbeitsspeicher zuweist und diesen
großen String in ein Objekt deserialisiert. |
Optimieren Sie Ihr Datenmodell. Speichern Sie keine riesigen JSON-Blobs in einzelnen Schlüsseln.
Unterteilen Sie die Daten mit Redis-Hashes (HSET) und rufen Sie mit
HGET oder HMGET nur die benötigten Felder ab.
|
Die Latenz Ihrer nutzerorientierten Anwendung steigt, aber Ihre Redis-Messwerte melden eine niedrige Serverlatenz und typische Auscheckvorgänge im Verbindungspool.
|
Da redis_client_rtt nur die RTT erfolgreicher Anfragen erfasst, wird die Zeitüberschreitungsdauer eines fehlgeschlagenen Pakets nicht berücksichtigt. Wenn in Ihrer Anwendung vorübergehende Paketverluste oder TCP
Zurücksetzungen auftreten, erhöht die Wiederholungslogik Ihres instrumentierten Clients
redis_retry_count und löst die exponentielle Backoff-Schleife aus.
Dadurch wird eine Wartezeit zwischen den Versuchen eingeführt (z. B.
100ms, 200ms, oder 400ms). Der Nutzer
erlebt eine hohe Gesamtlatenz, aber die zugrunde liegende Ursache ist ein Netzwerk
paketverlust, der clientseitige Wartezeiten auslöst. |
Prüfen Sie Ihre VPC-Flusslogs auf verworfene Pakete, Bandbreitenbegrenzung,
oder regionsübergreifende Routinganomalien. Wenn aggressive Zeitüberschreitungen auftreten,
müssen die Zeitüberschreitungen für die Clientverbindung (socket_timeout oder
connect_timeout) größer als die erwartete RTT sein, um
vorübergehende Netzwerklatenz zu berücksichtigen. |
Alles stoppt und alle Ebenen der Telemetriepipeline melden hohe Latenz.
|
Redis ist single-threaded. Wenn Sie einen Befehl mit der Zeitkomplexität O(N)
ausführen, z. B. KEYS *, SMEMBERS
für eine große Menge oder HGETALL für einen Hash mit Millionen von
Feldern, wird die Redis-Engine angehalten, um diese Anfrage zu bearbeiten. Während dieser Befehl
ausgeführt wird, werden alle anderen Anwendungsanfragen in die Warteschlange gestellt, was zu einem systemweiten Latenz
spike führt. Da Ihre benutzerdefinierte redis_client_rtt mit der Serverlatenz (commands/usec_per_call) übereinstimmt, ist der Server, auf dem der Befehl ausgeführt wird, der Engpass. |
Öffnen Sie Trace und sehen Sie sich die Redis-Befehle in den langsamen Spans an, um zu ermitteln, welche Abfrage die Blockierung verursacht. Ersetzen Sie blockierende Befehle durch nicht blockierende in Ihrem Code. Wenn Sie große Datensätze inkrementell durchlaufen möchten, ohne den
Serverthread zu sperren, verwenden Sie |
Ihre Anwendung meldet eine gleichbleibend erhöhte Baseline-Latenz für alle Redis-Befehle, auch wenn der Traffic gering ist.
|
Der Redis-Server führt Befehle sofort aus, aber Ihre Anwendung und Ihre
Instanz werden in verschiedenen Regionen bereitgestellt (z. B.
us-central1 und us-east1). Jedes Netzwerkpaket
muss zwischen diesen geografischen Rechenzentren über die physische Google Cloud-Infrastruktur übertragen werden. Dies führt zu einer obligatorischen regionsübergreifenden Latenzstrafe in Höhe der Lichtgeschwindigkeit
für jede Round-Trip-Zeit. |
Wenn Sie die Latenz reduzieren möchten, stellen Sie Ihre Anwendung in derselben Region und Zone wie Ihre Instanz bereit. In der Google Cloud Console können Sie die Region Ihrer Anwendung und Instanz ansehen. |
Nächste Schritte
- Weitere Informationen zu clientseitigen Messwerten.
- Informationen zu den clientseitigen Messwerten, die für Memorystore for Redis verfügbar sind