Best Practices für die Arbeitsspeicherverwaltung

Eine Memorystore-Instanz für Redis kann, wenn sie nicht korrekt verwaltet und konfiguriert wird, einem Speicherdruck unterliegen, der sich auf die Anwendungsleistung auswirken kann. Auf dieser Seite werden Best Practices beschrieben, mit denen Sie die Speichernutzung Ihrer Instanz effizient verwalten können.

Hier finden Sie Informationen zu:

Konzepte der Speicherverwaltung

In diesem Abschnitt werden Konzepte vorgestellt, die Sie zur Verwaltung der Speichernutzung Ihrer Instanz kennen sollten.

Instanzkapazität

  • Die Instanzkapazität ist die von Ihnen bereitgestellte Speicherkapazität in Gigabyte (GB) und die Kosten, die Ihnen in Rechnung gestellt werden. Weitere Informationen zur Auswahl der richtigen Instanzkapazität finden Sie unter Memorystore-Instanz in der richtigen Größe.

Maxmemory-Konfiguration

  • Maxmemory ist eine Redis-Konfiguration, mit der Sie das Speicherlimit festlegen können, ab dem Ihre Bereinigungsrichtlinie wirksam wird. Memorystore for Redis legt diese Konfiguration als maxmemory-gb fest. Wenn Sie eine Instanz erstellen, wird maxmemory-gb auf die Instanzkapazität festgelegt. Je nach Messwert für das Verhältnis der Systemspeichernutzung müssen Sie möglicherweise das Limit von maxmemory-gb verringern, um Arbeitsspeicheraufwand für Arbeitslastspitzen bereitzustellen.

    Weitere Informationen finden Sie unter Verhältnis der Systemspeichernutzung verwalten.

    Informationen zum Anpassen von maxmemory-gb finden Sie unter Redis-Instanzen konfigurieren.

Verhältnis der Systemspeichernutzung

  • Mit dem Messwert für das Verhältnis der Systemspeichernutzung können Sie die Speichernutzung einer Instanz im Verhältnis zum Systemspeicher messen. Der Systemspeicher wird von Memorystore automatisch verwaltet, um Speichernutzungsspitzen zu bewältigen, die durch speicherintensive Vorgänge und die in Open-Source-Redis häufig auftretende Speicherfragmentierung verursacht werden.

    Wenn der Messwert für das Verhältnis der Systemspeichernutzung 80 % überschreitet, deutet dies darauf hin, dass die Instanz unter Speicherdruck steht, und Sie sollten den Anweisungen unter Verhältnis der Systemspeichernutzung verwalten folgen. Wenn Sie keine Maßnahmen ergreifen und die Speichernutzung weiter zunimmt, können Sie aufgrund von unzureichendem Speicher einen Absturz der Instanz riskieren. Der Messwert für das Verhältnis der Systemspeichernutzung kann aufgrund von Speicherfragmentierung 80 % überschreiten. Wenn die Metrik schnell auf 80 % oder mehr ansteigt, könnten Sie alternativ einen der speicherintensiven Vorgänge verwendet haben.

Genutzter Speicher

  • Der Messwert Belegter Speicher gibt an, wie viele Daten sich in Ihrer Memorystore-Instanz befinden. Der genutzte Arbeitsspeicher einer Instanz kann bis zur Konfigurationsgrenze von maxmemory-gb erweitert werden. Wenn der verwendete Speicherplatz das Limit von maxmemory-gb überschreitet, wird Ihre Bereinigungsrichtlinie wirksam.

