Perché vedo un utilizzo elevato o crescente della memoria nel mio cluster ElastiCache?

Ultimo aggiornamento: 15/09/2022

Sto riscontrando un utilizzo elevato o crescente della memoria nel mio cluster Amazon ElastiCache. Come viene determinato l'utilizzo della memoria sui nodi del cluster ElastiCache?

Risoluzione

Per determinare l'utilizzo complessivo della memoria sul cluster e sui relativi nodi, esamina questi parametri di Redis. Questi parametri sono pubblicati in Amazon CloudWatch per ogni nodo di un cluster:

  • BytesUsedForCache: il numero totale di byte allocati da Redis per set di dati, buffer e così via. Questo parametro deriva dall'output del comando INFO di un nodo Redis. Utilizza questo parametro per determinare l'utilizzo della memoria del cluster.
  • FreeableMemory: questo parametro a livello di host mostra la quantità di memoria libera disponibile sull'host. Quando l'utilizzo della memoria aumenta a causa dei dati nella cache o del sovraccarico, il parametro FreeableMemory si riduce. Una riduzione del parametro FreeableMemory suggerisce una quantità ridotta di memoria libera sull'host. Se il parametro FreeableMemory è troppo basso, potrebbe verificarsi uno scambio.
  • DataBaseMemoryUsagePercentage: questo parametro deriva dall'output del comando INFO di REDIS. Indica la percentuale di memoria utilizzata dal nodo del cluster. Redis avvia la policy di espulsione della memoria massima di Redis dopo che questo parametro raggiunge il 100% della soglia.

Per impostazione predefinita, ElastiCache per Redis riserva il 25% della memoria massima per l'utilizzo non dei dati, come failover e backup. Se non specifichi una quantità sufficiente di memoria riservata per l'utilizzo dei non dati, aumenta la possibilità di scambio. Per ulteriori informazioni, consulta Gestione della memoria riservata.

Cause di un utilizzo elevato improvviso della memoria

  • Chiavi aggiunte di recente: l'aggiunta di nuove coppie chiave-valore determina un aumento nell'utilizzo della memoria. L'aggiunta di elementi nelle chiavi esistenti aumenta anche l'utilizzo della memoria. Controlla il parametro SetTypeCmds per determinare se sono presenti modifiche recenti ai dati sul nodo. Questo parametro registra il numero totale di comandi di tipo scrittura e deriva dalla statistica commandstats di Redis.
  • Aumento nell'utilizzo del buffer: i client sono connessi a Redis tramite la rete. Se il client non legge i dati dalla cache abbastanza velocemente, Redis conserva i dati di risposta in uno spazio di memoria chiamato buffer di output del client. Il client può continuare la lettura dallo spazio del buffer. Questo vale anche per i client Pub e Sub, se i client interessati non leggono i dati abbastanza rapidamente.
    Se è presente un collo di bottiglia nella larghezza di banda della rete o se il cluster è continuamente sottoposto a carichi pesanti, l'utilizzo del buffer potrebbe continuare ad aumentare. Questo aumento provoca l'esaurimento della memoria e il peggioramento delle prestazioni. Per impostazione predefinita, ElastiCache per Redis non limita la crescita del buffer di output e ogni client dispone di un proprio buffer. Utilizza il comando client-list per controllare l'utilizzo del buffer.
  • Numero elevato di nuove connessioni: un numero elevato di nuove connessioni potrebbe aumentare l'utilizzo della memoria. Tutte le nuove connessioni creano un descrittore di file che consuma memoria. Il consumo di memoria aggregata con un numero elevato di nuove connessioni potrebbe essere elevato, con conseguente espulsione dei dati o errori OOM. Controlla il parametro NewConnections per il numero totale di nuove connessioni accettate.
  • Utilizzo elevato dello scambio: è normale assistere a un certo utilizzo dello scambio su un nodo di cache quando è disponibile memoria libera. Tuttavia, un utilizzo eccessivo dello scambio potrebbe causare problemi di prestazioni. Uno scambio elevato in genere inizia a verificarsi in un nodo in esecuzione con pressione nella memoria, con conseguente riduzione della memoria liberabile. Utilizza il parametro SwapUsage per monitorare lo scambio sull'host.
  • Elevata frammentazione della memoria: un'elevata frammentazione della memoria indica inefficienze nella gestione della memoria all'interno del sistema operativo. Redis potrebbe non liberare memoria quando le chiavi vengono rimosse. Utilizza il parametro MemoryFragmentationRatio per monitorare il rapporto di frammentazione. Se si verificano problemi di frammentazione, attiva il parametro activedefrag per la deframmentazione della memoria attiva.
  • Chiavi di grandi dimensioni: una chiave con grande dimensione di dati o un numero elevato di elementi al suo interno è definita chiave di grandi dimensioni. Potresti vedere un elevato utilizzo della memoria come risultato di una chiave di grandi dimensioni, anche se il parametro CurrItems resta basso. Per rilevare grandi chiavi nel tuo set di dati, usa il comando redis-cli --bigkeys.

