Bonnes pratiques pour gérer la mémoire

Une instance Memorystore pour Redis, si elle n'est pas correctement gérée et configurée, peut connaître une pression de mémoire susceptible d'affecter les performances de l'application. Cette page décrit les bonnes pratiques que vous pouvez appliquer pour gérer efficacement l'utilisation de la mémoire de votre instance.

Thèmes abordés dans cette rubrique :

Concepts de gestion de la mémoire

Cette section présente les concepts que vous devez comprendre pour gérer l'utilisation de la mémoire de votre instance.

Capacité de l'instance

  • La capacité de l'instance correspond à la quantité de mémoire que vous provisionnez en gigaoctets (Go) et à ce qui vous est facturé. Pour en savoir plus sur la sélection de la capacité d'instance appropriée, consultez la section Redimensionner votre instance Memorystore.

Configuration de mémoire maximale

  • La configuration de Maxmemory Redis vous permet de définir la limite de mémoire à laquelle votre règle d'éviction prend effet. Memorystore pour Redis désigne cette configuration comme maxmemory-gb. Lorsque vous créez une instance, la valeur de maxmemory-gb est définie sur la capacité de l'instance. Selon la métrique du taux d'utilisation de la mémoire système, vous devrez peut-être réduire la limite maxmemory-gb pour fournir une surcharge de mémoire pour les pics de charge de travail.

    Pour en savoir plus, consultez l'article Gérer le taux d'utilisation de la mémoire système.

    Pour savoir comment ajuster maxmemory-gb, consultez la section Configurer des instances Redis.

Taux d'utilisation de la mémoire système

  • La métrique Taux d'utilisation de la mémoire système vous permet de mesurer l'utilisation de la mémoire d'une instance par rapport à la mémoire système. La mémoire système est gérée automatiquement par Memorystore pour gérer les pics d'utilisation de la mémoire dus aux opérations consommant beaucoup de mémoire et à la fragmentation de la mémoire, ce qui est courant dans Redis Open Source.

    Si la métrique du taux d'utilisation de la mémoire système dépasse 80 %, cela signifie que l'instance est sous pression et que vous devez suivre les instructions de la section Gérer votre taux d'utilisation de la mémoire système. Si vous n'intervenez pas et que votre utilisation de la mémoire continue d'augmenter, vous risquez un plantage de l'instance en raison d'une mémoire insuffisante. Votre métrique de taux d'utilisation de la mémoire système peut dépasser 80 % en raison de la fragmentation de la mémoire. Si la métrique augmente rapidement à 80 % ou plus, vous avez peut-être utilisé l'une des opérations nécessitant beaucoup de mémoire.

    Le taux d'utilisation de la mémoire système doit être inférieur ou égal à 50% lors des mises à jour de maintenance. De plus, l'exportation nécessite parfois un taux d'utilisation de la mémoire système inférieur ou égal à 50 %.

Mémoire utilisée

  • La métrique mémoire utilisée indique la quantité de données présentes dans votre instance Memorystore. La mémoire utilisée d'une instance peut atteindre la limite de configuration maxmemory-gb. Lorsque la mémoire utilisée dépasse votre limite maxmemory-gb, votre règle d'éviction prend effet.

Règles d'éviction

  • Les règles d'éviction de votre instance (également appelées règles de mémoire maximale) déterminent la manière dont Redis évince les clés lorsque vos données d'instance atteignent la limite maxmemory-gb. Redis supprime les clés dans le cadre d'une utilisation normale du cache. L'éviction de clés s'effectue en arrière-plan. Par conséquent, les clés ne sont pas supprimées immédiatement après que la limite maxmemory-gb est atteinte. Un taux d'écriture élevé peut dépasser le délai d'éviction de clé, ce qui entraîne une condition de mémoire insuffisante.

    La règle d'éviction par défaut d'une instance Memorystore est volatile-lru. Si vous utilisez une règle d'éviction volatile-*, assurez-vous de définir des valeurs TTL sur les clés que vous souhaitez expirer, sinon Redis n'a aucune clé à évincer.

    Pour obtenir la liste des règles d'éviction, consultez la page Règles de mémoire maximale.

    Pour savoir comment modifier votre règle d'éviction, consultez la page Configurer des instances Redis.

