Warum sehe ich eine hohe oder steigende Speicherauslastung in meinem ElastiCache-Cluster?

Lesedauer: 6 Minute
0

Ich sehe eine hohe oder steigende Speicherauslastung in meinem Amazon-ElastiCache-Cluster. Wie wird die Speicherauslastung auf ElastiCache-Clusterknoten bestimmt?

Auflösung

Um die Gesamtspeicherauslastung auf Ihrem Cluster und seinen Knoten zu ermitteln, überprüfen Sie diese Redis-Metriken. Diese Metriken werden in Amazon CloudWatch für jeden Knoten in einem Cluster veröffentlicht:

  • BytesUsedForCache: Die Gesamtanzahl der von Redis zugewiesenen Bytes für Datensätze, Puffer usw. Diese Metrik wird aus der INFO-Befehlsausgabe eines Redis-Knotens abgeleitet. Verwenden Sie diese Metrik, um die Speicherauslastung Ihres Clusters zu ermitteln.
  • FreeableMemory: Diese Metrik auf Host-Ebene zeigt die Menge an freiem Speicher an, die auf dem Host verfügbar ist. Wenn die Speichernutzung aufgrund von Cache-Daten oder aufgrund von Overhead zunimmt, können Sie die Abnahme von FreeableMemory feststellen. Eine Verringerung von FreeableMemory deutet auf wenig freien Speicher auf dem Host hin. Swap kann auftreten, wenn FreeableMemory zu niedrig ist.
  • DataBaseMemoryUsagePercentage: Diese Metrik wird aus der Ausgabe des Befehls Redis INFO abgeleitet. Dies ist der Prozentsatz des vom Clusterknoten verwendeten Speichers. Redis initiiert die Redis-MaxMemory-Räumungsrichtlinie, nachdem diese Metrik 100% des Schwellenwerts erreicht hat.

Beachten Sie, dass ElastiCache for Redis standardmäßig 25% des Max-Speichers für Nicht-Datennutzung reserviert, wie Failover und Backup. Wenn Sie nicht genügend reservierten Speicher für die Nicht-Datennutzung angeben, erhöht sich die Wahrscheinlichkeit eines Austauschs. Weitere Informationen finden Sie unter Reservierten Speicher verwalten.

Ursachen für plötzlich hohen Speicherverbrauch

  • Kürzlich hinzugefügte Schlüssel: Das Hinzufügen neuer Schlüssel-Wert-Paare führt zu einer erhöhten Speichernutzung. Das Hinzufügen von Elementen zu vorhandenen Schlüsseln erhöht auch den Speicherverbrauch. Überprüfen Sie die Metrik SetTypeCmds, um festzustellen, ob auf dem Knoten aktuelle Datenänderungen vorgenommen wurden. Diese Metrik protokolliert die Gesamtzahl der Schreibtypbefehle und wird aus der Redis-Befehlsstats-Statistik abgeleitet.
  • Zunehmender Pufferverbrauch: Clients sind über das Netzwerk mit Redis verbunden. Wenn der Client nicht schnell genug aus dem Cache liest, speichert Redis die Antwortdaten in einem Speicherbereich, der als Client-Ausgabepuffer bezeichnet wird. Der Client kann weiter aus dem Pufferspeicher lesen. Dies gilt auch für Pub- und Sub-Clients, wenn die abonnierten Kunden nicht schnell genug lesen.
    Wenn es einen Engpass bei der Netzwerkbandbreite gibt oder wenn der Cluster ständig stark ausgelastet ist, kann sich die Pufferauslastung weiter ansammeln. Diese Akkumulation führt zu Speichererschöpfung und Leistungseinbußen. Standardmäßig schränkt ElastiCache for Redis das Wachstum des Ausgabepuffers nicht ein und jeder der Clients hat seinen eigenen Puffer. Verwenden Sie den Befehl client-list, um die Puffernutzung zu überprüfen.
  • Große Anzahl neuer Verbindungen: Eine große Anzahl neuer Verbindungen kann den Speicherverbrauch erhöhen. Alle neuen Verbindungen erstellen einen Dateideskriptor, der Speicher verbraucht. Der Gesamtspeicherverbrauch bei einer großen Anzahl neuer Verbindungen kann hoch sein, was zu Datenlöschungen oder OOM-Fehlern führen kann. Überprüfen Sie die NewConnections-Metrik auf die Gesamtzahl der akzeptierten neuen Verbindungen.
  • Hohe Swap-Nutzung: Es ist normal, dass auf einem Cache-Knoten eine gewisse Swap-Nutzung auftritt, wenn freier Speicher vorhanden ist. Eine zu hohe Swap-Nutzung kann jedoch zu Leistungsproblemen führen. Ein hoher Swap findet normalerweise in einem Knoten statt, der unter Speicherdruck läuft, was zu wenig freigebbarem Speicher führt. Verwenden Sie die Metrik SwapUsage, um Swap auf dem Host zu überwachen.
  • Hohe Speicherfragmentierung: Eine hohe Speicherfragmentierung weist auf Ineffizienzen bei der Speicherverwaltung innerhalb des Betriebssystems hin. Redis gibt möglicherweise keinen Speicher frei, wenn Schlüssel entfernt werden. Verwenden Sie die Metrik MemoryFragmentationRatio, um das Fragmentierungsverhältnis zu überwachen. Wenn Fragmentierungsprobleme auftreten, aktivieren Sie den activedefrag-Parameter für die aktive Speicherdefragmentierung.
  • Große Schlüssel: Ein Schlüssel mit einer großen Datengröße oder einer großen Anzahl von Elementen darin wird als großer Schlüssel bezeichnet. Sie können aufgrund eines großen Schlüssels eine hohe Speicherauslastung feststellen, selbst wenn die Metrik CurrItems niedrig bleibt. Um große Schlüssel in Ihrem Datensatz zu erkennen, verwenden Sie den Befehl redis-cli – bigkeys.