Best practice per controllare l'utilizzo elevato della memoria

  • Utilizza TTL sulle chiavi: puoi specificare TTL sulle chiavi per la scadenza. In questo modo vengono rimosse le chiavi dopo la scadenza senza attendere che si verifichi pressione nella memoria. Ciò impedisce di occupare Redis con chiavi non necessarie. Un numero limitato di espulsioni non è un problema, ma un numero elevato di espulsioni significa che il nodo è in esecuzione con pressione nella memoria.
  • Utilizza la policy di espulsione: quando la memoria cache inizia a riempirsi, Redis espelle le chiavi per liberare spazio in base alla policy maxmemory-policy. La policy maxmemory-policy predefinita è impostata su volatile_lru. È consigliabile scegliere una policy di espulsione specifica per le esigenze del carico di lavoro.
  • Alloca memoria riservata: per evitare problemi durante il failover o il backup, è consigliabile impostare reserved_memory_percentage su almeno 25% per l'utilizzo dei non dati. Se la memoria riservata non è sufficiente per eseguire il failover o il backup, si verificano problemi di scambio e prestazioni.
  • Utilizza il pool di connessioni: il pool di connessioni consente di controllare un numero elevato di nuove connessioni tentate dal client Redis. Consulta le linee guida sulle best practice di AWS per la gestione di un numero elevato di nuove connessioni.
  • Regola i limiti delle dimensioni del buffer di output: puoi regolare il limite del buffer di output per controllare l'utilizzo dello spazio del buffer. I gruppi di parametri di ElastiCache per Redis forniscono diversi parametri a partire da client-output-buffer-limit-* per evitare una crescita illimitata dell'utilizzo del buffer di output del client. Non esiste un limite suggerito per questi parametri poiché ogni carico di lavoro è unico. È consigliabile eseguire il benchmark del carico di lavoro per poter scegliere un valore appropriato.
  • Prendi in considerazione l'utilizzo della mappatura hash: in Redis, l'impronta totale della memoria del DB Redis è lineare. Richiede più memoria con meno chiavi individuali rispetto a una singola chiave con mappatura hash con un numero inferiore di campi. La mappatura hash aiuta con le strutture di dati che dispongono di un numero elevato di chiavi. Oltre alla mappatura hash, puoi utilizzare la codifica ziplist, che riduce l'impronta di memoria rispetto alle tabelle hash. L'utilizzo della mappatura hash potrebbe causare un picco nell'utilizzo del motore Redis perché si tratta di un comando complesso che richiede più CPU rispetto alle operazioni impostate.
  • Dimensiona il cluster: a volte potrebbe verificarsi una pressione nella memoria dopo aver preso le precauzioni necessarie. Se ciò si verifica e se l'utilizzo è dovuto al carico di lavoro previsto, è consigliabile eseguire un dimensionamento appropriato per ridurre il collo di bottiglia della memoria.
  • Imposta un allarme per l'utilizzo della memoria. Puoi utilizzare gli allarmi CloudWatch per avviare un allarme quando l'utilizzo della memoria supera una soglia preimpostata. Utilizza il parametro BytesUsedForCache o DatabaseMemoryUsagePercentage per creare un allarme dalla console di CloudWatch per scopi di monitoraggio e dimensionamento.