Fractionnement de la mémoire

  • La fragmentation de la mémoire peut provoquer un manque de mémoire de votre instance Memorystore, même lorsque le ratio mémoire utilisée/maxmemory-gb est faible. La fragmentation de la mémoire se produit lorsque le système d'exploitation alloue des pages de mémoire que Redis ne peut pas utiliser pleinement après des opérations d'écriture et de suppression répétées. L'accumulation de ces pages peut entraîner un manque de mémoire du système et, à terme, provoquer le plantage du serveur Redis. La configuration Redis activedefrag peut vous aider à réduire la fragmentation.

Défragmentation active

  • Les versions 4.0 et ultérieures de Redis fournissent une configuration activedefrag. Si possible, vous devez créer votre instance Memorystore à l'aide de Redis 4.0. Memorystore définit activedefrag sur "non" par défaut. La définition de activedefrag sur "oui" s'accompagne d'un compromis entre les processeurs, mais elle permet d'atténuer la fragmentation de la mémoire qui contribue aux problèmes de mémoire insuffisante.

    Si la métrique du taux d'utilisation de la mémoire système indique une fragmentation de la mémoire, vous devez activer activedefrag. Sinon, activedefrag reste un paramètre facultatif.

Opérations nécessitant beaucoup de mémoire

Les opérations suivantes consomment beaucoup de mémoire, en particulier lorsqu'elles sont exécutées conjointement avec un taux d'écriture élevé :

Opération d'exportation

La fonctionnalité d'exportation de Memorystore fait appel à l'opération Redis BGSAVE, qui utilise la copie sur écriture. Selon la taille des données, du volume d'écriture et des clés traitées, la mémoire requise pour une exportation peut doubler la taille de l'espace occupé par vos données. Par conséquent, pour que les exportations réussissent, vous devrez peut-être réduire la limite maxmemory-gb de capacité de votre instance à 50 % lors des exportations.

Opérations de scaling et de mise à niveau des versions

Le scaling ou la mise à niveau pendant les périodes de forte charge d'écriture peuvent mettre de la pression sur votre instance en raison d'une surcharge de mémoire due à la réplication. De plus, une charge de lecture élevée peut augmenter la taille du tampon de sortie de Redis, ce qui entraîne une augmentation de la pression sur la mémoire. Si une opération de scaling ou de mise à niveau échoue en raison de la pression de la mémoire, vous devez:

  • Réduire la valeur maxmemory-gb de la capacité de votre instance à 50 % avant une opération de scaling/mise à niveau. Si possible, vous devez également réduire la mémoire maximale pendant les périodes de faible trafic d'instance afin d'atténuer l'impact négatif de la réduction de la mémoire maximale sur votre taux d'accès au cache.
  • Effectuer un scaling/une mise à niveau pendant les périodes de faible charge en écriture.

Maintenance

La maintenance ajoute également une pression de mémoire à votre instance. Vous devez prendre des mesures pour que la métrique de taux d'utilisation de la mémoire système soit inférieure ou égale à 50% au moment de la maintenance planifiée. Pour ce faire, vous pouvez planifier l'intervalle pendant une période de faible trafic sur l'instance, ou augmenter temporairement la taille de votre instance pendant l'intervalle de maintenance afin que le taux d'utilisation de la mémoire système reste inférieur ou égal à 50 %.

Surveiller l'utilisation de la mémoire de votre instance

Surveillez les métriques et définissez les alertes décrites dans cette section. Ces métriques et alertes vous donnent un aperçu de l'utilisation de la mémoire de votre instance. Pour savoir comment afficher des métriques et définir des alertes, consultez la page Surveiller des instances Redis.

Métrique Adresse complète de la métrique
Mémoire maximale redis.googleapis.com/stats/memory/maxmemory
Utilisation de la mémoire redis.googleapis.com/stats/memory/usage
Taux d'utilisation de la mémoire redis.googleapis.com/stats/memory/usage_ratio
Durée de surcharge de la mémoire système redis.googleapis.com/stats/memory/system_memory_overload_duration
Taux d'utilisation de la mémoire système redis.googleapis.com/stats/memory/system_memory_usage_ratio
Taux d'accès au cache redis.googleapis.com/stats/memory/cache_hit_ratio
Clés pouvant expirer redis.googleapis.com/keyspace/keys_with_expiration
Clés expirées redis.googleapis.com/stats/expired_keys
Clés évincées redis.googleapis.com/stats/evicted_keys

