Optimizarea Memoriei în Redis: Înțelegerea mem_fragmentation_ratio, MEMORY USAGE și listpack în Redis & In-Memory Data Store

Ghid complet pentru analiza consumului de RAM în Redis: interpretarea raportului de fragmentare a memoriei, compactarea automată cu activedefrag și trecerea de la ziplist la listpack în Redis 7.

Sintaxă comandă
MEMORY USAGE key | MEMORY DOCTOR | CONFIG SET activedefrag yes | INFO memory

Memoria RAM este cea mai prețioasă și scumpă resursă dintr-un cluster Redis. În producție, este frecvent întâlnită situația în care comanda INFO memory arată o discrepanță majoră între memoria efectiv ocupată de date (used_memory) și memoria alocată de sistemul de operare pentru procesul Redis (used_memory_rss). Raportul dintre cele două este mem_fragmentation_ratio.

Interpretarea Metricilor de Memorie din INFO memory
# Rulăm comanda de diagnostic:
INFO memory

# Parametri esențiali de urmărit:
# used_memory: 2147483648 (2.0 GB - datele efective)
# used_memory_rss: 4294967296 (4.0 GB - memoria solicitată de la Linux)
# mem_fragmentation_ratio: 2.00

# GHID DE INTERPRETARE PENTRU mem_fragmentation_ratio:
# 1.0 - 1.3: SĂNĂTOS. Fragmentare minimă normală a alocatorului Jemalloc.
# > 1.5: FRAGMENTARE CRITICĂ. Procesul ocupă mult mai mult RAM decât datele sale.
#        Alocatorul păstrează pagini de memorie parțial goale returnate de chei șterse.
# < 1.0: PERICOL FATAL DE SWAP! Sistemul de operare mută memoria Redis pe disc (swap),
#        ceea ce distruge complet performanța (latențele cresc de la microsecunde la secunde).

Defragmentarea Activă a Memoriei (Active Defragmentation)

Dacă folosiți alocatorul standard Jemalloc, Redis poate compacta memoria fragmentată în fundal, fără timpi de oprire și fără restart:

# Activarea defragmentării dinamice la cald:
CONFIG SET activedefrag yes

# Setarea pragului minim de fragmentare la care pornește procesul:
CONFIG SET active-defrag-ignore-bytes 100mb
CONFIG SET active-defrag-threshold-lower 10

Evoluția de la ziplist la listpack în Redis 7

Caracteristică Vechiul format ziplist Noul format listpack (Redis 7+)
Structură internă Stochează lungimea intrării anterioare pentru parcurgere inversă. Stochează doar lungimea intrării curente la sfârșitul fiecărui element.
Vulnerabilitate Cascading Updates Dacă o valoare crește și trece de 254 de octeți, toate intrările următoare trebuie re-alocate în lanț ($O(N^2)$ blocaje). Eliminat complet. Modificarea unui element nu afectează niciodată dimensiunea metadatelor elementelor vecine.