Heim >Datenbank >Redis >Lassen Sie uns über die Gründe sprechen, warum Redis langsam ist, und wie Sie das Problem beheben können.

Lassen Sie uns über die Gründe sprechen, warum Redis langsam ist, und wie Sie das Problem beheben können.

WBOY
WBOYnach vorne
2022-06-10 18:14:592779Durchsuche

Dieser Artikel vermittelt Ihnen relevantes Wissen über Redis. Er stellt hauptsächlich verwandte Themen vor, warum Redis langsam ist, und wie man das Problem behebt. Ich hoffe, dass es für alle hilfreich ist.

Lassen Sie uns über die Gründe sprechen, warum Redis langsam ist, und wie Sie das Problem beheben können.

Empfohlenes Lernen: Redis-Video-Tutorial

Ursache 1: Der Instanzspeicher erreicht die Obergrenze

Ideen zur Fehlerbehebung

Wenn Ihre Redis-Instanz eine Speicherobergrenze von maxmemory hat, kann dies auch zu Redis führen langsamer werden.

Wenn wir Redis als reinen Cache verwenden, legen wir normalerweise eine Speicherobergrenze von maxmemory für diese Instanz fest und legen dann eine Dateneliminierungsstrategie fest. Wenn der Speicher der Instanz den maximalen Speicher erreicht, stellen Sie möglicherweise fest, dass sich die Vorgangsverzögerung jedes Mal erhöht, wenn Sie danach neue Daten schreiben.

Gründe für die Verlangsamung

Wenn der Redis-Speicher den maximalen Speicher erreicht, muss Redis vor jedem Schreiben neuer Daten zunächst einen Teil der Daten aus der Instanz entfernen, um den Speicher der gesamten Instanz unter dem maximalen Speicher zu halten, und erst dann können neue Daten eingeschrieben werden.

Diese Logik des Herauswerfens alter Daten braucht ebenfalls Zeit, und die konkrete Zeitdauer hängt von der von Ihnen konfigurierten Eliminierungsstrategie ab:

  • allkeys-lru: Unabhängig davon, ob der Schlüssel auf Ablauf eingestellt ist, gilt dies für diejenigen, auf die am längsten nicht zugegriffen wurde eliminierter Schlüssel
  • volatile-lru: Nur die Schlüssel mit der geringsten aktuellen Zugriffs- und Ablaufzeit werden eliminiert. Schlüssel
  • allkeys-ttl: Unabhängig davon, ob der Schlüssel auf Ablauf eingestellt ist, der Schlüssel, der bald abläuft wird eliminiert. Sobald der Instanzspeicher den Maximalspeicher erreicht hat, wird direkt nach dem Schreiben neuer Daten ein Fehler zurückgegeben.
  • allkeys-lfu: Unabhängig vom Schlüssel niedrigste Zugriffshäufigkeit (unterstützt in Version 4.0+)
  • volatile-lfu: Entfernen Sie nur den Schlüssel mit der niedrigsten Zugriffshäufigkeit und legen Sie die Ablaufzeit fest (unterstützt in Version 4.0+)
  • Welche Strategie müssen wir konkret verwenden? es entsprechend spezifischer Geschäftsszenarien. Im Allgemeinen werden am häufigsten allkeys-lru-/volatile-lru-Eliminierungsstrategien verwendet. Ihre Verarbeitungslogik besteht darin, jedes Mal zufällig einen Stapel von Schlüsseln aus der Instanz zu entnehmen (diese Anzahl ist konfigurierbar), dann einen Schlüssel zu entfernen, auf den am wenigsten zugegriffen wird, und dann Verwenden Sie die verbleibenden Schlüssel vorübergehend in einem Pool, wählen Sie weiterhin zufällig einen Schlüsselstapel aus, vergleichen Sie sie mit den Schlüsseln im vorherigen Pool und entfernen Sie dann den Schlüssel, auf den am wenigsten zugegriffen wird. Wiederholen Sie dies, bis der Instanzspeicher unter maxmemory fällt.
  • Es ist zu beachten, dass die Logik zum Löschen von Daten in Redis dieselbe ist wie die zum Löschen abgelaufener Schlüssel. Sie wird auch ausgeführt, bevor der Befehl tatsächlich ausgeführt wird. Mit anderen Worten, es erhöht auch die Verzögerung bei unserem Betrieb von Redis Darüber hinaus ist die Verzögerung umso deutlicher, je höher der Schreib-OPS ist.