Taux d'utilisation de la mémoire

La métrique Taux d'utilisation de la mémoire indique dans quelle mesure la taille de votre ensemble de travail est proche de la limite maxmemory-gb. Sauf si la règle d'éviction est définie sur "Aucune éviction", les données d'instance atteignant la mémoire maximale n'indiquent pas toujours un problème. Cependant, l'éviction de clé est un processus en arrière-plan qui prend du temps. Si votre taux d'écriture est élevé, vous risquez de manquer de mémoire avant que Redis n'ait le temps d'évincer les clés pour libérer de l'espace.

Taux d'utilisation de la mémoire système

Le taux d'utilisation de la mémoire système est une métrique essentielle à surveiller. Pour vous assurer que l'instance dispose de suffisamment de mémoire pour traiter votre charge de travail et d'autres opérations nécessitant beaucoup de mémoire, il est important de toujours disposer de suffisamment de mémoire système.

Définissez une alerte pour vous avertir si le taux d'utilisation de la mémoire système atteint 80 %. S'il atteint 80 %, vous devez commencer à surveiller de plus près la métrique du taux d'utilisation de la mémoire système. Si le taux d'utilisation de la mémoire système continue d'augmenter considérablement, vous devez activer activedefrag, réduire la mémoire maximale et envisager un scaling de votre instance.

Une fois que le taux d'utilisation de la mémoire système atteint 100 %, toute opération qui augmente encore l'empreinte mémoire de votre instance est bloquée et Redis renvoie l'erreur suivante :

-OOM command not allowed under OOM prevention.

Pour en savoir plus, consultez la section Gérer votre taux d'utilisation de la mémoire système.

Durée de surcharge de la mémoire système

Si votre utilisation de la mémoire est trop élevée, Memorystore bloque les écritures sur votre instance pour garantir son bon fonctionnement. La durée de surcharge de la mémoire système suit la durée pendant laquelle votre instance est bloquée.

Vous devez définir une alerte pour cette métrique afin de savoir quand vos écritures sont bloquées pour votre instance. Vous pouvez également vous reporter à cette métrique pour résoudre les problèmes de réception de l'erreur -OOM command not allowed under OOM prevention..

Taux d'accès au cache

Vous devez surveiller régulièrement votre taux d'accès au cache afin de connaître le pourcentage de recherches de clés renvoyées par les clés de votre instance Redis. En règle générale, un taux d'accès au cache plus élevé est préférable à un taux d'accès au cache inférieur. Vous devez noter votre taux d'accès au cache avant d'apporter des modifications de configuration importantes, telles que l'ajustement de la limite maxmemory-gb, la modification de votre règle d'éviction ou le scaling de votre instance. Ensuite, après avoir modifié votre instance, vérifiez à nouveau le taux d'accès au cache pour voir l'impact de votre modification sur cette métrique.

Clés pouvant expirer et clés expirées

La métrique Stackdriver Clés pouvant expirer surveille le nombre de clés définies pour l'expiration. Si aucune clé ne peut expirer, cela peut indiquer que vous ne définissez pas de valeur TTL sur les clés. Dans ce cas, lorsque vos données d'instance atteignent la limite maxmemory-gb, aucune clé à évincer ne peut entraîner une condition de mémoire insuffisante si vous utilisez une règle d'éviction volatile-*.

Vous pouvez également surveiller la métrique Clés expirées. Si la métrique affiche de nombreuses clés expirées, mais que la pression sur la mémoire persiste sur votre instance, vous devez réduire la valeur maxmemory-gb.

Résoudre une condition de mémoire insuffisante

Voici quelques bonnes pratiques à suivre si votre instance subit une pression de mémoire ou rencontre des erreurs de mémoire insuffisante.

  1. Si vous utilisez une règle d'éviction volatile-*, assurez-vous de définir des TTL sur les clés que vous souhaitez expirer. Pour en savoir plus, consultez les Règles d'éviction.

  2. Pour les instances exécutant les versions 4.0 et ultérieures de Redis :

    1. Activez activedefrag pour votre instance. Pour en savoir plus, consultez la section Activer la défragmentation.
  3. Découvrez comment utiliser les métriques pour résoudre les problèmes de mémoire et obtenir des informations sur l'utilisation de la mémoire de votre instance : Surveiller l'utilisation de la mémoire de votre instance, Gérer le taux d'utilisation de la mémoire système.

  4. Apprenez à ajuster la mémoire maximale lors de l'exécution d'opérations nécessitant beaucoup de mémoire.

  5. Si la métrique Taux d'utilisation de la mémoire système dépasse 80 %, réduisez la limite maxmemory-gb de votre instance. Pour en savoir plus, consultez la section Gérer votre taux d'utilisation de la mémoire système.

  6. Envisagez d'effectuer un scaling à la hausse de la capacité de votre instance.

  7. Si vous rencontrez toujours des conditions OOM, contactez l'assistance Google Cloud Platform.

Redimensionner votre instance Memorystore

Cette section aborde trois approches distinctes qui vous permettent de dimensionner correctement votre instance en fonction de votre charge de travail :

Déterminer la taille initiale d'une instance Memorystore

Tout d'abord, vous devez choisir une instance de niveau standard ou de base. Pour en savoir plus sur les niveaux Memorystore pour Redis, consultez la page Fonctionnalités de niveau Redis. Une fois que vous avez sélectionné le niveau approprié pour votre application, procédez comme suit pour déterminer la taille d'instance dont vous avez besoin :

  1. Déterminez la taille de vos données.

    • Estimez le nombre et la taille moyenne des clés que votre application va écrire sur votre instance Redis. Multipliez ces valeurs pour obtenir une estimation approximative de la taille de l'instance dont vous avez besoin.
  2. Choisissez une règle d'éviction.

    • Si vous utilisez la règle de mémoire maximale noeviction, la taille de votre instance doit être suffisamment grande pour contenir votre charge de travail maximale et votre ensemble de travail. Si vous manquez de mémoire avec cette règle de mémoire maximale, votre instance peut entrer dans une condition de mémoire insuffisante.
    • Les autres règles d'éviction n'influencent pas la taille de l'instance que vous devez provisionner.
  3. Provisionner de la mémoire supplémentaire pour les instances de niveau standard

    • Contrairement aux instances de niveau de base, les instances de niveau standard réservent 10 % de leur capacité en tant que tampon de réplication. Si vous choisissez une instance de niveau standard, assurez-vous d'appliquer l'estimation des données indiquée à l'étape 1 et de provisionner 10% supplémentaires pour le tampon de réplication.
  4. Estimer votre taux d'écriture moyen et maximal

    • Si possible, estimez le taux d'écriture et la taille des clés utilisées par votre application. Le taux d'écriture par rapport au taux de suppression de clé détermine la vitesse de croissance de votre instance au fil du temps.
  5. Effectuez un scaling à la hausse pour atteindre le taux d'accès au cache souhaité

    • Surveillez le taux d'accès au cache. Si vous n'obtenez pas autant de réussites d'accès au cache que vous le souhaitez, vous devez augmenter la taille de votre instance ou vous assurer que votre application écrit les clés de votre instance Memorystore qui sont demandées et non traitées.

Déterminer si votre instance bloque les écritures en raison d'une condition de mémoire insuffisante

Si vous obtenez l'erreur suivante :

-OOM command not allowed under OOM prevention.

Vérifiez si :

  1. la métrique de taux d'utilisation de la mémoire système a dépassé 80 % juste avant que l'instance ne commence à rencontrer des problèmes ;
  2. le taux d'utilisation de la mémoire système a augmenté très rapidement avant l'apparition des problèmes sur votre instance.
  3. La métrique de durée de surcharge de la mémoire système affiche des valeurs supérieures à zéro au cours de la période pendant laquelle des écritures ont été bloquées.