Bewährte Methoden zur Kontrolle eines hohen Speicherverbrauchs

  • TTL für Schlüssel verwenden: Sie können TTL für Schlüssel für den Ablauf angeben. Dadurch werden die Schlüssel nach Ablauf entfernt, ohne auf Speicherdruck zu warten. Dies verhindert, dass Redis mit unnötigen Schlüsseln überladen wird. Eine kleine Anzahl von Bereinigungen ist kein Problem, aber eine hohe Anzahl von Räumungen bedeutet, dass Ihr Knoten unter Speicherdruck läuft.
  • Räumungsrichtlinie verwenden: Wenn der Cache-Speicher voll wird, entfernt Redis die Schlüssel, um Speicherplatz basierend auf der maxmemory-policy freizugeben. Die standardmäßige maxmemory-policy-Richtlinie ist auf volatile_lru festgelegt. Es ist eine bewährte Methode, eine Räumungsrichtlinie zu wählen, die auf die Bedürfnisse Ihrer Arbeitsbelastung zugeschnitten ist.
  • Reservierten Speicher zuweisen: Um Probleme während des Failovers oder der Sicherung zu vermeiden, empfiehlt es sich, reserved_memory_percentage für Nicht-Datennutzung auf mindestens 25 % zu setzen. Wenn nicht genügend reservierter Speicher für Failover oder Backup vorhanden ist, treten Swap- und Leistungsprobleme auf.
  • Verbindungspooling verwenden: Das Verbindungspooling hilft bei der Kontrolle einer hohen Anzahl neuer Verbindungen, die der Redis-Client versucht. Lesen Sie die Anleitungen für bewährte Methoden von AWS für den Umgang mit einer großen Anzahl neuer Verbindungen.
  • Größenbeschränkungen für Ausgabepuffer anpassen: Sie können den Grenzwert für den Ausgabepuffer anpassen, um die Speicherplatznutzung zu steuern. ElastiCache-for-Redis-Parametergruppen bieten mehrere Parameter, beginnend mit client-output-buffer-limit-*, um ein unbegrenztes Wachstum der Client-Ausgabepuffernutzung zu vermeiden. Beachten Sie, dass es für diese Parameter kein vorgeschlagenes Limit gibt, da jede Workload eindeutig ist. Es ist eine bewährte Methode, Ihren Workload zu bewerten, damit Sie einen geeigneten Wert auswählen können.
  • Erwägen Sie die Verwendung von Hash-Mapping: In Redis ist der gesamte Speicherbedarf der Redis-DB linear. Es benötigt mehr Speicher mit weniger einzelnen Schlüsseln als ein einzelner Hash-Map-Schlüssel mit weniger Feldern. Hash Mapping hilft bei Datenstrukturen, die eine große Anzahl von Schlüsseln haben. Zusätzlich zum Hash-Mapping können Sie die Vorteile der Ziplist-Codierung nutzen, wodurch der Speicherbedarf im Vergleich zu Hash-Tabellen reduziert wird. Beachten Sie, dass die Verwendung von Hash-Mapping zu einem Anstieg der Redis-Engine-Nutzung führen kann, da dies ein komplexer Befehl ist, der mehr CPU als festgelegte Operationen benötigt.
  • Skalieren Sie den Cluster: Manchmal kann es zu Speicherdruck kommen, nachdem Sie die erforderlichen Vorsichtsmaßnahmen getroffen haben. Wenn dies der Fall ist und die Auslastung auf die erwartete Workload zurückzuführen ist, sollten Sie eine geeignete Skalierung in Betracht ziehen, um Speicherengpässe zu beheben.
  • Stellen Sie einen Alarm für die Speichernutzung ein. Sie können CloudWatch-Alarme verwenden, um einen Alarm auszulösen, wenn die Speichernutzung einen voreingestellten Schwellenwert überschreitet. Verwenden Sie die Metrik BytesUsedForCache oder DatabaseMemoryUsagePercentage, um einen Alarm über die CloudWatch-Konsole zu Überwachungs- und Skalierungszwecken zu erstellen.

Relevante Informationen

Metriken für Redis

Redis-4.0.10-Parameteränderungen

Wie behebe ich die Fehlermeldung „OOM command not allowed“ für einen ElastiCache-für-Redis-Clusterknoten?

Schlüsselbereinigung

Speicheroptimierung für Redis

AWS OFFICIAL
AWS OFFICIALAktualisiert vor einem Jahr