Bereinigungsrichtlinie

  • Die Bereinigungsrichtlinie Ihrer Instanz (auch als Maxmemory-Richtlinie bezeichnet) bestimmt, wie Redis Schlüssel entfernt, wenn Ihre Instanzdaten das Limit von maxmemory-gb erreichen. Redis entfernt Schlüssel im Rahmen des normalen Cache-Anwendungsfalls. Die Schlüsselbereinigung erfolgt im Hintergrund. Daher werden Schlüssel nicht sofort nach Erreichen des maxmemory-gb-Limits entfernt. Eine hohe Schreibrate könnte die Schlüsselbereinigung übertreffen, was zu einem Speichermangel führt.

    Die Standard-Bereinigungsrichtlinie einer Memorystore-Instanz ist volatile-lru. Wenn Sie eine Bereinigungsrichtlinie vom Typ volatile-* verwenden, müssen Sie TTLs für Schlüssel festlegen, die ablaufen sollen. Andernfalls hat Redis keine Schlüssel, die entfernt werden müssen.

    Eine Liste der Bereinigungsrichtlinien finden Sie unter Maxmemory-Richtlinien.

    Informationen zum Ändern der Bereinigungsrichtlinie finden Sie unter Redis-Instanzen konfigurieren.

Speicherfragmentierung

  • Speicherfragmentierung kann dazu führen, dass Ihrer Memorystore-Instanz der Speicher ausgeht, selbst wenn das Verhältnis von genutztem Speicher zu maxmemory-gb niedrig ist. Eine Speicherfragmentierung tritt auf, wenn das Betriebssystem Speicherseiten zuweist, die Redis nach wiederholten Schreib- und Löschvorgängen nicht vollständig nutzen kann. Die Anhäufung solcher Seiten kann dazu führen, dass das System nicht mehr über genügend Arbeitsspeicher verfügt und der Redis-Server letztendlich abstürzt. Die Redis-Konfiguration activedefrag kann dabei helfen, die Fragmentierung zu reduzieren.

Aktive Defragmentierung

  • Redis-Versionen 4.0 und höher bieten eine activedefrag-Konfiguration. Erstellen Sie nach Möglichkeit Ihre Memorystore-Instanz mit Redis 4.0. Memorystore setzt activedefrag standardmäßig auf "no". Das Festlegen von activedefrag auf "yes" führt zu einem Kompromiss bei der CPU-Leistung, kann jedoch die Speicherfragmentierung minimieren, was zu Problemen aufgrund fehlenden Speichers führt.

    Wenn der Messwert für das Verhältnis der Systemspeichernutzung eine Speicherfragmentierung anzeigt, sollten Sie activedefrag aktivieren. Andernfalls bleibt activedefrag eine optionale Einstellung.

Speicherintensive Vorgänge

Die folgenden Vorgänge belegen viel Speicher, insbesondere wenn sie in Verbindung mit einer hohen Schreibrate ausgeführt werden:

Exportieren

Das Memorystore-Feature Exportieren verwendet den Redis-Vorgang BGSAVE, der "Copy-on-Write" verwendet. Je nach Größe der Daten, Schreibvolumen und berührten Tasten kann der für einen Export benötigte Speicher doppelt so groß sein wie der Speicherplatz, den Ihre Daten belegen. Daher müssen Sie möglicherweise den Grenzwert maxmemory-gb während des Exports auf 50 % der Instanzkapazität reduzieren, damit Exporte erfolgreich ausgeführt werden können.

Skalierung und Versionsupgrade für Instanzen der Standardstufe

Die Skalierung oder das Upgrade in Zeiten hoher Schreiblast kann den Arbeitsspeicher Ihrer Instanz aufgrund des durch die Replikation verursachten Speicheraufwands belasten. Wenn ein Skalierungs- oder Upgradevorgang aufgrund von Arbeitsspeicherausfall fehlschlägt, sollten Sie:

  • Skalieren/Upgrade durchführen in Zeiten mit wenig Schreibvorgängen.
  • maxmemory-gb auf 50 % der Instanzkapazität während Skalierungs-/Upgrade-Vorgängen reduzieren. Wenn möglich, sollten Sie den Maxmemory-Wert auch in Zeiten mit geringem Instanz-Traffic senken, da dies die negativen Auswirkungen der Senkung von Maxmemory auf Ihre Cache-Trefferquote verringert.

