Pourquoi l'utilisation de la mémoire est-elle élevée ou croissante dans mon cluster ElastiCache ?

Dernière mise à jour : 15/09/2022

Je constate une utilisation élevée ou croissante de la mémoire dans mon cluster Amazon ElastiCache. Comment l'utilisation de la mémoire est-elle déterminée sur les nœuds de cluster ElastiCache ?

Solution

Pour déterminer l'utilisation globale de la mémoire sur votre cluster et ses nœuds, consultez ces métriques Redis. Ces métriques sont publiées dans Amazon CloudWatch pour chaque nœud d'un cluster :

  • BytesUsedForCache : le nombre total d'octets alloués par Redis pour les jeux de données, les tampons, etc. Cette métrique est dérivée de la sortie de la commande INFO d'un nœud Redis. Utilisez cette métrique pour déterminer l'utilisation de la mémoire de votre cluster.
  • FreeableMemory : cette métrique au niveau de l'hôte indique la quantité de mémoire libre disponible sur l'hôte. Lorsque l'utilisation de la mémoire augmente en raison des données du cache ou de la surcharge, vous pouvez constater une diminution de la métrique FreeableMemory. Une diminution de la métrique FreeableMemory suggère une faible quantité de mémoire libre sur l'hôte. Un échange peut se produire si la métrique FreeableMemory est trop faible.
  • DataBaseMemoryUsagePercentage : cette métrique est dérivée de la sortie de la commande INFO de Redis. Il s'agit du pourcentage de mémoire utilisé par le nœud de cluster. Redis lance la politique d'expulsion de la mémoire maximale de Redis lorsque cette métrique atteint 100 % du seuil.

N'oubliez pas que par défaut, ElastiCache for Redis réserve 25 % de la mémoire maximale pour les utilisations autres que les données, telles que le basculement et la sauvegarde. Si vous ne spécifiez pas suffisamment de mémoire réservée pour une utilisation autre que les données, le risque d’échange augmente. Pour plus d'informations, consultez la section Gestion de la mémoire réservée.

Causes de l'utilisation soudaine de la mémoire

  • Clés récemment ajoutées : l'ajout de nouvelles paires clé-valeur entraîne une augmentation de l'utilisation de la mémoire. L'ajout d'éléments sur des clés existantes augmente également l'utilisation de la mémoire. Vérifiez la métrique SetTypeCmds pour déterminer s'il existe des modifications récentes des données sur le nœud. Cette métrique journalise le nombre total de commandes de type d'écriture et est dérivée de la statistique Redis commandstats.
  • Augmentation de l'utilisation de lamémoire tampon : les clients sont connectés à Redis via le réseau. Si le client ne lit pas le cache assez rapidement, Redis conserve les données de réponse dans un espace mémoire appelé tampon de sortie client. Le client peut continuer à lire à partir de l'espace tampon. Cela est également vrai pour les clients Pub et Sub si les clients abonnés ne lisent pas assez vite.
    En cas de goulot d'étranglement dans la bande passante du réseau ou si le cluster est continuellement soumis à une charge importante, l'utilisation de la mémoire tampon peut continuer à s'accumuler. Cette accumulation entraîne un épuisement de la mémoire et une dégradation des performances. Par défaut, ElastiCache for Redis ne limite pas la croissance du tampon de sortie et chacun des clients dispose de son propre tampon. Utilisez la commande client-list pour vérifier l'utilisation de la mémoire tampon.
  • Grand nombre de nouvelles connexions : un grand nombre de nouvelles connexions peut augmenter l'utilisation de la mémoire. Toutes les nouvelles connexions créent un descripteur de fichier qui consomme de la mémoire. La consommation de mémoire globale avec un grand nombre de nouvelles connexions peut être élevée, ce qui peut entraîner une expulsion des données ou des erreurs OOM. Vérifiez la métrique NewConnections pour connaître le nombre total de nouvelles connexions acceptées.
  • Utilisation élevée d’échange : Il est normal de constater une certaine utilisation de l'échange sur un nœud de cache lorsqu'il y a de la mémoire libre. Cependant, une utilisation trop importante de l’échange peut entraîner des problèmes de performances. L’échange élevé commence généralement à se produire dans un nœud qui fonctionne sous pression de mémoire, ce qui entraîne une faible mémoire libérable. Utilisez la métrique SwapUsage pour surveiller l’échange sur l'hôte.
  • Fragmentation élevée de la mémoire : Une fragmentation élevée de la mémoire indique des inefficacités dans la gestion de la mémoire au sein du système d'exploitation. Redis peut ne pas libérer de mémoire lorsque les clés sont retirées. Utilisez la métrique MemoryFragmentationRatio pour surveiller le taux de fragmentation. Si vous rencontrez des problèmes de fragmentation, activez le paramètre activedefrag pour la défragmentation de la mémoire active.
  • Big keys : Une clé contenant une grande taille de données ou un grand nombre d'éléments est appelée « big key». Vous pouvez constater une utilisation élevée de la mémoire en raison de la clé big key, même si la métrique CurrItems reste faible. Pour détecter les big keys dans votre jeu de données, utilisez la commande redis-cli --bigkeys.

