Ein praktischer Bericht zur Fehlerbehebung bei einem Anstieg der Redis-Verbindungen in Docker

Ein praktischer Bericht zur Fehlerbehebung bei einem Anstieg der Redis-Verbindungen in Docker

Am Samstag war der Redis-Server auf dem Produktionsserver nicht verfügbar und die Fehlermeldung lautete:

Der Status ist nicht verfügbar und kann nicht verwendet werden, bis die Hintergrundprüfung wiederhergestellt ist. Unerwartetes Ende des Streams; erwarteter Typ „Status“

Wie in der Abbildung unten gezeigt, ist 6300 der Port, auf dem unser Redis-Server läuft.

Das war das erste Mal, dass ich auf ein solches Problem gestoßen bin. Ich dachte, Redis sei vielleicht ausgefallen, also habe ich Telnet IP+Port verwendet. Ich stellte fest, dass es normal lief, und dachte dann darüber nach, Redis aufzurufen, um den aktuellen Verbindungsstatus anzuzeigen. Auf den ersten Blick stellte ich fest, dass es nicht weniger als 1.903 Artikel waren.

Dann dachte ich, es läge daran, dass der Code zu viele Redis-Verbindungen erstellt hatte, und überprüfte daher den Code.

Es wurde festgestellt, dass Redis nur an einer Stelle erstellt und auch ausgeführt wird, wenn der Dienst registriert wird. Das heißt, es wird nur einmal beim Start der Anwendung ausgeführt. Dann wurde das gesamte Projekt durchsucht und kein anderer Ort namens Redis-Initialisierung gefunden.

Ich bin nicht zufrieden. Bedeutet das, dass jedes Mal, wenn ich Daten in Redis lese und schreibe, eine Verbindung hergestellt wird? Hat es etwas mit häufigem Lesen und Schreiben zu tun? Ich habe immer das Gefühl, dass es nicht funktioniert, also erstelle ich einen Testcode, um es zu testen.

Eine Redis-Umgebung wird lokal erstellt. Überprüfen Sie vor dem Testen die Anzahl der Verbindungen. Derzeit gibt es nur eine, nämlich den aktuellen cmd-Verbindungsclient. Das ist normal.

Starten Sie den Test und führen Sie das Programm aus. Der Code erstellt ein Verbindungsobjekt und testet insgesamt 1000 Schreib- und 1000 Lesevorgänge.

Egal wie ich die Verbindung teste, es sind immer 6 Verbindungen, das heißt unser Programm baue maximal 5 Verbindungen auf, hauptsächlich natürlich der Threadpool.

Es besteht also definitiv kein Problem mit der grundlegenden Speicherung und dem Lesen dieses Codes.

Wir haben die Fehlersuche im Code jedoch nicht völlig aufgegeben, da auf dem Produktionsserver etwa sechs Anwendungen über Docker ausgeführt wurden. Sie sind alle mit demselben Redis verbunden. Könnte es an anderen Anwendungen liegen?

Anschließend möchte ich über einen beliebigen Port in der Redis-Verbindungsliste direkt die entsprechenden Prozessinformationen abfragen, um zu erfahren, um welche Anwendungen es sich handelt.

Unter Linux werden Prozessinformationen durch die Abfrage der Netzwerkportnummer angezeigt.

netstat -atunlp | grep 60852 

Schauen Sie sich zunächst die IP an, die diesem Port entspricht. Die erste hier ist beispielsweise 172.17.0.1. Studierende, die mit Docker vertraut sind, sollten wissen, dass diese IP die Docker-Gateway-IP ist. Alle Programme in unserem Container kommunizieren über diese Gateway-IP mit unserem Hostcomputer. Wir können die Gateway-IP von Docker über ifconfig finden. Die zweite 172.17.0.3:6379 ist die Container-IP von Redis.

An diesem Punkt können wir das Programm nicht finden, in dessen Container eine Verbindung hergestellt werden soll.

Am dümmsten ist es, die Container einzeln zu betreten. Das heißt, docker exec –it test /bin/bash und überprüfen Sie dann den Netzwerkverbindungsstatus des aktuellen Containers. Dies ist sehr umständlich und erfordert die Installation vieler Komponenten, um eine Reihe von Befehlen auszuführen.

Eine andere Möglichkeit ist die Verwendung des Befehls lsof, der installiert werden muss, falls er nicht verfügbar ist. Durch den Vorgang können wir sämtliche Netzwerkverbindungen finden.

Beispielsweise haben wir gerade herausgefunden, dass unser Hauptprozess Docker ist und seine PID 582251 ist.

lsof -i |grep 582251 oder lsof -i -p 582251

Das Ergebnis ist wie in der folgenden Abbildung dargestellt. Die spezifische IP wird tatsächlich rechts angezeigt. Diese IP ist die spezifische IP-Adresse des Docker-Containers.

Da wir nun alle IPs und Ports kennen, können wir die Ergebnisse der Befehlsausführung herunterladen.

Suchen Sie zunächst die IP, die jedem Ihrer Container entspricht.

Docker-Inspect-Name |grep IPAddress //Name Containername oder ID 