Si c'est le cas, cela signifie probablement que l'instance bloque les écritures en raison d'une condition de mémoire insuffisante.

Gérer le taux d'utilisation de la mémoire système

Définissez une alerte pour vous avertir si la métrique Taux d'utilisation de la mémoire système dépasse 80 %. Si le taux d'utilisation de la mémoire système dépasse 80 %, vous devez prendre les mesures appropriées pour que l'instance ne manque pas de mémoire. En fonction du volume d'écriture et du modèle d'accès à la clé, l'utilisation de la mémoire système peut augmenter rapidement jusqu'à 100 %. Memorystore propose les méthodes suivantes pour gérer le taux d'utilisation de la mémoire système :

  • Activez activedefrag pour les instances exécutant les versions 4.0 et ultérieures de Redis.
  • Réduisez la limite maxmemory-gb de votre instance.
  • Effectuez un scaling à la hausse de l'instance.
  • Choisissez la règle d'éviction appropriée.
  • Définissez des valeurs TTL sur les clés volatiles.
  • Supprimez manuellement les clés de votre instance.

Activer activedefrag

Si le taux d'utilisation de la mémoire système dépasse 80 %, activez activedefrag (pour les instances exécutant les versions 4.0 et ultérieures de Redis). La défragmentation peut prendre plusieurs heures pour libérer la mémoire fragmentée. Si le trafic d'écriture est élevé, la défragmentation seule peut ne pas suffire à empêcher l'instance de manquer de mémoire. Par conséquent, vous devrez peut-être mettre en œuvre les recommandations suivantes :

Réduire la limite maximale de mémoire de votre instance

Si le taux d'utilisation de la mémoire système dépasse 80 %, vous devez réduire la valeur maxmemory-gb. Commencez par examiner l'évolution du taux d'utilisation de la mémoire système pour déterminer la nouvelle limite maxmemory-gb à définir.

Scénario 1 : le taux d'utilisation de la mémoire système a augmenté progressivement et lentement. La fragmentation est vraisemblablement un problème, et vous devez réduire la valeur maxmemory-gb par petits incréments jusqu'à ce que le taux d'utilisation de la mémoire système soit inférieur à 80 %.

Scénario 2 : le taux d'utilisation de la mémoire système a rapidement augmenté et vous constatez une charge en écriture importante sur votre instance. Une opération nécessitant beaucoup de mémoire a probablement provoqué le pic. Dans ce cas, vous devez réduire la limite maxmemory-gb par incréments plus importants pour vous assurer que l'instance évite d'entrer dans une condition de mémoire insuffisante ou récupère d'une condition de mémoire insuffisante. Notez que la réduction de la mémoire maximale peut réduire le taux d'accès au cache de vos instances. Un taux d'accès au cache beaucoup plus faible indique que vous devez faire évoluer votre instance à la hausse afin que votre application puisse profiter des avantages liés à l'utilisation de Redis. Pour savoir comment ajuster la configuration maxmemory-gb, consultez la section Configurer des instances Redis.

Effectuer un scaling à la hausse de votre instance

Suivez les instructions de la section Effectuer un scaling des instances Redis pour augmenter la capacité de votre instance.

Exemple de scaling Maxmemory :

Si vous disposez d'une instance de 10 Go avec maxmemory-gb défini sur 8 Go, vous disposez de 8 Go pour le stockage des clés et de 2 Go de mémoire. Si vous faites évoluer l'instance à 20 Go, maxmemory-gb passe à 16 Go. Votre instance dispose donc maintenant de 16 Go de mémoire pour le stockage des clés et de 4 Go de surcharge. Consultez la section Effectuer un scaling des instances Redis pour savoir comment augmenter ou diminuer la taille de votre instance.

Choisir la règle d'éviction appropriée

Si vous stockez des données volatiles, choisissez l'une des volatile-* règles d'éviction. Si vous stockez des données non volatiles, choisissez l'une des règles allkeys-*.

Supprimer manuellement des clés de votre instance

Vous pouvez améliorer les conditions de mémoire insuffisante en supprimant manuellement les clés de votre instance. Il s'agit d'une solution temporaire qui vous aide à améliorer l'état de l'instance.