Maison  >  Article  >  base de données  >  Comment nettoyer les fragments de mémoire Redis

Comment nettoyer les fragments de mémoire Redis

WBOY
WBOYavant
2023-05-26 13:18:331364parcourir

Qu'est-ce que la fragmentation de la mémoire Redis ?

La quantité totale d'espace restant dans le système d'exploitation est suffisante, mais lors de la demande d'un espace avec une adresse continue de N octets, il n'y a pas d'espace continu de N octets dans l'espace mémoire restant. Ensuite, parmi les espaces mémoire restants. , il n'y a pas d'espaces continus de moins de N octets. L'espace mémoire est une fragmentation de la mémoire.

Comment se forme la fragmentation de la mémoire Redis ?

Il existe des raisons internes et externes à la formation de fragmentation de la mémoire :

  • Raison interne : La stratégie d'allocation de l'allocateur de mémoire détermine que le système d'exploitation ne peut pas réaliser une "allocation à la demande".

    • Redis utilise libc, jemalloc et tcmalloc pour allouer de la mémoire, et jemalloc est utilisé par défaut.

    • L'allocateur de mémoire alloue l'espace mémoire selon une taille fixe, pas entièrement en fonction de la taille de mémoire demandée par l'application.

    • En prenant comme exemple jemalloc, il divise l'espace mémoire selon une série de tailles fixes, telles que 8 octets, 16 octets, 32 octets,..., 2 Ko, 4 Ko, etc. Jemalloc allouera un espace de taille fixe le plus proche de la mémoire demandée par le programme.

  • Raison externe : les paires clé-valeur sont de tailles différentes et les paires clé-valeur peuvent être modifiées et supprimées.

    • Lorsque Redis demande une allocation d'espace mémoire, pour des besoins d'espace mémoire de différentes tailles, l'allocateur de mémoire alloue l'espace mémoire selon une taille fixe. L'espace mémoire alloué est généralement plus grand que l'espace mémoire appliqué, ce qui entraînera certains problèmes. problèmes. Fragmentation de la mémoire.

    • Les paires clé-valeur seront modifiées et supprimées, ce qui entraînera une expansion et une libération de l'espace.

Comment déterminer si Redis a une fragmentation de la mémoire ?

DAS interroge les informations détaillées sur l'utilisation de la mémoire via la commande INFO fournie par Redis. La commande est la suivante :

INFO memory
# Memory
used_memory:350458970752
used_memory_human:326.39G
used_memory_rss:349066919936
used_memory_rss_human:325.09G
…
mem_fragmentation_ratio:1.00
  • used_memory : indique l'espace mémoire réellement demandé par Redis pour enregistrer les données.

  • used_memory_rss : Indique l'espace mémoire physique réellement alloué à Redis par le système d'exploitation, qui inclut les fragments d'espace mémoire.

  • mem_fragmentation_ratio fait référence au taux de fragmentation de la mémoire actuel de Redis. Formule de calcul : mem_fragmentation_ratio=used_memory_rss/used_memory

    • mem_fragmentation_ratio est supérieur ou égal à 1 mais inférieur ou égal à 1,5. Cette situation est raisonnable.

    • mem_fragmentation_ratio est supérieur à 1,5, ce qui indique que le taux de fragmentation de la mémoire a dépassé 50 %.

Comment nettoyer les fragments de mémoire ?

Une méthode "simple et grossière" consiste à redémarrer l'instance Redis. Cependant, cette méthode entraînera deux conséquences :

  • Si les données dans Redis ne sont pas conservées, les données seront perdues

  • Que les données Redis soient conservées, AOF ou RDB doivent être utilisés pour restaurer le données. Le temps de récupération dépend de la taille du fichier AOF ou RDB. Et s'il n'y a qu'une seule instance Redis, les services ne peuvent pas être fournis pendant la phase de récupération.

Alors, y a-t-il une meilleure solution ? Oui, à partir de la version 4.0-RC3, Redis lui-même fournit une méthode pour nettoyer automatiquement les fragments de mémoire.

Nettoyage automatique de la fragmentation de la mémoire

Le nettoyage de la fragmentation de la mémoire, en termes simples, signifie « se déplacer pour faire place et fusionner l'espace ».

Lorsqu'il existe des données qui divisent un espace mémoire continu en plusieurs espaces discontinus, le système d'exploitation copiera les données vers un autre endroit et l'espace mémoire discontinu d'origine deviendra un espace mémoire continu.

Mais la défragmentation a un coût. Déplacer plusieurs copies de données vers un nouvel emplacement et libérer l'espace d'origine est une tâche que le système d'exploitation doit faire, mais ce processus prend du temps. De plus, lorsque les données sont copiées, Redis sera bloqué et les performances seront réduites.

Comment atténuer ce problème ?

Redis fournit spécifiquement des paramètres pour le mécanisme de nettoyage automatique de la fragmentation de la mémoire. Vous pouvez définir des paramètres pour contrôler le moment de début et de fin du nettoyage de fragmentation, ainsi que la proportion de CPU occupée, réduisant ainsi l'impact sur les performances du nettoyage de fragmentation sur le traitement des requêtes Redis.

Tout d'abord, activez le nettoyage automatique par fragmentation de la mémoire :

config set activedefrag yes
Ensuite, définissez les conditions pour déclencher le nettoyage de la mémoire :

  • active-defrag-ignore-bytes 100mb : indique que lorsque le nombre d'octets de mémoire la fragmentation atteint 100 Mo, commencez le nettoyage ;

  • active-defrag-threshold-lower 10 : indique que lorsque l'espace de fragmentation de la mémoire représente 10 % de l'espace total alloué à Redis par le système d'exploitation, le nettoyage commencera.

Enfin, contrôlez les limites supérieure et inférieure de la proportion de temps CPU occupée par les opérations de nettoyage :

  • active-defrag-cycle-min 25 : Indique que la proportion de temps CPU utilisée par le processus de nettoyage automatique est pas moins de 25%, garantissant que le nettoyage peut être normal. Effectuer

  • active-defrag-cycle-max 75 : Indique que la proportion de temps CPU utilisée dans le processus de nettoyage automatique n'est pas supérieure à 75 %. dépasse, le nettoyage s'arrêtera, évitant ainsi qu'un grand nombre de copies mémoire bloquent Redis pendant le nettoyage, ce qui entraînera une latence de réponse accrue.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer