Best practice di gestione della memoria

Mantieni tutto organizzato con le raccolte Salva e classifica i contenuti in base alle tue preferenze.

Un'istanza di Memorystore for Redis, se non gestita e configurata correttamente, può riscontrare una pressione della 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 che è necessario 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 capacità corretta dell'istanza, consulta Ridimensionare l'istanza Memorystore.

Configurazione della memoria massima

  • Maxmemory è una configurazione Redis che consente di impostare il limite di memoria in base al quale viene applicato il criterio di rimozione. Memorystore for Redis indica questa configurazione come maxmemory-gb. Quando crei un'istanza, maxmemory-gb viene impostata sulla capacità dell'istanza. A seconda della metrica del rapporto di utilizzo della memoria di sistema, potrebbe essere necessario ridurre il limite maxmemory-gb per fornire un sovraccarico di memoria per i picchi di carichi di lavoro.

    Per maggiori dettagli, consulta l'articolo Gestire il rapporto sull'utilizzo della memoria del sistema.

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

Rapporto di utilizzo della memoria di sistema

  • La metrica del rapporto di utilizzo della memoria di sistema consente di misurare l'utilizzo della memoria di un'istanza rispetto alla memoria del sistema. La memoria di sistema è gestita automaticamente da Memorystore per gestire i picchi di utilizzo della memoria causati dalle operazioni ad alta intensità di memoria e dalla frammentazione della memoria, comune nel formato open source Redis.

    Se la metrica del rapporto di utilizzo della memoria di sistema supera l'80%, significa che l'istanza è sotto pressione e devi seguire le istruzioni alla sezione Gestire il rapporto di utilizzo della memoria di sistema. Se non intervieni e l'utilizzo della memoria continua ad aumentare, corri il rischio di un arresto anomalo dell'istanza a causa di 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 massimo dell'80%, potresti aver utilizzato una delle operazioni con uso intensivo della memoria.

Memoria utilizzata

  • La metrica memoria utilizzata mostra la quantità di dati presente nell'istanza Storagestore. La memoria utilizzata di un'istanza può crescere fino al limite di configurazione maxmemory-gb. Quando la memoria utilizzata supera il limite di maxmemory-gb, viene applicato il criterio di rimozione.

Norme per l'eliminazione

  • Il criterio di rimozione dell'istanza (noto anche come criterio di memoria max) determina in che modo Redis rimuove le chiavi quando i dati dell'istanza raggiungono il limite di maxmemory-gb. Redis rimuove 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 immediatamente dopo il raggiungimento del limite di maxmemory-gb. Una frequenza di scrittura elevata potrebbe superare la rimozione delle chiavi, determinando una condizione di memoria insufficiente.

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

    Per un elenco dei criteri di rimozione, consulta i criteri per la memoria massima.

    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 operazioni di scrittura ed eliminazione ripetute. L'accumulo di tali pagine può comportare l'esaurimento della memoria del sistema e, di conseguenza, l'arresto anomalo del server Redis. La configurazione Redis activedefrag può contribuire a ridurre la frammentazione.

Deframazione 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"include un cambio di CPU, ma può contribuire a mitigare la frammentazione della memoria, che contribuisce a causare problemi di memoria.

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

Operazioni con memoria elevata

Le seguenti operazioni utilizzano memoria significativa, soprattutto se eseguite in combinazione con una frequenza di scrittura elevata:

Operazione di esportazione

La funzionalità export di Memorystore utilizza l'operazione Redis BGSAVE, che utilizza la funzionalità di copia su scrittura. A seconda delle dimensioni dei dati, del volume di scrittura e delle chiavi toccate, la memoria richiesta per un'esportazione può raddoppiare le dimensioni dello spazio occupato dai dati. Di conseguenza, durante un'esportazione, potresti dover ridurre il limite di maxmemory-gb al 50% della capacità dell'istanza.

Operazioni di scalabilità e upgrade delle versioni

Scalabilità o upgrade durante i periodi di carico elevato in scrittura può compromettere la memoria dell'istanza a causa del sovraccarico della memoria causato dalla replica. Inoltre, un caricamento elevato può aumentare le dimensioni del buffer di output di Redis, con un conseguente aumento della pressione sulla memoria. Se un'operazione di scala o upgrade non riesce a causa della pressione della memoria, devi:

  • Riduci il maxmemory-gb al 50% della capacità della tua istanza prima di eseguire un'operazione di scalabilità/upgrade. Se possibile, dovresti anche ridurre la memoria massima durante i periodi di traffico ridotto delle istanze, perché l'operazione riduce l'impatto negativo della riduzione della memoria massima sul rapporto hit cache.
  • Scalabilità/upgrade durante i periodi di scrittura scarsa.

Manutenzione

La Manutenzione aumenta anche la pressione della memoria all'istanza. Devi adottare misure in modo che la metrica del rapporto di utilizzo della memoria di sistema sia al 50% o inferiore al momento della manutenzione pianificata. Per farlo, pianifica per un'ora in cui il traffico di istanza è basso o ridimensiona temporaneamente l'istanza durante il periodo di manutenzione in modo che la metrica Rapporto di utilizzo della memoria di sistema sia pari o inferiore al 50%.

Monitora l'utilizzo della memoria dell'istanza

Monitora le metriche e imposta gli avvisi descritti in questa sezione. Queste metriche e avvisi ti forniscono informazioni sull'utilizzo della memoria della tua istanza. Per informazioni su come visualizzare le metriche e impostare gli avvisi, consulta Monitoraggio delle istanze Redis.

Metrica Indirizzo completo della metrica
Memoria max redis.googleapis.com/stats/memory/maxmemory
Utilizzo memoria redis.googleapis.com/stats/memory/usage
Rapporto utilizzo memoria redis.googleapis.com/stats/memory/usage_ratio
Durata di 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 le dimensioni del tuo set di lavoro stanno raggiungendo il limite di maxmemory-gb. A meno che il criterio di rimozione non sia impostato su Nessuna rimozione, i dati dell'istanza che raggiungono il valore massimo non indicano sempre un problema. Tuttavia, l'eliminazione delle chiavi è un processo in background che richiede del tempo. Se hai una frequenza di scrittura elevata, potresti esaurire la memoria prima che Redis sia in grado di rimuovere 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 disporre di una memoria di sistema sufficiente.

Imposta un avviso per ricevere una notifica se la metrica relativa al rapporto di utilizzo della memoria di sistema raggiunge l'80%. Se raggiunge l'80%, dovresti iniziare a monitorare con maggiore attenzione la metrica del rapporto di utilizzo della memoria di sistema. Se il rapporto di utilizzo della memoria di sistema continua ad aumentare notevolmente, devi attivare defrag attivi, 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'impatto della memoria dell'istanza e viene bloccata e Redis restituisce il seguente errore:

-OOM command not allowed under OOM prevention.

Per ulteriori dettagli, consulta la sezione Gestire il rapporto sull'utilizzo della memoria di sistema.

Durata di sovraccarico memoria di sistema

Se l'utilizzo della memoria è troppo elevato, Memorystore blocca la scrittura nell'istanza per mantenere l'istanza in stato integro. Durata del sovraccarico di memoria di sistema: monitora per quanto tempo l'istanza è in stato di scrittura bloccata.

Dovresti impostare un avviso per questa metrica per sapere quando le scritture vengono bloccate per la tua istanza. Inoltre, puoi fare riferimento a questa metrica per risolvere i problemi relativi alla ricezione dell'errore -OOM command not allowed under OOM prevention..

Rapporto cache-hit

Dovresti monitorare regolarmente il rapporto hit della cache in modo da sapere quale percentuale di ricerche di chiavi viene restituita correttamente dalle chiavi dell'istanza Redis. In linea generale, un rapporto hit da cache più elevato è migliore di un rapporto hit cache più basso. Prendi nota del rapporto hit cache prima di apportare qualsiasi modifica significativa alla configurazione, come la modifica 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 sugli hit cache per osservare l'impatto della modifica su questa metrica.

Chiavi esauribili e chiavi scadute

La metrica chiavi espirabili di Stackdriver monitora il numero di chiavi impostate per la scadenza. L'assenza di chiavi espiranti può indicare che non hai impostato TTL sulle chiavi. In questi casi, quando i dati dell'istanza raggiungono il limite maxmemory-gb, non ci sono chiavi da rimuovere, il che può determinare una condizione di memoria insufficiente.

Un'altra metrica che puoi monitorare è l'utilizzo delle chiavi scadute. Se la metrica mostra molte chiavi scadute, ma continui a riscontrare una pressione della memoria sull'istanza, dovresti ridurre maxmemory-gb.

Risolvere una condizione esaurita della memoria

Di seguito sono riportate alcune best practice che devi seguire se la tua istanza ha un problema di pressione sulla memoria o errori di memoria.

  1. Se utilizzi un criterio di rimozione volatile-*, assicurati di impostare i TTL sulle chiavi che vuoi far scadere. Per ulteriori informazioni, consulta le norme per l'eliminazione.

  2. Per istanze con Redis 4.0 e versioni successive:

    1. Attiva activedefrag per la tua istanza. Per ulteriori dettagli, consulta la sezione Derammentazione attiva.
  3. Scopri come utilizzare le metriche per risolvere i problemi relativi alle condizioni della memoria e acquisire informazioni 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 quando esegui operazioni con uso intensivo della memoria.

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

  6. Valuta la possibilità di scalare la capacità della tua istanza.

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

Ridimensionare correttamente l'istanza Memorystore

Questa sezione illustra tre approcci distinti che ti consentono di dimensionare correttamente l'istanza in base al tuo carico di lavoro:

Determina la dimensione iniziale di un'istanza Memorystore

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

  1. Stabilisci le dimensioni dei tuoi dati.

    • Fai una stima del numero e del numero medio di chiavi che l'applicazione scriverà nella tua istanza Redis. Moltiplica questi valori per ottenere una stima approssimativa delle dimensioni dell'istanza di cui hai bisogno.
  2. Scegli un criterio di rimozione.

    • Se utilizzi il criterio maxmemory noeviction, la dimensione dell'istanza deve essere abbastanza grande da contenere il carico di lavoro massimo e il set di lavoro. Se esaurisci la memoria con questo criterio maxmemory, l'istanza può inserire una condizione con memoria esaurita.
    • Altri criteri di rimozione non influiscono sulla dimensione dell'istanza di cui vuoi eseguire il provisioning.
  3. Esegui il provisioning di memoria supplementare per le istanze di livello Standard

    • A differenza delle istanze del Livello base, le istanze 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 del passaggio 1 ed esegui il provisioning di un ulteriore 10% per il buffer di replica.
  4. Stimare la tua frequenza di scrittura media e massima

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

    • Monitora il rapporto hit da cache e, se non ricevi tutti i successi di cache che vuoi, significa che devi aumentare le dimensioni dell'istanza o assicurarti che l'applicazione stia scrivendo le chiavi dell'istanza Memorystore richieste e non completate.

Determina se la tua istanza blocca le scritture a causa di una condizione esaurita della memoria

Se viene visualizzato il seguente messaggio di errore:

-OOM command not allowed under OOM prevention.

Poi verifica se:

  1. La metrica del rapporto di utilizzo della memoria di sistema ha superato l'80% appena prima che l'istanza iniziasse a riscontrare problemi.
  2. Il rapporto di utilizzo della memoria di sistema è aumentato molto rapidamente prima che si verificassero problemi con la tua istanza.
  3. La metrica durata di sovraccarico della memoria di sistema mostrava valori superiori a zero durante lo stesso periodo in cui hai riscontrato le scritture bloccate.

In questo caso, è probabile che l'istanza stia bloccando le scritture a causa di una condizione esaurita della memoria.

Gestisci il rapporto di utilizzo della memoria di sistema

Imposta un avviso per ricevere una notifica se la metrica relativa al rapporto di utilizzo della memoria di sistema supera l'80%. Se il rapporto di utilizzo della memoria di sistema supera l'80%, dovresti 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 potrebbe aumentare rapidamente al 100%. Memorystore offre i seguenti modi per gestire il rapporto di utilizzo della memoria di sistema:

  • Attiva activedefrag per le istanze che utilizzano Redis versione 4.0 e successive.
  • Riduci il limite di maxmemory-gb della tua istanza.
  • Fai lo scale up dell'istanza.
  • Scegli il criterio di rimozione appropriato.
  • Imposta TTL sulle chiavi volatili.
  • Elimina manualmente le chiavi dall'istanza.

Attiva Activedefrag

Se il rapporto di utilizzo della memoria di sistema supera l'80%, attiva activedefrag (per le istanze che utilizzano Redis versione 4.0 e successive). La deframmentazione può richiedere diverse ore prima del rilascio della memoria frammentata. Se il traffico di scrittura è elevato, la sola deframmentazione potrebbe non essere sufficiente per impedire all'istanza di esaurire la memoria. Pertanto, potrebbe essere necessario implementare i seguenti consigli:

Riduci il limite massimo di memoria dell'istanza

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

Scenario 1: il rapporto di utilizzo della memoria di sistema è stato scalato gradualmente e lentamente. La frammentazione è un problema probabile e dovresti ridurre maxmemory-gb in 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 è aumentato rapidamente e viene visualizzato un carico di scrittura significativo sull'istanza. È probabile che il picco sia stato causato da un'operazione intensiva per la memoria. In questa situazione devi ridurre il limite maxmemory-gb in incrementi maggiori per assicurarti che l'istanza eviti di inserire una condizione esaurita o che si stia ripristinando da una condizione esaurita. Tieni presente che una riduzione della memoria massima può ridurre le istanze proporzione cache. Un rapporto hit da cache molto più basso indica che dovresti fare lo scale up dell'istanza in modo che la tua applicazione possa trarre vantaggio dai vantaggi dell'utilizzo di Redis. Per informazioni su come regolare la configurazione maxmemory-gb, consulta Configurazione delle istanze Redis.

Fai lo scale up della tua istanza

Segui le istruzioni sulla scalabilità delle istanze Redis per aumentare la capacità della tua istanza.

Esempio di scalabilità maxmemory:

Se hai un'istanza di 10 GB con maxmemory-gb impostato su 8 GB, hai a disposizione 8 GB per l'archiviazione delle chiavi e 2 GB di sovraccarico di memoria. Se ridimensioni l'istanza a 20 GB, il valore di 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 diminuire le dimensioni dell'istanza.

Scegli il criterio di rimozione appropriato

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

Elimina manualmente le chiavi dall'istanza

Puoi migliorare le condizioni della memoria eliminando manualmente le chiavi dall'istanza. Si tratta di una soluzione temporanea che ti aiuta a migliorare l'integrità dell'istanza.