Best Practices für die Arbeitsspeicherverwaltung

Eine Memorystore for Redis-Instanz kann, wenn sie nicht richtig verwaltet und konfiguriert wird, Arbeitsspeicher beanspruchen, 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 zur Speicherverwaltung

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

Instanzkapazität

  • Die Instanzkapazität ist die Größe des bereitgestellten Speichers in Gigabyte (GB) und der Gebühren, die Ihnen in Rechnung gestellt werden. Weitere Informationen zur Auswahl der richtigen Instanzkapazität finden Sie unter Größe von Memorystore-Instanzen anpassen.

Maxmemory-Konfiguration

  • Maxmemory ist eine Redis-Konfiguration, mit der Sie das Speicherlimit festlegen können, ab dem Ihre Bereinigungsrichtlinie wirksam wird. Memorystore for Redis kennzeichnet diese Konfiguration als maxmemory-gb. Wenn Sie eine Instanz erstellen, wird maxmemory-gb auf die Instanzkapazität festgelegt. Je nach Messwert für das Verhältnis der Systemspeicherauslastung müssen Sie möglicherweise das Limit von maxmemory-gb verringern, um Arbeitsspeicheraufkommen 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 Systemspeicher-Nutzungsverhältnis 80% überschreitet, bedeutet dies, dass die Instanz unter Arbeitsspeicher steht. Folgen Sie der Anleitung unter Systemspeicher-Nutzungsrate verwalten. Wenn Sie keine Maßnahmen ergreifen und Ihre Speichernutzung weiter zunimmt, können Sie aufgrund eines unzureichenden Speichers einen Absturz der Instanz riskieren. Der Messwert für die Systemspeicherauslastung kann aufgrund von Speicherfragmentierung 80% überschreiten. Wenn der Messwert schnell auf 80% oder höher ansteigt, haben Sie möglicherweise einen der speicherintensiven Vorgänge verwendet.

Genutzter Speicher

  • Der Messwert Belegter Speicher gibt an, wie viele Daten sich in Ihrer Memorystore-Instanz befinden. Der verwendete Arbeitsspeicher einer Instanz kann bis zum Konfigurationslimit maxmemory-gb erreicht werden. Wenn der verwendete Speicher Ihr maxmemory-gb-Limit überschreitet, wird die Richtlinie zur Entfernung 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. Das Löschen von Schlüsseln wird im Hintergrundprozess durchgeführt. Schlüssel werden daher nicht sofort entfernt, nachdem das Limit von maxmemory-gb erreicht wurde. Eine hohe Schreibrate kann dazu führen, dass die Schlüsselentfernung aufgehoben wird, was zu einer fehlenden Arbeitsspeicherbedingung führt.

    volatile-lru ist die Standardrichtlinie zur Entfernung einer Memorystore-Instanz. 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 Ihrer Bereinigungsrichtlinie finden Sie unter Redis-Instanzen konfigurieren.

Speicherfragmentierung

  • Speicherfragmentierung kann dazu führen, dass Ihre Memorystore-Instanz nicht genügend Arbeitsspeicher hat, auch wenn das Verhältnis von verwendetem 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. Da solche Seiten immer wieder erfasst werden können, führt dies möglicherweise zu einem Systemausfall. Die Redis-Konfiguration activedefrag kann dabei helfen, die Fragmentierung zu reduzieren.

Aktive Defragmentierung

  • Die 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". Wenn Sie activedefrag auf "yes" festlegen, kommt es zu einem CPU-Kompromiss. Sie kann jedoch helfen, die Speicherfragmentierung zu verringern, da dies zu fehlenden Speicherproblemen führt.

    Wenn der Messwert für die Speicherauslastung des Systems 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

Die Memorystore-Funktion exportieren verwendet den Redis-Vorgang BGSAVE, der "Copy-on-Write" verwendet. Abhängig von der Größe der Daten, dem Schreibvolume und den berücksichtigten Schlüsseln kann der erforderliche Speicher für einen Export doppelt so groß sein wie der belegte Speicherplatz. Für Exporte müssen Sie daher das Limit maxmemory-gb auf 50% Ihrer Instanzkapazität während des Exports verringern.

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:

  • Verringern Sie den Wert für maxmemory-gb auf 50 % der Instanzkapazität vor einem Skalierungs-/Upgradevorgang. 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.
  • Skalieren/Upgrade durchführen in Zeiten mit wenig Schreibvorgängen.

Speichernutzung Ihrer Instanz beobachten

Überwachen 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 zum Festlegen von Benachrichtigungen finden Sie unter Redis-Instanzen überwachen.

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 Arbeitsspeichernutzung gibt an, wie nahe die Größe Ihres Arbeitssatzes bis zum Limit von maxmemory-gb ist. Wenn die Bereinigungsrichtlinie nicht auf "Bereinigung" festgelegt ist, weisen die Instanzdaten, die den Höchstspeicher erreichen, nicht immer auf ein Problem hin. Die Schlüsselentfernung ist jedoch ein Hintergrundprozess, der Zeit in Anspruch nimmt. Wenn Sie eine hohe Schreibrate haben, könnten Sie genügend Arbeitsspeicher haben, bevor Redis genügend Zeit hat, Schlüssel zu entfernen.

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 Ihre 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 überwachen, 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. Überprüfen Sie dann nach der Änderung der Instanz die Cache-Trefferquote erneut, um zu sehen, wie sich Ihre Änderung auf diesen Messwert auswirkt.

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 und höher:

    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 Standardstufe oder der Basisstufe wünschen. Weitere Informationen zu den Stufen von Memorystore for Redis 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 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 Richtlinien zur Entfernung haben keinen Einfluss auf die bereitzustellende 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 folgende Fehlermeldung angezeigt wird:

-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 und höher.
  • Verringern Sie das maxmemory-gb-Limit Ihrer Instanz.
  • Skalieren Sie die Instanz vertikal.
  • Passende Bereinigungsrichtlinie auswählen
  • Legen Sie für flüchtige Schlüssel eine TTL fest.
  • Löschen Sie Schlüssel aus Ihrer Instanz manuell.

"activedefrag" aktivieren

Wenn das Verhältnis der Systemspeicherauslastung 80 % übersteigt, aktivieren Sie activedefrag für Instanzen, auf denen Redis-Version 4.0 und höher ausgeführt wird. 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 implementieren:

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 zur Systemspeicherauslastung ist stark gestiegen und Sie sehen eine erhebliche Schreiblast für Ihre Instanz. Ein speicherintensiver Vorgang hat die Spitze wahrscheinlich verursacht. In diesem Fall sollten Sie das maxmemory-gb-Limit in größeren Schritten senken, um sicherzustellen, dass die Instanz entweder keine Bedingung für nicht genügend Arbeitsspeicher eingibt oder eine Wiederherstellung aus einem Zustand ohne Arbeitsspeicher wieder herstellt. Beachten Sie, dass eine Verringerung des maximalen Speichers die Cache-Trefferquote Ihrer Instanzen verringern 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 Kapazität Ihrer Instanz zu erhöhen.

Beispiel für eine Maxmemory-Skalierung:

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 4 GB Overhead. 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 die Speicherbedingungen 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.