Speichernutzung Ihrer Instanz beobachten

Beobachten Sie die Messwerte und legen Sie die in diesem Abschnitt beschriebenen Benachrichtigungen fest. Diese Messwerte und Benachrichtigungen geben Ihnen einen Einblick in die Speichernutzung Ihrer Instanz. Informationen zum Anzeigen von Messwerten und Festlegen von Benachrichtigungen finden Sie unter Redis-Instanzen beobachten.

Messwert Vollständige Messwertadresse
Maxmemory redis.googleapis.com/stats/memory/maxmemory
Speichernutzung redis.googleapis.com/stats/memory/usage
Speichernutzungsverhältnis redis.googleapis.com/stats/memory/usage_ratio
Dauer der Systemspeicherüberlastung redis.googleapis.com/stats/memory/system_memory_overload_duration
Verhältnis der Systemspeichernutzung redis.googleapis.com/stats/memory/system_memory_usage_ratio
Cache-Trefferquote redis.googleapis.com/stats/memory/cache_hit_ratio
Ablaufende Schlüssel redis.googleapis.com/keyspace/keys_with_expiration
Abgelaufene Schlüssel redis.googleapis.com/stats/expired_keys
Entfernte Schlüssel redis.googleapis.com/stats/evicted_keys

Speichernutzungsverhältnis

Der Messwert Speichernutzungsverhältnis gibt an, wie nahe Ihre Arbeitssatzgröße an der Grenze von maxmemory-gb liegt. Wenn die Bereinigungsrichtlinie auf "keine Bereinigung" festgelegt ist, deuten die Instanzdaten, die Maxmemory erreichen, nicht immer auf ein Problem hin. Die Schlüsselbereinigung ist jedoch ein Hintergrundprozess, der Zeit in Anspruch nimmt. Wenn Sie eine hohe Schreibrate haben, kann es sein, dass der Speicherplatz knapp wird, bevor Redis Zeit hat, Schlüssel zu bereinigen, um Speicherplatz freizugeben.

Verhältnis der Systemspeichernutzung

Das Verhältnis der Systemspeichernutzung ist ein wichtiger Messwert, der beobachtet werden muss. Damit die Instanz über genügend Arbeitsspeicher für die Arbeitslast und andere speicherintensive Vorgänge verfügt, ist es wichtig, immer genügend Systemspeicher zur Verfügung zu haben.

Richten Sie eine Benachrichtigung ein, die Sie darüber informiert, wenn der Messwert für das Verhältnis der Systemspeichernutzung 80 % erreicht. Sie sollten dann beginnen, den Messwert für das Verhältnis der Systemspeichernutzung genauer zu beobachten. Steigt es weiterhin drastisch an, sollten Sie activedefrag aktivieren, Maxmemory verringern und unter Umständen auch die Instanz skalieren.

Sobald das Verhältnis der Systemspeichernutzung 100 % erreicht, wird jeder Vorgang blockiert, der den Speicherbedarf Ihrer Instanz weiter erhöht. Redis gibt dann folgenden Fehler zurück:

-OOM command not allowed under OOM prevention.

Weitere Informationen finden Sie unter Verhältnis der Systemspeichernutzung verwalten.

Dauer der Systemspeicherüberlastung

Wenn Ihre Speichernutzung zu hoch ist, blockiert Memorystore Schreibvorgänge in Ihre Instanz, um sie fehlerfrei zu halten. Mit der Dauer der Systemspeicherüberlastung wird erfasst, wie lange sich Ihre Instanz im Zustand "Blockierte Schreibvorgänge" befindet.

Sie sollten für diesen Messwert eine Benachrichtigung einrichten, damit Sie wissen, wann Schreibvorgänge für Ihre Instanz blockiert werden. Sie können auch auf diesen Messwert zurückgreifen, um den Fehler -OOM command not allowed under OOM prevention. zu beheben.

Cache-Trefferquote

Sie sollten Ihre Cache-Trefferquote regelmäßig beobachten, damit Sie wissen, wie viel Prozent der Schlüsselsuchen erfolgreich von Schlüsseln in Ihrer Redis-Instanz zurückgegeben werden. Im Allgemeinen ist eine höhere Cache-Trefferquote besser als eine niedrigere Cache-Trefferquote. Notieren Sie sich die Cache-Trefferquote, bevor Sie größere Konfigurationsänderungen vornehmen, z. B. das maxmemory-gb-Limit anpassen, die Bereinigungsrichtlinie ändern oder die Instanz skalieren. Nachdem Sie Ihre Instanz geändert haben, prüfen Sie die Cache-Trefferquote noch einmal, um zu sehen, wie sich die Änderung auf diesen Messwert ausgewirkt hat.

Ablaufende und abgelaufene Schlüssel

Der Stackdriver-Messwert Ablaufende Schlüssel überwacht die Anzahl der Schlüssel, die für den Ablauf festgelegt sind. Wenn keine ablaufenden Schlüssel vorhanden sind, kann dies darauf hindeuten, dass Sie keine TTLs für Schlüssel festlegen. Wenn Ihre Instanzdaten in diesem Fall das Limit von maxmemory-gb erreichen, müssen keine Schlüssel bereinigt werden, die zu einem Speichermangel führen könnten.

Einen weiteren Messwert, den Sie beobachten können, ist der Messwert für abgelaufene Schlüssel. Wenn der Messwert viele abgelaufene Schlüssel anzeigt, Sie aber weiterhin Speicherdruck auf Ihrer Instanz feststellen, sollten Sie maxmemory-gb senken.

Speichermangelzustand beheben

Nachfolgend finden Sie einige Best Practices, denen Sie folgen sollten, wenn Ihre Instanz unter Speicherdruck steht oder wenn der Speicherplatz knapp wird.

  1. Wenn Sie eine volatile-*-Bereinigungsrichtlinie verwenden, müssen Sie TTLs für Schlüssel festlegen, die ablaufen sollen. Weitere Informationen finden Sie unter Bereinigungsrichtlinie.

  2. Für Instanzen mit Redis 4.0:

    1. Aktivieren Sie activedefrag für Ihre Instanz. Weitere Informationen finden Sie unter Aktive Defragmentierung.
  3. Informationen zur Behebung von Speicherplatzproblemen mit Messwerten und zu Einblicken in die Speichernutzung Ihrer Instanz: Speichernutzung der Instanz beobachten, Verhältnis der Systemspeichernutzung verwalten.

  4. Maxmemory bei speicherintensiven Vorgängen anpassen

  5. Wenn der Messwert für das Verhältnis der Systemspeichernutzung 80 % überschreitet, verringern Sie das maxmemory-gb-Limit Ihrer Instanz. Weitere Informationen finden Sie unter Verhältnis der Systemspeichernutzung verwalten.

  6. Erhöhen Sie unter Umständen die Kapazität der Instanz.

  7. Wenn weiterhin Probleme mit dem Arbeitsspeicher auftreten, wenden Sie sich an den Google Cloud Platform-Support.

Größe der Memorystore-Instanz anpassen

In diesem Abschnitt werden drei verschiedene Ansätze besprochen, mit denen Sie die Größe Ihrer Instanz basierend auf Ihrer Arbeitslast anpassen können:

Anfängliche Größe einer Memorystore-Instanz bestimmen

Wählen Sie zuerst aus, ob Sie eine Instanz der Standard- oder Basis-Stufe wünschen. Weitere Informationen zu Memorystore for Redis-Stufen finden Sie unter Redis-Stufenfunktionen. Nachdem Sie die richtige Stufe für Ihre Anwendung ausgewählt haben, führen Sie die folgenden Schritte aus, um die benötigte Instanzgröße zu ermitteln:

  1. Legen Sie die Größe Ihrer Daten fest.

    • Schätzen Sie die Anzahl der Schlüssel und die durchschnittliche Größe der Schlüssel, die Ihre Anwendung in Ihre Redis-Instanz schreibt. Multiplizieren Sie diese Werte, um eine grobe Schätzung der benötigten Instanzgröße zu erhalten.
  2. Wählen Sie eine Bereinigungsrichtlinie aus.

    • Wenn Sie die Maxmemory-Richtlinie noeviction verwenden, muss die Instanzgröße groß genug sein, um Ihre maximale Arbeitslast und Ihren Arbeitssatz aufzunehmen. Wenn Sie mit dieser Richtlinie für maximalen Speicherplatz nicht genügend Arbeitsspeicher haben, kann es sein, dass Ihrer Instanz nicht genügend Arbeitsspeicher zur Verfügung steht.
    • Andere Bereinigungsrichtlinien haben keinen Einfluss auf die bereitgestellte Instanzgröße.
  3. Zusätzlichen Speicher für Instanzen der Standardstufe bereitstellen

    • Im Gegensatz zu Instanzen der Basisstufe reservieren Instanzen der Standardstufe 10 % der Instanzkapazität als Replikationspuffer. Wenn Sie eine Instanz der Standardstufe auswählen, müssen Sie die Datenschätzung aus Schritt 1 übernehmen und zusätzliche 10 % für den Replikationspuffer bereitstellen.
  4. Durchschnittliche und maximale Schreibrate schätzen

    • Wenn möglich, schätzen Sie die Schreibrate und die Größe der von Ihrer Anwendung verwendeten Schlüssel. Die Schreibrate im Vergleich zur Rate der Schlüsselentfernung bestimmt, wie schnell Ihre Instanz im Laufe der Zeit wächst.
  5. Vertikal skalieren, um die gewünschte Cache-Trefferquote zu erreichen

    • Beobachten Sie die Cache-Trefferquote. Wenn Sie nicht so viele erfolgreiche Cache-Treffer erhalten, wie Sie möchten, bedeutet dies, dass Sie entweder die Größe Ihrer Instanz erhöhen oder gewährleisten müssen, dass Ihre Anwendung die angeforderten und nicht erfüllten Schlüssel in Ihre Memorystore-Instanz schreibt.

Ermitteln, ob die Instanz Schreibvorgänge aufgrund von Speichermangel blockiert

Wenn Sie die folgende Fehlermeldung erhalten:

-OOM command not allowed under OOM prevention.

Prüfen Sie dann Folgendes:

  1. Der Messwert für das Verhältnis der Systemspeichernutzung lag bei über 80 %, bevor Probleme mit der Instanz auftraten.
  2. Das Verhältnis der Systemspeichernutzung ist sehr schnell gestiegen, bevor Probleme mit Ihrer Instanz aufgetreten sind.
  3. Der Messwert Dauer der Systemspeicherüberlastung zeigte Werte über null während desselben Zeitraums an, in dem blockierte Schreibvorgänge aufgetreten sind.

Wenn dies der Fall ist, deutet dies wahrscheinlich darauf hin, dass die Instanz Schreibvorgänge aufgrund von Speichermangel blockiert.

Speichernutzung des Systems verwalten

Richten Sie eine Benachrichtigung ein, damit Sie informiert werden, wenn der Messwert für das Verhältnis der Systemspeichernutzung 80 % überschreitet. Wenn das Verhältnis der Systemspeichernutzung 80 % überschreitet, sollten Sie entsprechende Maßnahmen ergreifen, damit der Instanz nicht der Speicher ausgeht. Je nach Schreibvolumen und Schlüsselzugriffsmuster kann die Systemspeichernutzung schnell auf 100 % ansteigen. In Memorystore können Sie das Verhältnis der Systemspeichernutzung so verwalten:

  • Aktivieren Sie activedefrag für Instanzen mit Redis Version 4.0.
  • Verringern Sie das maxmemory-gb-Limit Ihrer Instanz.
  • Skalieren Sie die Instanz vertikal.
  • Wählen Sie die entsprechende Bereinigungsrichtlinie aus.
  • Legen Sie TTLs für flüchtige Schlüssel fest.
  • Löschen Sie Schlüssel aus Ihrer Instanz manuell.

"activedefrag" aktivieren

Wenn das Nutzungsverhältnis des Systemspeichers 80 % überschreitet, aktivieren Sie activedefrag (für Instanzen mit Redis Version 4.0). Bei der Defragmentierung kann es mehrere Stunden dauern, bis der fragmentierte Speicher freigegeben ist. Wenn der Schreibverkehr hoch ist, reicht die Defragmentierung allein möglicherweise nicht aus, um zu verhindern, dass die Instanz nicht mehr über genügend Arbeitsspeicher verfügt. Daher müssen Sie möglicherweise die folgenden Empfehlungen umsetzen:

Maxmemory-Limit Ihrer Instanz verringern

Wenn das Verhältnis der Systemspeichernutzung 80 % überschreitet, sollten Sie maxmemory-gb senken. Sehen Sie sich jedoch zuerst an, wie sich das Verhältnis der Systemspeichernutzung im Laufe der Zeit geändert hat, um das neue maxmemory-gb-Limit festzulegen.

Szenario 1: Das Verhältnis der Systemspeichernutzung ist schrittweise und langsam gestiegen. Fragmentierung ist ein wahrscheinliches Problem, und Sie sollten maxmemory-gb in kleinen Schritten verringern, bis sich das Verhältnis der Systemspeichernutzung unter 80 % stabilisiert hat.

Szenario 2: Das Verhältnis der Systemspeichernutzung ist schnell angestiegen und Sie sehen eine erhebliche Schreiblast auf Ihrer Instanz. Die Spitze wurde wahrscheinlich von einem speicherintensiver Vorgang verursacht. In diesem Fall sollten Sie das maxmemory-gb-Limit in größeren Schritten senken, um sicherzustellen, dass der Instanz genügend Arbeitsspeicher zur Verfügung steht oder sie sich vom Speichermangel wieder erholt. Beachten Sie, dass durch das Verringern von "maxmemory" die Cache-Trefferquote Ihrer Instanzen verringert werden kann. Eine viel niedrigere Cache-Trefferquote bedeutet, dass Sie Ihre Instanz skalieren sollten, damit Ihre Anwendung von den Vorteilen von Redis profitieren kann. Informationen zum Anpassen der maxmemory-gb-Konfiguration finden Sie unter Redis-Instanzen konfigurieren.

Instanz vertikal skalieren

Folgen Sie der Anleitung unter Redis-Instanzen skalieren, um die Instanzkapazität zu erhöhen.

Beispiel für die maximale Speicherskalierung:

Wenn Sie eine 10-GB-Instanz haben und maxmemory-gb auf 8 GB festgelegt ist, haben Sie 8 GB zum Speichern von Schlüsseln und 2 GB Arbeitsspeicheraufwand. Wenn Sie die Instanz auf 20 GB skalieren, wird maxmemory-gb auf 16 GB skaliert. Daher verfügt Ihre Instanz jetzt über 16 GB Arbeitsspeicher zum Speichern von Schlüsseln und über 4 GB Arbeitsspeicheraufwand. Unter Redis-Instanzen skalieren finden Sie eine Anleitung zum Vergrößern oder Verkleinern der Instanz.

Passende Bereinigungsrichtlinie auswählen

Wenn Sie flüchtige Daten speichern, wählen Sie eine der volatile-* Bereinigungsrichtlinien aus. Wenn Sie nichtflüchtige Daten speichern, wählen Sie eine der allkeys-*-Richtlinien aus.

Schlüssel manuell aus Ihrer Instanz löschen

Sie können den Arbeitsspeicher verbessern, indem Sie Schlüssel manuell aus der Instanz löschen. Dies ist eine temporäre Lösung, mit der Sie den Zustand Ihrer Instanz verbessern können.