Meilleures pratiques pour contrôler l'utilisation élevée de la mémoire

  • Utilisation de la valeur TTL sur les clés: vous pouvez spécifier la valeur TTL sur les clés pour l'expiration. En procédant ainsi, vous supprimez les clés après leur expiration sans attendre la pression de la mémoire. Cela évite d'encombrer Redis avec des clés inutiles. Un petit nombre d'expulsions n'est pas un problème, mais un nombre élevé d'expulsions signifie que votre nœud fonctionne sous pression de mémoire.
  • Utilisation de la politique d'expulsion : lorsque la mémoire cache commence à se remplir, Redis expulse les clés pour libérer de l'espace en fonction de la politique maxmemory-policy. La politique maxmemory-policy par défaut est définie sur volatile_lru. Il est recommandé de choisir une politique d'expulsion adaptée aux besoins de votre charge de travail.
  • Allocation de la mémoire réservée : pour éviter les problèmes lors du basculement ou de la sauvegarde, il est recommandé de définir reserved_memory_percentage sur au moins 25 % pour les utilisations autres que les données. S'il n'y a pas assez de mémoire réservée pour effectuer un basculement ou une sauvegarde, des problèmes d’échange et de performance se produisent.
  • Utilisation de la mise en commun des connexions : La mise en commun des connexions permet de contrôler le nombre élevé de nouvelles connexions tentées par le client Redis. Consultez les directives de bonnes pratiques d'AWS pour gérer un grand nombre de nouvelles connexions.
  • Ajustement des limites de taille du tampon de sortie : vous pouvez ajuster la limite du tampon de sortie pour contrôler l'utilisation de l'espace tampon. Les groupes de paramètres ElastiCache for Redis fournissent plusieurs paramètres commençant par client-output-buffer-limit-* pour éviter une croissance illimitée de l'utilisation du tampon de sortie client. Sachez qu'aucune limite n'est suggérée pour ces paramètres, car chaque charge de travail est unique. Il est recommandé de comparer votre charge de travail afin de pouvoir choisir une valeur appropriée.
  • Considération de l’utilisation du mappage de hachage : dans Redis, l'empreinte mémoire totale de la base de données est linéaire. Elle consomme plus de mémoire avec moins de clés individuelles qu'une seule clé mappée avec moins de champs. Le mappage de hachage est utile pour les structures de données comportant un grand nombre de clés. En plus du mappage de hachage, vous pouvez tirer parti du codage ziplist, qui réduit l'empreinte mémoire par rapport aux tables de hachage. Notez que l'utilisation du mappage de hachage peut entraîner un pic d'utilisation du moteur Redis, car il s'agit d'une commande complexe qui nécessite plus de processeur que les opérations définies.
  • Mise à l'échelle du cluster : vous pouvez parfois ressentir une pression de mémoire après avoir pris les précautions nécessaires. Si cela se produit et si l'utilisation est due à la charge de travail attendue, envisagez d'effectuer une mise à l'échelle appropriée pour réduire le goulot d'étranglement de la mémoire.
  • Réglez une alarme pour l'utilisation de la mémoire. Vous pouvez utiliser les alarmes CloudWatch pour déclencher une alarme lorsque l'utilisation de la mémoire dépasse un seuil prédéfini. Utilisez la métrique BytesUsedForCache ou DatabaseMemoryUsagePercentage pour créer une alarme à partir de la console CloudWatch à des fins de surveillance et de mise à l'échelle.