Wenn Bigkey zu diesem Zeitpunkt auch in Ihrer Redis-Instanz gespeichert ist, dauert es außerdem lange, Bigkey zu entfernen und zu löschen, um Speicher freizugeben.

Hast du es gesehen? Die Gefahren von Bigkey sind überall, weshalb ich Sie zuvor daran erinnert habe, zu versuchen, Bigkey nicht aufzubewahren.

Lösung

Vermeiden Sie das Speichern von Bigkeys und verkürzen Sie die Zeit für die Speicherfreigabe.

Die Eliminierungsstrategie wurde auf zufällige Eliminierung geändert, was viel schneller ist als LRU (abhängig von der Geschäftssituation).

Instanz aufteilen und eliminieren Schlüssel Der Druck wird auf mehrere Instanzen verteilt
  1. Wenn Sie Redis 4.0 oder höher verwenden, aktivieren Sie den Layz-Free-Mechanismus und führen Sie den Vorgang zum Entfernen von Schlüsseln und Freigeben von Speicher im Hintergrundthread aus (konfigurieren Sie lazyfree-lazy-eviction = ja). )
  2. Grund 2: Aktivieren Sie große Speicherseiten
  3. Ideen zur Fehlerbehebung

Wir alle wissen, dass eine Anwendung, wenn sie Speicher vom Betriebssystem beantragt, diesen nach Speicherseite und der herkömmlichen Speicherseitengröße beantragt ist 4 KB.

Ab 2.6.38 unterstützt der Linux-Kernel den Memory Huge Page-Mechanismus, der es Anwendungen ermöglicht, Speicher vom Betriebssystem in Einheiten von 2 MB zu beantragen.

Die Speichereinheit, die die Anwendung beim Betriebssystem anwendet, wird jedes Mal größer, aber das bedeutet auch, dass die Zeit, die für die Beantragung des Speichers benötigt wird, länger wird.
  • Ursachen der Verlangsamung
    • Wenn Redis im Hintergrund RDB- und AOF-Umschreibungen ausführt, verwendet es für die Verarbeitung untergeordnete Fork-Prozesse. Nachdem der Hauptprozess jedoch den untergeordneten Prozess gegabelt hat, kann der Hauptprozess zu diesem Zeitpunkt weiterhin Schreibanforderungen empfangen, und eingehende Schreibanforderungen verwenden die Methode „Copy On Write“ (Kopieren beim Schreiben), um Speicherdaten zu verarbeiten.
    • Mit anderen Worten: Sobald der Hauptprozess Daten enthält, die geändert werden müssen, ändert Redis die Daten nicht direkt im vorhandenen Speicher, sondern kopiert zuerst die Speicherdaten und ändert dann die Daten im neuen Speicher nennt man „Copy-on-Write“.
    • Copy-on-Write kann man auch so verstehen: Wer schreiben muss, muss zuerst kopieren und dann ändern.
    • Der Vorteil davon besteht darin, dass Schreibvorgänge des übergeordneten Prozesses keinen Einfluss auf die Datenpersistenz des untergeordneten Prozesses haben (der untergeordnete Prozess behält zum Zeitpunkt der Verzweigung nur alle Daten in der gesamten Instanz bei und kümmert sich nicht um neue). Datenänderungen), da der untergeordnete Prozess nur einen Speicher-Snapshot benötigt, der dann auf der Festplatte gespeichert wird).
    • Bitte beachten Sie jedoch, dass dieser Schritt beim Kopieren von Speicherdaten die Anwendung von neuem Speicher beinhaltet. Wenn das Betriebssystem zu diesem Zeitpunkt große Speicherseiten aktiviert, gilt dies auch dann, wenn der Client nur 10B davon ändert Daten: Wenn Redis Speicher beantragt, gilt dies auch für das Betriebssystem in Einheiten von 2 MB. Die für die Beantragung von Speicher benötigte Zeit wird länger, was wiederum dazu führt, dass die Verzögerung jeder Schreibanforderung zunimmt und sich auf die Leistung von Redis auswirkt.
    • Wenn diese Schreibanforderung ebenfalls auf einem Bigkey ausgeführt wird, ist der auf einmal angeforderte Speicher größer und die Zeit länger, wenn der Hauptprozess den Bigkey-Speicherblock kopiert. Es ist zu erkennen, dass Bigkey auch hier die Leistung beeinflusst.

    Lösung

    Schalten Sie den riesigen Seitenmechanismus aus.

    Zuerst müssen Sie prüfen, ob auf der Redis-Maschine große Seiten aktiviert sind:

    $ cat /sys/kernel/mm/transparent_hugepage/enabled
    [always] madvise never

    Wenn die Ausgabeoption immer lautet, bedeutet dies, dass der Mechanismus für große Seiten derzeit aktiviert ist und wir ihn deaktivieren müssen:

    $ echo never > /sys/kernel/mm/transparent_hugepage/enabled

    In Tatsächlich bietet das Betriebssystem den Vorteil des Speicher-Riesenseitenmechanismus, da er die Häufigkeit reduzieren kann, mit der Anwendungen in bestimmten Programmen Speicher beantragen.

    Aber für eine Datenbank wie Redis, die äußerst empfindlich auf Leistung und Latenz reagiert, hoffen wir, dass Redis bei jeder Speicheranforderung so kurz wie möglich benötigt. Daher empfehle ich nicht, diesen Mechanismus auf der Redis-Maschine zu aktivieren .

    Ursache 3: Swap verwenden

    Ideen zur Fehlerbehebung

    Wenn Sie feststellen, dass Redis plötzlich sehr langsam wird und jeder Vorgang Hunderte von Millisekunden oder sogar Sekunden dauert, müssen Sie prüfen, ob Redis Swap verwendet wird, und zwar in diesem Fall In diesem Fall ist Redis grundsätzlich nicht in der Lage, leistungsstarke Dienste bereitzustellen.

    Ursachen der Verlangsamung

    Was ist Swap? Warum führt die Verwendung von Swap zu einer Verschlechterung der Redis-Leistung?

    Wenn Sie etwas über das Betriebssystem wissen, wissen Sie, dass das Betriebssystem zulässt, dass ein Teil der Daten im Speicher auf die Festplatte verschoben wird, um die Speichernutzung zu puffern, um die Auswirkungen von unzureichendem Speicher auf Anwendungen zu mildern Der Bereich, der auf die Festplatte ausgelagert wird, ist Swap.

    Das Problem besteht darin, dass Redis, wenn die Daten im Speicher auf die Festplatte verschoben werden, sie erneut von der Festplatte lesen muss. Die Geschwindigkeit des Zugriffs auf die Festplatte ist hunderte Male langsamer als die des Speicherzugriffs! Insbesondere für eine Datenbank wie Redis, die extrem hohe Leistungsanforderungen hat und äußerst leistungsempfindlich ist, ist diese Betriebsverzögerung inakzeptabel.

    Zu diesem Zeitpunkt müssen Sie die Speichernutzung der Redis-Maschine überprüfen, um zu bestätigen, ob Swap verwendet wird. Sie können folgendermaßen überprüfen, ob der Redis-Prozess Swap verwendet:

    # 先找到 Redis 的进程 ID
    $ ps -aux | grep redis-server
     
    # 查看 Redis Swap 使用情况
    $ cat /proc/$pid/smaps | egrep '^(Swap|Size)'

    Das Ausgabeergebnis lautet wie folgt:

    Size:               1256 kB
    Swap:                  0 kB
    Size:                  4 kB
    Swap:                  0 kB
    Size:                132 kB
    Swap:                  0 kB
    Size:              63488 kB
    Swap:                  0 kB
    Size:                132 kB
    Swap:                  0 kB
    Size:              65404 kB
    Swap:                  0 kB
    Size:            1921024 kB
    Swap:                  0 kB
    ...

    Dieses Ergebnis listet die Speichernutzung des Redis-Prozesses auf. E Jede Zeile von SIZE gibt einen von Redis verwendeten Speicher an, und der Swap unter SIZE zeigt an, dass die Größe dieser Größe auf der Festplatte ersetzt wurde. Wenn diese beiden Werte gleich sind, bedeutet dies, dass die Daten dieses Speichers Daten wurden alle vollständig auf die Festplatte ausgelagert.

    Wenn beispielsweise nur eine kleine Datenmenge auf die Festplatte ausgelagert wird und jeder Swap einen kleinen Teil der entsprechenden Größe einnimmt, sind die Auswirkungen nicht groß. Wenn Hunderte von Megabyte oder sogar GB Speicher auf die Festplatte ausgelagert werden, müssen Sie wachsam sein. In diesem Fall wird die Leistung von Redis definitiv stark sinken.

    Lösung

    Erhöhen Sie den Speicher der Maschine, damit Redis über genügend Speicher verfügt.
    1. Organisieren Sie den Speicherplatz, geben Sie genügend Speicher frei, damit Redis ihn verwenden kann, und geben Sie dann den Swap of Redis frei, damit Redis den Speicher wiederverwenden kann
    2.               Der Prozess der Freigabe des Swaps von Redis erfordert normalerweise einen Neustart der Instanz. Um die Auswirkungen des Neustarts der Instanz auf das Geschäft zu vermeiden, wird normalerweise zuerst ein Master-Slave-Wechsel durchgeführt, dann erfolgt der Swap des alten Masterknotens Nachdem die Datensynchronisierung der Slave-Datenbank abgeschlossen ist, wird die alte Master-Knoten-Instanz freigegeben und dann der Master-Slave-Wechsel durchgeführt.

    Es ist ersichtlich, dass die Leistung von Redis zu diesem Zeitpunkt bei Verwendung von Swap durch Redis im Grunde nicht den hohen Leistungsanforderungen gerecht werden kann (Sie können verstehen, dass die Kampfkunst abgeschafft wurde), sodass Sie diese Situation auch im Voraus verhindern müssen.

    Um dies zu verhindern, müssen Sie die Speicher- und Swap-Nutzung der Redis-Maschine überwachen, einen Alarm auslösen, wenn der Speicher nicht ausreicht oder Swap verwendet wird, und rechtzeitig dagegen vorgehen.

    Ursache 4: Netzwerkbandbreitenüberlastung

    Ideen zur Fehlerbehebung

    Wenn Sie die oben genannten Szenarien, die zu Leistungsproblemen führen, vermieden haben und Redis lange Zeit stabil läuft, aber nach einem bestimmten Zeitpunkt der Betrieb von Redis begann plötzlich langsamer zu werden und wird immer langsamer. Was ist der Grund dafür?

    An dieser Stelle müssen Sie prüfen, ob die Netzwerkbandbreite der Redis-Maschine überlastet ist und ob es eine Instanz gibt, die die Netzwerkbandbreite der gesamten Maschine ausfüllt.

    Gründe für eine Verlangsamung

    Wenn die Netzwerkbandbreite überlastet ist, kommt es auf dem Server zu Paketversandverzögerungen, Paketverlusten usw. auf der TCP- und Netzwerkebene.

            Zusätzlich zum Betriebsspeicher liegt die hohe Leistung von Redis im Netzwerk-IO. Wenn es einen Engpass im Netzwerk-IO gibt, wird dies auch die Leistung von Redis ernsthaft beeinträchtigen.

    Lösung

    1. Bestätigen Sie rechtzeitig, dass die Netzwerkbandbreite der Redis-Instanz voll ist. Wenn es sich um einen normalen Geschäftszugriff handelt, müssen Sie die Instanz rechtzeitig erweitern oder migrieren, um eine Beeinträchtigung anderer Instanzen dieser Maschine durch übermäßige Belastung zu vermeiden Datenverkehr dieser Instanz.
    2. Auf der Betriebs- und Wartungsebene müssen Sie die Überwachung verschiedener Indikatoren der Redis-Maschine, einschließlich des Netzwerkverkehrs, verstärken. Wenn der Netzwerkverkehr einen bestimmten Schwellenwert erreicht, wird im Voraus ein Alarm ausgegeben, um eine rechtzeitige Bestätigung und Kapazitätserweiterung zu gewährleisten.

    Grund 5: Andere Gründe

    1) Häufige kurze Verbindungen

    Ihre Geschäftsanwendung sollte lange Verbindungen verwenden, um Redis zu betreiben, um häufige kurze Verbindungen zu vermeiden.

    Häufige kurze Verbindungen führen dazu, dass Redis viel Zeit damit verbringt, Verbindungen herzustellen und freizugeben. Der Drei-Wege-Handshake und die Vier-Wege-Welle von TCP erhöhen auch die Zugriffsverzögerungen.

    2) Betriebs- und Wartungsüberwachung

    Ich habe bereits erwähnt, dass es wichtig ist, bei der Überwachung gute Arbeit zu leisten, wenn man die Verlangsamung von Redis im Voraus vorhersagen möchte.

    Bei der Überwachung handelt es sich eigentlich um die Erfassung verschiedener Laufzeitindikatoren von Redis. Der übliche Ansatz besteht darin, dass das Überwachungsprogramm regelmäßig die INFO-Informationen von Redis sammelt und dann eine Datenanzeige und einen Alarm basierend auf den Statusdaten in den INFO-Informationen durchführt.

    Was ich Sie hier daran erinnern muss, ist, dass Sie es nicht auf die leichte Schulter nehmen dürfen, einige Überwachungsskripte zu schreiben oder Open-Source-Überwachungskomponenten zu verwenden.

    Versuchen Sie beim Schreiben von Überwachungsskripten für den Zugriff auf Redis, lange Verbindungen zum Sammeln von Statusinformationen zu verwenden, um häufige kurze Verbindungen zu vermeiden. Gleichzeitig müssen Sie auch darauf achten, die Häufigkeit des Zugriffs auf Redis zu kontrollieren, um Geschäftsanfragen nicht zu beeinträchtigen.

    Bei der Verwendung einiger Open-Source-Überwachungskomponenten ist es am besten, die Implementierungsprinzipien dieser Komponenten zu verstehen und diese Komponenten richtig zu konfigurieren, um Fehler in den Überwachungskomponenten zu vermeiden, die in kurzer Zeit zu einer großen Anzahl von Redis-Vorgängen führen und Auswirkungen haben die Leistung von Redis.

                                                                       , was dazu führt, dass Redis langsam reagiert.

    3) Andere Programme konkurrieren um Ressourcen

    Das Letzte, was ich Sie daran erinnern muss, ist, dass Ihre Redis-Maschine am besten für die Bereitstellung von Redis-Instanzen geeignet ist. Versuchen Sie, eine relativ ruhige Umgebung bereitzustellen for Redis“-Umgebung, um zu verhindern, dass andere Programme CPU-, Speicher- und Festplattenressourcen belegen, was dazu führt, dass Redis nicht genügend Ressourcen zugewiesen werden.

    Empfohlenes Lernen: Redis-Video-Tutorial

Das obige ist der detaillierte Inhalt vonLassen Sie uns über die Gründe sprechen, warum Redis langsam ist, und wie Sie das Problem beheben können.. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen