Best practice di gestione della memoria

Un'istanza di Memorystore for Redis, se non gestita e configurata correttamente, può subire problemi di memoria, che può influire sulle prestazioni dell'applicazione. Questa pagina descrive le best practice che puoi utilizzare per gestire in modo efficiente l'utilizzo della memoria dell'istanza.

In questo argomento:

Concetti di gestione della memoria

Questa sezione introduce i concetti da comprendere per gestire l'utilizzo della memoria dell'istanza.

Capacità istanza

  • La capacità dell'istanza è la quantità di memoria di cui esegui il provisioning in Gigabyte (GB) e l'importo che ti viene addebitato. Per ulteriori dettagli sulla selezione della giusta capacità dell'istanza, consulta Ridimensionare correttamente l'istanza Memorystore.

Configurazione massima memoria

  • Maxmemory è una configurazione Redis che ti consente di impostare il limite di memoria su cui viene applicato il criterio di rimozione. Memorystore for Redis designa questa configurazione come maxmemory-gb. Quando crei un'istanza, maxmemory-gb viene impostato sulla capacità dell'istanza. A seconda della metrica del rapporto di utilizzo della memoria del sistema, potrebbe essere necessario ridurre il limite di maxmemory-gb per fornire l'overhead di memoria per i picchi di carico di lavoro.

    Per maggiori dettagli, vedi Gestire il rapporto di utilizzo della memoria di sistema.

    Per informazioni su come modificare maxmemory-gb, vedi Configurazione delle istanze Redis.

Rapporto di utilizzo della memoria di sistema

  • La metrica Rapporto di utilizzo della memoria di sistema consente di misurare l'utilizzo della memoria di un'istanza rispetto alla memoria di sistema. La memoria di sistema viene gestita automaticamente da Memorystore per gestire i picchi di utilizzo della memoria causati da operazioni ad alta intensità di memoria e dalla frammentazione della memoria comune in Redis open source.

    Se la metrica del rapporto di utilizzo della memoria di sistema supera l'80%, significa che l'istanza è sotto pressione della memoria e devi seguire le istruzioni riportate in Gestire il rapporto di utilizzo della memoria di sistema. Se non intraprendi alcuna azione e l'utilizzo della memoria continua a crescere, rischi che l'istanza si arresti in modo anomalo a causa di una memoria insufficiente. La metrica del rapporto di utilizzo della memoria di sistema potrebbe superare l'80% a causa della frammentazione della memoria. In alternativa, se la metrica raggiunge rapidamente un picco pari o superiore all'80%, potresti aver utilizzato una delle operazioni ad alta intensità di memoria.

    Dovresti avere un rapporto di utilizzo della memoria di sistema pari o inferiore al 50% durante gli aggiornamenti di manutenzione. Inoltre, a volte l'exporting richiede un rapporto di utilizzo della memoria di sistema pari o inferiore al 50%.

Memoria utilizzata

  • La metrica Memoria utilizzata mostra la quantità di dati presenti nell'istanza di Memorystore. La memoria utilizzata di un'istanza può arrivare al limite di configurazione di maxmemory-gb. Se la memoria utilizzata supera il limite di maxmemory-gb, viene applicato il criterio di rimozione.

Norme relative all'eliminazione

  • Il criterio di rimozione dell'istanza (noto anche come criterio maxmemory) determina in che modo Redis rimuove le chiavi quando i dati dell'istanza raggiungono il limite maxmemory-gb. Redis elimina le chiavi come parte del normale caso d'uso della cache. L'eliminazione delle chiavi avviene come processo in background, pertanto le chiavi non vengono rimosse subito dopo il raggiungimento del limite maxmemory-gb. Una velocità di scrittura elevata potrebbe superare l'eliminazione della chiave, determinando una condizione di esaurimento della memoria.

    Il criterio di rimozione predefinito di un'istanza Memorystore è volatile-lru. Se utilizzi un criterio di rimozione volatile-*, assicurati di impostare i TTL sulle chiavi che vuoi far scadere, altrimenti Redis non avrà chiavi da rimuovere.

    Per un elenco dei criteri di rimozione, consulta i criteri di Maxmemory.

    Per informazioni su come modificare il criterio di rimozione, vedi Configurare le istanze Redis.

Frammentazione della memoria

  • La frammentazione della memoria può causare l'esaurimento della memoria dell'istanza Memorystore anche quando il rapporto tra memoria utilizzata e maxmemory-gb è basso. La frammentazione della memoria si verifica quando il sistema operativo alloca pagine di memoria che Redis non può utilizzare completamente dopo ripetute operazioni di scrittura ed eliminazione. L'accumulo di queste pagine può comportare l'esaurimento della memoria del sistema e l'arresto anomalo del server Redis. La configurazione Redis activedefrag può aiutare a ridurre la frammentazione.

Deframmentazione attiva

  • Le versioni Redis 4.0 e successive forniscono una configurazione activedefrag. Se possibile, devi creare l'istanza Memorystore utilizzando Redis 4.0. Memorystore imposta activedefrag su "no" per impostazione predefinita. L'impostazione di activedefrag su "yes" comporta un compromesso sulla CPU, ma può aiutare a mitigare la frammentazione della memoria, che contribuisce a problemi di esaurimento della memoria.

    Se la metrica del rapporto di utilizzo della memoria di sistema indica la frammentazione della memoria, devi attivare activedefrag. In caso contrario, activedefrag rimane un'impostazione facoltativa.

Operazioni che utilizzano molta memoria

Le seguenti operazioni utilizzano molta memoria, soprattutto se eseguite in combinazione con un'elevata velocità di scrittura:

Operazione di esportazione

La funzionalità di esportazione di Memorystore utilizza l'operazione BGSAVE di Redis, che prevede la copia su scrittura. A seconda delle dimensioni dei dati, del volume di scrittura e delle chiavi toccate, la memoria richiesta per un'esportazione può essere il doppio dello spazio occupato dai dati. Pertanto, affinché le esportazioni abbiano successo, potrebbe essere necessario ridurre il limite maxmemory-gb al 50% della capacità dell'istanza durante le esportazioni.

Operazioni di scalabilità e upgrade della versione

La scalabilità o l'upgrade durante periodi di carico di scrittura elevato può sovraccaricare la memoria dell'istanza a causa dell'overhead di memoria causato dalla replica. Inoltre, un carico di lettura elevato può aumentare le dimensioni del buffer di output di Redis, con un conseguente aumento della pressione della memoria. Se un'operazione di scalabilità o upgrade non riesce a causa della pressione della memoria, devi:

  • Riduci maxmemory-gb al 50% della capacità dell'istanza prima di un'operazione di scalabilità/upgrade. Se possibile, dovresti anche ridurre maxmemory durante periodi in cui il traffico delle istanze è ridotto, perché così facendo si riduce l'impatto negativo della riduzione di maxmemory sul rapporto di successi della cache.
  • Scala/upgrade durante i periodi in cui le scritture sono basse.

Manutenzione

La manutenzione aumenta anche la pressione della memoria per l'istanza. Devi adottare le misure necessarie affinché la metrica Rapporto di utilizzo della memoria di sistema sia pari o inferiore al 50% al momento della manutenzione pianificata. Puoi farlo pianificando per un periodo di tempo in cui il traffico dell'istanza è ridotto o facendo lo scale up temporaneo delle dimensioni dell'istanza durante il periodo di manutenzione, in modo che la metrica Rapporto di utilizzo della memoria di sistema sia al 50% o inferiore.

Monitorare l'utilizzo della memoria da parte dell'istanza

Monitora le metriche e imposta gli avvisi descritti in questa sezione. Queste metriche e questi avvisi forniscono insight sulla memoria utilizzata dall'istanza. Per scoprire come visualizzare le metriche e impostare gli avvisi, consulta Monitoraggio delle istanze Redis.

Metrica Indirizzo completo della metrica
Memoria massima redis.googleapis.com/stats/memory/maxmemory
Memoria utilizzata redis.googleapis.com/stats/memory/usage
Rapporto di utilizzo della memoria redis.googleapis.com/stats/memory/usage_ratio
Durata sovraccarico memoria di sistema redis.googleapis.com/stats/memory/system_memory_overload_duration
Rapporto di utilizzo della memoria di sistema redis.googleapis.com/stats/memory/system_memory_usage_ratio
Percentuale successi cache redis.googleapis.com/stats/memory/cache_hit_ratio
Chiavi con scadenza redis.googleapis.com/keyspace/keys_with_expiration
Chiavi scadute redis.googleapis.com/stats/expired_keys
Chiavi rimosse redis.googleapis.com/stats/evicted_keys