Nachdem wir jede IP gefunden haben, sammeln wir Statistiken basierend auf allen gerade heruntergeladenen Netzwerkverbindungsinformationen, um zu sehen, welche IP die meisten Verbindungen hat. Die mit den meisten Verbindungen muss ein Problem haben.

Dann habe ich das im Container bereitgestellte Programm gefunden, das dieser IP entspricht, und mir dann die Redis-Konfiguration angesehen. Es wurde festgestellt, dass der Thread-Pool auf 200 eingestellt war.

Darüber hinaus habe ich über GitHub herausgefunden, dass CSRedisCore auch über einen Vorheizmechanismus verfügt, nämlich Preheat, und sein Standardwert beträgt 5 Vorheizverbindungen.

Unser Threadpool ist auf 200 eingestellt und verfügt über einen Vorheizmechanismus für 5 Verbindungen. Ich weiß nicht, ob 200*5=1000 erstellt werden. Ich werde den Quellcode sorgfältig studieren, wenn ich Zeit habe. Im Moment ist das nur Spekulation.

Ich habe Redis jetzt auf Poolgröße=5, Preheat=false geändert. Der Thread-Pool verfügt über 5 Threads und der Vorheizmechanismus ist ausgeschaltet.

Nachdem wir unsere Verbindungskonfiguration geändert und den Anwendungsserver und den Redis-Server neu gestartet hatten (um die hergestellten Verbindungen vollständig zu löschen), stellten wir fest, dass die Anzahl der Verbindungen zwar abgenommen hatte, jedoch nicht wesentlich. Später stellte sich heraus, dass die Leerlaufzeit von Redis zu lang war, was dazu führte, dass der Verbindungspool zu viele Verbindungen aufrechterhielt und diese nicht freigegeben wurden.

Wir setzen das Timeout auf 30s

Führen Sie CONFIG SET Timeout 30 aus (die Einheit ist Sekunden. Diese Methode ist nur eine temporäre Änderung und gilt für den aktuellen Vorgang. Denken Sie daran, die Redis-Konfigurationsdatei für eine langfristige Wirkung zu ändern.)

Dann schauen Sie sich die Anzahl der Verbindungen an, die auf einen Schlag deutlich reduziert wird.

Zusammenfassen:

1. Wenn die Anzahl der Redis-Verbindungen drastisch zunimmt, suchen Sie zunächst nach Problemen in Ihrer eigenen Anwendung. Ich habe beispielsweise festgestellt, dass der Verbindungspool zu groß war und der Standardvorwärmmechanismus zu groß war. Versuchen Sie außerdem zu überprüfen, ob die Codeebene beim Herstellen der Verbindung mehrfach ausgelöst wird. Wenn ja, muss dies korrigiert werden. Nun werden Instanzen per Injektion erzeugt, je nachdem ob die Stelle mehrfach aufgerufen wird.

2. Ändern Sie die Redis-Serverkonfiguration, beispielsweise das Timeout bei Verbindungsleerlauf. Sie können auch die maximale Anzahl an Verbindungen und den Standardwert überprüfen.

Dies ist das Ende dieses Artikels zur Fehlerbehebung beim Problem des plötzlichen Anstiegs der Redis-Verbindungen in Docker. Weitere relevante Inhalte zur Fehlerbehebung beim Problem des plötzlichen Anstiegs der Redis-Verbindungen in Docker finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Eine praktische Aufzeichnung des Fehlerbehebungsprozesses bei seltsamem Wachstum des Redis-Speichers
  • Redis ruft Lua-Skripte auf und verwendet sie schnell
  • Java ruft Redis-Clustercode auf und löst Probleme
  • Detaillierte Erläuterung des Redis-Aufrufoptimierungsbeispiels auf dem Knoten
  • Implementieren Sie den RPC-Remote-Methodenaufruf über Redis (unterstützt mehrere Programmiersprachen).
  • Analyse der kontinuierlichen Aktualisierung, wenn Redis den QR-Code aufruft

<<:  Detaillierte Erklärung des VueRouter-Routings

>>:  So verwenden Sie „not in“ zur Optimierung von MySql

Artikel empfehlen

Vue realisiert Preiskalendereffekt

In diesem Artikelbeispiel wird der spezifische Co...

Implementierung eines einfachen Whack-a-Mole-Spiels in JavaScript

In diesem Artikel finden Sie den spezifischen Cod...

Implementierung zum Hinzufügen von Bemerkungsinformationen zu MySQL

Vorwort Einige Leute haben mich in diesen Tagen u...

So verwenden Sie Übersetzung und Übergang in CSS3

Ich habe immer das Gefühl, dass Übersetzen und Üb...

Was sind die Vorteile einer semantischen HTML-Struktur?

eins: 1. Semantische Tags sind lediglich HTML, CS...

Führen Sie die Schritte zum Einrichten automatischer Updates in CentOS 8 aus

Das Beste, was Sie für Ihre Daten und Computer tu...

Grafisches Tutorial zur Installation und Konfiguration der MySQL-Version 5.7.15

Dieser Artikel enthält ein ausführliches Tutorial...

Dateiupload über HTML5 auf Mobilgeräten

Meistens werden Plug-Ins zum Hochladen von Dateie...

Vue realisiert den gesamten Prozess der Slider-Drag-Verifizierungsfunktion

Rendern Definieren Sie das Skelett, schreiben Sie...