Heim  >  Artikel  >  Datenbank  >  Eine kurze Diskussion über die Gründe, warum Redis langsam ist, und wie man das Problem beheben kann

Eine kurze Diskussion über die Gründe, warum Redis langsam ist, und wie man das Problem beheben kann

WBOY
WBOYnach vorne
2022-09-09 13:51:372385Durchsuche

Empfohlenes Lernen: Redis-Video-Tutorial

Ursache 1: Der Instanzspeicher hat die Obergrenze erreicht

Ideen zur Fehlerbehebung

Wenn Ihre Redis-Instanz eine Speicherobergrenze von maxmemory hat, kann dies ebenfalls dazu führen Redis soll langsamer werden.

Wenn wir Redis als reinen Cache verwenden, legen wir normalerweise ein Speicherlimit 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.

Ursache der 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: Dies 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 lauern überall, weshalb ich Sie vorhin daran erinnert habe, Bigkey nicht so oft wie möglich 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).

Teilen Sie die Instanz auf und eliminieren Sie die Schlüssel Der Druck wird auf mehrere Instanzen verteilt
  • 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). )
  • Grund 2: Aktivieren Sie große Speicherseiten
  • Ideen zur Fehlerbehebung

Wir alle wissen, dass eine Anwendung, wenn sie Speicher vom Betriebssystem beantragt, diese nach Speicherseiten beantragt und die herkömmliche Speicherseitengröße 4 KB beträgt .

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)'

    Die Ausgabeergebnisse lauten wie folgt

    Größe: 1256 kB
    Austauschen: 0 kB
    Größe: 4 kB
    Austauschen: 0k B
    Größe: 132 kB
    Austauschen: 0 kB
    Größe: 63488 kB
    Austauschen: 0 kB
    Größe: 132 kB
    Austauschen: 0 kB
    Größe:                    65404 kB
    Swap:                                                                                                     
    ...

    Dieses Ergebnis listet die Speichernutzung des Redis-Prozesses auf.

    Jede Zeile von Size stellt die Größe eines von Redis verwendeten Speichers dar. Die Swap-Größe unten stellt die Größe dieses Speichers dar und wie viele Daten auf die Festplatte ausgelagert wurden. Dies bedeutet, dass die Daten in diesem Speicher vollständig auf die Festplatte übertragen wurden.

    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 sehr 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.
    • 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
    • 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 im Allgemeinen 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 dies rechtzeitig beheben.

    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?

    Zu diesem Zeitpunkt müssen Sie prüfen, ob die Netzwerkbandbreite der Redis-Maschine überlastet ist und ob eine Instanz vorhanden ist, 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.

    Die hohe Leistung von Redis liegt neben dem Betriebsspeicher auch in der Netzwerk-E/A. Wenn es einen Engpass bei der Netzwerk-E/A gibt, wird dies auch die Leistung von Redis erheblich beeinträchtigen.

    Lösung

    Bestätigen Sie rechtzeitig, dass die Redis-Instanz die gesamte Netzwerkbandbreite belegt hat. Wenn es sich um einen normalen Geschäftszugriff handelt, müssen Sie die Instanz rechtzeitig erweitern oder migrieren, um zu vermeiden, dass andere Instanzen dieser Maschine durch Überlastung beeinträchtigt werden Datenverkehr dieser Instanz.
    • Auf der Betriebs- und Wartungsebene müssen Sie die Überwachung verschiedener Indikatoren der Redis-Maschine verstärken, einschließlich des Netzwerkverkehrs. Wenn der Netzwerkverkehr einen bestimmten Schwellenwert erreicht, müssen Sie im Voraus einen Alarm auslösen und ihn rechtzeitig bestätigen.
    • 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.

    Überwachung ist eigentlich die Sammlung 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äftliche Anfragen 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.

    Damals passierte es uns, dass bei der Verwendung einiger Open-Source-Komponenten durch den DBA aufgrund von Konfigurations- und Nutzungsproblemen das Überwachungsprogramm häufig eingerichtet und wieder von Redis getrennt wurde, was dazu führte, dass Redis langsam reagierte.

    3) Andere Programme konkurrieren um Ressourcen

    Abschließend muss ich Sie daran erinnern, dass Ihre Redis-Maschine am besten für die Bereitstellung von Redis-Instanzen geeignet ist. Versuchen Sie, Redis eine relativ ruhige Umgebung bereitzustellen . ”-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 vonEine kurze Diskussion über die Gründe, warum Redis langsam ist, und wie man das Problem beheben kann. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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