Rapporto di utilizzo della memoria

La metrica Rapporto di utilizzo della memoria indica quanto manca alle dimensioni del set di lavoro per raggiungere il limite di maxmemory-gb. A meno che il criterio di rimozione non sia impostato su nessuna rimozione, i dati dell'istanza che raggiungono maxmemory non indicano sempre un problema. Tuttavia, l'eliminazione è un processo in background che richiede tempo. Se hai una frequenza di scrittura elevata, potresti esaurire la memoria prima che Redis abbia il tempo di rimuovere le chiavi per liberare spazio.

Rapporto di utilizzo della memoria di sistema

Il rapporto di utilizzo della memoria di sistema è una metrica fondamentale da monitorare. Per garantire che l'istanza disponga di memoria sufficiente per supportare il carico di lavoro e altre operazioni che richiedono molta memoria, è importante avere sempre a disposizione una memoria di sistema sufficiente.

Imposta un avviso per ricevere una notifica se la metrica del rapporto di utilizzo della memoria di sistema raggiunge l'80%. Se raggiunge l'80%, devi iniziare a monitorare più da vicino la metrica del rapporto di utilizzo della memoria di sistema. Se il rapporto di utilizzo della memoria di sistema continua a crescere drasticamente, ti consigliamo di attivare la defrazione attiva, ridurre la memoria massima e valutare la scalabilità dell'istanza.

Quando il rapporto di utilizzo della memoria di sistema raggiunge il 100%, qualsiasi operazione che aumenta ulteriormente l'utilizzo della memoria dell'istanza viene bloccata e Redis restituisce il seguente errore:

-OOM command not allowed under OOM prevention.

Per ulteriori dettagli, consulta Gestire il rapporto di utilizzo della memoria di sistema.

Durata sovraccarico memoria di sistema

Se l'utilizzo della memoria è troppo elevato, Memorystore blocca le scritture sull'istanza per mantenerla integro. Durata di sovraccarico della memoria di sistema monitora per quanto tempo l'istanza rimane in stato di scrittura bloccata.

Devi impostare un avviso per questa metrica, in modo da sapere quando le operazioni di scrittura sono bloccate per la tua istanza. Inoltre, puoi fare riferimento a questa metrica per risolvere i problemi di ricezione dell'errore -OOM command not allowed under OOM prevention..

Rapporto hit dalla cache

Dovresti monitorare regolarmente il rapporto tra hit della cache in modo da sapere quale percentuale di ricerche chiave viene restituita correttamente dalle chiavi nell'istanza Redis. In generale, un rapporto più elevato di hit della cache è meglio di un rapporto più basso di hit della cache. Devi prendere nota del rapporto tra hit della cache prima di apportare modifiche di grande entità alla configurazione, come la regolazione del limite maxmemory-gb, la modifica del criterio di rimozione o la scalabilità dell'istanza. Poi, dopo aver modificato l'istanza, controlla di nuovo il rapporto tra hit della cache per vedere come la modifica ha influito su questa metrica.

Chiavi scadute e chiavi scadute

La metrica di Stackdriver chiavi espandibili monitora il numero di chiavi impostate per la scadenza. Se non esistono chiavi espandibili, potrebbe indicare che non stai impostando TTL sulle chiavi. In questi casi, quando i dati dell'istanza raggiungono il limite maxmemory-gb, non ci sono chiavi da rimuovere. Ciò può causare una condizione di esaurimento della memoria se utilizzi un criterio di rimozione volatile-*.

Un'altra metrica che puoi monitorare sono le chiavi scadute. Se la metrica mostra molti tasti scaduti, ma continui a notare una pressione di memoria per l'istanza, devi ridurre maxmemory-gb.

Risolvere una condizione di esaurimento della memoria

Di seguito sono riportate alcune best practice da seguire se l'istanza presenta pressione o errori di memoria esauriti.

  1. Se utilizzi un criterio di rimozione volatile-*, assicurati di impostare i TTL sulle chiavi che vuoi far scadere. Per ulteriori dettagli, consulta le Norme relative all'eliminazione.

  2. Per istanze che eseguono Redis 4.0 e versioni successive:

    1. Attiva activedefrag per l'istanza. Per ulteriori dettagli, consulta Deframmentazione attiva.
  3. Scopri come utilizzare le metriche per risolvere i problemi legati alle condizioni di memoria e ottenere informazioni dettagliate sull'utilizzo della memoria dell'istanza: Monitorare l'utilizzo della memoria dell'istanza, Gestire il rapporto di utilizzo della memoria di sistema.

  4. Scopri come regolare la memoria massima durante l'esecuzione di operazioni che richiedono molta memoria.

  5. Se la metrica relativa al rapporto di utilizzo della memoria di sistema supera l'80%, riduci il limite di maxmemory-gb dell'istanza. Per ulteriori dettagli, consulta Gestire il rapporto di utilizzo della memoria di sistema.

  6. Valuta la possibilità di scalare la capacità dell'istanza.

  7. Se continui a riscontrare condizioni OOM, contatta l'assistenza della piattaforma Google Cloud.

Ridimensionamento ottimale dell'istanza Memorystore

Questa sezione illustra tre approcci distinti che ti aiutano a ridimensionare l'istanza in base al tuo carico di lavoro:

Determina la dimensione iniziale di un'istanza Memorystore

Innanzitutto, devi scegliere se vuoi un'istanza del livello Standard o del livello base. Per saperne di più sui livelli di Memorystore for Redis, consulta Funzionalità dei livelli Redis. Dopo aver selezionato il livello giusto per la tua applicazione, segui questi passaggi per determinare le dimensioni dell'istanza di cui hai bisogno:

  1. Determina la dimensione dei dati.

    • Stima il numero di chiavi e le dimensioni medie delle chiavi che l'applicazione scriverà nell'istanza Redis. Moltiplica questi valori per ottenere una stima approssimativa delle dimensioni dell'istanza necessarie.
  2. Scegli un criterio di rimozione.

    • Se utilizzi il criterio noeviction maxmemory, la dimensione dell'istanza deve essere abbastanza grande da sostenere il carico di lavoro e il set di lavoro di picco. Se esaurisci la memoria con questo criterio maxmemory, l'istanza può inserire una condizione di esaurimento della memoria.
    • Altri criteri di rimozione non influiscono sulle dimensioni dell'istanza di cui devi eseguire il provisioning.
  3. Esegui il provisioning di memoria aggiuntiva per le istanze del livello Standard

    • A differenza delle istanze del livello base, quelle del livello Standard riservano il 10% della capacità dell'istanza come buffer di replica. Se scegli un'istanza di livello Standard, assicurati di eseguire la stima dei dati dal primo passaggio ed eseguire il provisioning di un 10% in più per il buffer di replica.
  4. Stimare la frequenza di scrittura media e massima

    • Se possibile, stima la frequenza di scrittura e le dimensioni delle chiavi che verranno utilizzate dall'applicazione. La frequenza di scrittura rispetto a quella di rimozione delle chiavi determina la velocità di crescita dell'istanza nel tempo.
  5. Fai lo scale up per raggiungere il rapporto di successi della cache desiderato

    • Monitora il rapporto di hit della cache e, se non riesci a ricevere tutti gli hit della cache riusciti, dovrai aumentare le dimensioni dell'istanza o assicurarti che l'applicazione scriva all'istanza Memorystore le chiavi richieste e non evase.

Determina se l'istanza blocca le scritture a causa di una condizione di esaurimento della memoria

Se visualizzi il seguente errore:

-OOM command not allowed under OOM prevention.

Verifica se:

  1. La metrica del rapporto di utilizzo della memoria di sistema superava l'80% subito prima che l'istanza iniziasse a riscontrare problemi.
  2. Il rapporto di utilizzo della memoria di sistema è cresciuto molto rapidamente prima che si verificassero problemi con l'istanza.
  3. La metrica relativa alla durata di sovraccarico della memoria di sistema ha mostrato valori superiori a zero durante lo stesso periodo in cui si sono verificate scritture bloccate.

Se sì, probabilmente indica che l'istanza sta bloccando le scritture a causa di una condizione di esaurimento della memoria.

Gestire il rapporto di utilizzo della memoria di sistema

Imposta un avviso per ricevere una notifica se la metrica Rapporto di utilizzo della memoria di sistema supera l'80%. Se il rapporto di utilizzo della memoria di sistema supera l'80%, devi intraprendere le azioni appropriate in modo che l'istanza non esaurisca la memoria. A seconda del volume di scrittura e del pattern di accesso alle chiavi, l'utilizzo della memoria di sistema può aumentare rapidamente fino al 100%. Memorystore offre i seguenti modi per gestire il rapporto di utilizzo della memoria di sistema:

  • Attiva activedefrag per le istanze che eseguono Redis 4.0 e versioni successive.
  • Riduci il limite maxmemory-gb dell'istanza.
  • Fare lo scale up dell'istanza.
  • Scegli la norma di rimozione appropriata.
  • Imposta i TTL sulle chiavi volatili.
  • Elimina manualmente le chiavi dall'istanza.

Attiva deframmentazione attiva

Se il rapporto di utilizzo della memoria di sistema supera l'80%, attiva activedefrag (per le istanze che eseguono Redis versione 4.0 e successive). La deframmentazione può richiedere ore per rilasciare memoria frammentata. Se il traffico in scrittura è elevato, la sola deframmentazione potrebbe non essere sufficiente a arrestare l'esaurimento della memoria dell'istanza. Pertanto, potrebbe essere necessario implementare i seguenti suggerimenti:

Riduci il limite massimo di memoria dell'istanza

Se il rapporto di utilizzo della memoria di sistema supera l'80%, devi ridurre maxmemory-gb, ma scopri prima come è cambiato nel tempo il rapporto di utilizzo della memoria di sistema per determinare il nuovo limite di maxmemory-gb da impostare.

Scenario 1: il rapporto di utilizzo della memoria di sistema è aumentato in modo graduale e lento. La frammentazione è un problema probabile e devi ridurre maxmemory-gb a piccoli incrementi finché il rapporto di utilizzo della memoria di sistema non si stabilizza al di sotto dell'80%.

Scenario 2: il rapporto di utilizzo della memoria di sistema ha registrato un picco rapido e noti un carico di scrittura significativo sull'istanza. È probabile che il picco sia stato causato da un'operazione che utilizza molta memoria. In questo caso, devi ridurre il limite di maxmemory-gb in incrementi maggiori per assicurarti che l'istanza eviti di inserire una condizione di esaurimento della memoria o di eseguire il ripristino da una condizione di esaurimento della memoria. Tieni presente che la riduzione di maxmemory può ridurre il rapporto tra hit della cache delle istanze. Un rapporto di successi della cache molto più basso indica che è necessario fare lo scale up dell'istanza in modo che l'applicazione possa sfruttare i vantaggi derivanti dall'utilizzo di Redis. Per scoprire come modificare la configurazione di maxmemory-gb, consulta Configurazione delle istanze Redis.

Fai lo scale up dell'istanza

Segui le istruzioni in Scalabilità delle istanze Redis per aumentare la capacità delle istanze.

Esempio di scalabilità massima della memoria:

Se hai un'istanza da 10 GB con maxmemory-gb impostato su 8 GB, hai 8 GB per archiviare le chiavi e 2 GB di overhead di memoria. Se scale l'istanza a 20 GB, maxmemory-gb viene scalato a 16 GB. Pertanto, l'istanza ora dispone di 16 GB di memoria per l'archiviazione delle chiavi e 4 GB di overhead. Consulta Scalabilità delle istanze Redis per istruzioni su come aumentare o ridurre le dimensioni dell'istanza.

Scegli le norme di rimozione appropriate

Se archivi dati volatili, scegli uno dei criteri di rimozione di volatile-*. Se stai archiviando dati non volatili, scegli uno dei criteri allkeys-*.

Elimina manualmente le chiavi dall'istanza

Puoi migliorare le condizioni di esaurimento della memoria eliminando manualmente le chiavi dalla tua istanza. Si tratta di una soluzione temporanea che ti consente di migliorare l'integrità dell'istanza.