Un'istanza Memorystore for Redis, se non gestita e configurata correttamente, può subire una pressione della memoria che può influire sul rendimento dell'applicazione. Questa pagina descrive le best practice che puoi utilizzare per gestire in modo efficiente la memoria utilizzata dell'istanza.
In questo argomento:
Concetti di gestione della memoria : concetti chiave che devi conoscere per mantenere l'istanza Memorystore in stato integro.
Operazioni che utilizzano molta memoria : operazioni che possono causare una pressione della memoria.
Monitorare l'utilizzo della memoria dell'istanza : metriche da monitorare per scoprire come l'istanza utilizza la memoria.
Risolvere una condizione di esaurimento della memoria : passaggi da intraprendere per risolvere i problemi relativi a una condizione di esaurimento della memoria.
Dimensionare correttamente l'istanza Memorystore : anziché creare un'istanza con provisioning eccessivo, scopri come dimensionare correttamente l'istanza.
Concetti di gestione della memoria
Questa sezione introduce i concetti che devi comprendere per gestire la memoria utilizzata dell'istanza.
Capacità istanza
- La capacità dell'istanza è la quantità di memoria di cui esegui il provisioning in gigabyte (GB) e per cui ti vengono addebitati i costi. Per maggiori dettagli sulla selezione della capacità dell'istanza corretta, consulta Dimensionare correttamente l'istanza Memorystore.
Configurazione Maxmemory
Maxmemory è una configurazione Redis che ti consente di impostare il limite di memoria in base al quale viene applicato il criterio di rimozione. Memorystore for Redis designa questa configurazione come
maxmemory-gb. Quando crei un'istanza,maxmemory-gbviene impostato sulla capacità dell'istanza. A seconda della metrica del rapporto di memoria utilizzata di sistema, potrebbe essere necessario ridurre il limitemaxmemory-gbper fornire un overhead di memoria per i picchi di carico di lavoro.Per maggiori dettagli, consulta Gestire il rapporto di utilizzo della memoria utilizzata del sistema.
Per scoprire come regolare
maxmemory-gb, consulta Configurare le istanze Redis.
Rapporto di memoria utilizzata del sistema
La metrica Rapporto di utilizzo della memoria di sistema consente di misurare la memoria utilizzata di un'istanza rispetto alla memoria di sistema. La memoria di sistema viene gestita automaticamente da Memorystore per gestire i picchi di memoria utilizzata causati da operazioni che utilizzano molta memoria e dalla frammentazione della memoria, che è comune in Redis open source.
Se la metrica del rapporto di memoria utilizzata di sistema supera l'80%, significa che l' istanza è sottoposta a una pressione della memoria e devi seguire le istruzioni riportate in Gestire il rapporto di memoria utilizzata di sistema. Se non intraprendi alcuna azione e la memoria utilizzata continua a crescere, rischi un arresto anomalo dell'istanza a causa della 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 l'80% o un valore superiore, potresti aver utilizzato una delle operazioni che utilizzano molta memoria.
Durante gli aggiornamenti di manutenzione, il rapporto di memoria utilizzata del sistema deve essere pari o inferiore al 50%. Inoltre, a volte l'esportazione richiede un rapporto di memoria utilizzata del sistema pari o inferiore al 50%.
Memoria utilizzata
- La metrica Memoria utilizzata mostra la quantità di dati presenti nell'istanza Memorystore. La memoria utilizzata di un'istanza può aumentare fino al limite di configurazione
maxmemory-gb. Quando la memoria utilizzata supera il limitemaxmemory-gb, viene applicato il criterio di rimozione.
Criterio di rimozione
Il criterio di rimozione dell'istanza (noto anche come criterio maxmemory) determina il modo in cui Redis rimuove le chiavi quando i dati dell'istanza raggiungono il limite
maxmemory-gb. Redis rimuove le chiavi come parte del normale caso d'uso della cache. La rimozione delle chiavi avviene come processo in background, pertanto le chiavi non vengono rimosse immediatamente dopo il raggiungimento del limitemaxmemory-gb. Una frequenza di scrittura elevata potrebbe superare la rimozione delle chiavi, con conseguente condizione di esaurimento della memoria.Il criterio di rimozione predefinito di un'istanza Memorystore è
volatile-lru. Se utilizzi un criterio di rimozionevolatile-*, 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 Criteri Maxmemory.
Per scoprire come modificare il criterio di rimozione, consulta 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ò causare l'esaurimento della memoria del sistema e, infine, l'arresto anomalo del server Redis. La configurazione Redisactivedefragpuò contribuire a ridurre la frammentazione.
Defragmentazione attiva
Le versioni di Redis 4.0 e successive forniscono una configurazione
activedefrag. Se possibile, devi creare l'istanza Memorystore utilizzando Redis 4.0. Per impostazione predefinita, Memorystore impostaactivedefragsu "no". L'impostazione diactivedefragsu "yes" comporta un compromesso della CPU, ma può contribuire a mitigare la frammentazione della memoria, che contribuisce ai problemi di esaurimento della memoria.Se la metrica del rapporto di memoria utilizzata del sistema indica la frammentazione della memoria, devi attivare
activedefrag. In caso contrario,activedefragrimane un'impostazione facoltativa.
Operazioni che utilizzano molta memoria
Le seguenti operazioni utilizzano una quantità significativa di memoria, soprattutto se eseguite in combinazione con una frequenza di scrittura elevata:
Operazione di esportazione
La funzionalità di esportazione di Memorystore utilizza l'operazione Redis BGSAVE, che utilizza 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 delle dimensioni dello spazio occupato dai dati. Pertanto, affinché le esportazioni vadano a buon fine, 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 i periodi di carico di scrittura elevato possono esercitare una pressione della memoria sull'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 conseguente aumento della pressione della memoria. Se un'operazione di scalabilità o upgrade non riesce a causa della pressione della memoria, devi:
- Riduci
maxmemory-gbal 50% della capacità dell'istanza prima di un'operazione di scalabilità/upgrade. Se possibile, devi anche ridurre maxmemory durante i periodi di traffico ridotto dell'istanza, perché in questo modo si riduce l'impatto negativo della riduzione di maxmemory sul rapporto di successi della cache. - Esegui la scalabilità/l'upgrade durante i periodi di scrittura ridotta.
Manutenzione
La manutenzione aggiunge anche pressione della memoria all'istanza. Devi adottare misure in modo che la metrica del rapporto di utilizzo della memoria di sistema sia pari o inferiore al 50% al momento della manutenzione pianificata. Puoi farlo pianificando un orario in cui il traffico dell'istanza è basso o aumentando temporaneamente le dimensioni dell'istanza durante il periodo di manutenzione in modo che la metrica del rapporto di utilizzo della memoria di sistema sia pari o inferiore al 50%.
Monitorare l'utilizzo della memoria dell'istanza
Monitora le metriche e imposta gli avvisi descritti in questa sezione. Queste metriche e questi avvisi forniscono informazioni sull'utilizzo della memoria utilizzata dell'istanza. Per scoprire come visualizzare le metriche e impostare gli avvisi, consulta Monitorare le istanze Redis.
Metriche correlate alla gestione della memoria
| Metrica | Indirizzo completo della metrica |
|---|---|
| Maxmemory | redis.googleapis.com/stats/memory/maxmemory |
| Memoria utilizzata | redis.googleapis.com/stats/memory/usage |
| Rapporto di memoria utilizzata | redis.googleapis.com/stats/memory/usage_ratio |
| Durata del sovraccarico della memoria di sistema | redis.googleapis.com/stats/memory/system_memory_overload_duration |
| Rapporto di memoria utilizzata del 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 è vicino il raggiungimento del limite maxmemory-gb da parte delle dimensioni del working set. A meno che il criterio di rimozione non sia impostato su no-eviction, il raggiungimento di maxmemory da parte dei dati dell'istanza non indica sempre un problema. Tuttavia, la rimozione delle chiavi è 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 memoria utilizzata del sistema
Il rapporto di memoria utilizzata del sistema è una metrica fondamentale da monitorare. Per assicurarti che l'istanza abbia memoria sufficiente per supportare il carico di lavoro e altre operazioni che utilizzano molta memoria, è importante avere sempre memoria di sistema sufficiente.
Imposta un avviso per ricevere una notifica se la metrica del rapporto di memoria utilizzata del sistema raggiunge l'80%. Se raggiunge l'80%, devi iniziare a monitorare più attentamente la metrica del rapporto di utilizzo della memoria utilizzata di sistema. Se il rapporto di memoria utilizzata del sistema continua a crescere in modo significativo, devi attivare activedefrag, ridurre maxmemory e valutare la possibilità di scalare l'istanza.
Una volta che il rapporto di memoria utilizzata del sistema raggiunge il 100%, qualsiasi operazione che aumenti ulteriormente il footprint della memoria dell'istanza viene bloccata e Redis restituisce il seguente errore:
-OOM command not allowed under OOM prevention.
Per maggiori dettagli, consulta Gestire il rapporto di utilizzo della memoria utilizzata del sistema.
Durata del sovraccarico della memoria di sistema
Se la memoria utilizzata è troppo elevata, Memorystore blocca le scritture nell'istanza per mantenerla in stato integro. La durata del sovraccarico della memoria di sistema tiene traccia del tempo in cui l'istanza si trova nello stato di scritture bloccate.
Devi impostare un avviso
per questa metrica in modo da sapere quando le scritture vengono bloccate per l'
istanza. Inoltre, puoi fare riferimento a questa metrica per risolvere il problema della ricezione dell'errore -OOM command not allowed under OOM prevention..
Percentuale successi cache
Devi monitorare regolarmente la percentuale successi cache in modo da sapere la percentuale di ricerche di chiavi restituite correttamente dalle chiavi nell'istanza Redis. In generale, una percentuale successi cache più elevata è migliore di una percentuale successi cache inferiore. Devi prendere nota della percentuale successi cache prima di apportare modifiche di configurazione di grandi dimensioni, ad esempio 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 la percentuale successi cache per vedere l'impatto della modifica su questa metrica.
Chiavi con scadenza e chiavi scadute
La metrica Stackdriver Chiavi con scadenza monitora il numero di chiavi impostate per la scadenza. Se non sono presenti chiavi con scadenza, potrebbe indicare che non stai impostando i TTL sulle chiavi. In questi casi, quando i dati dell'istanza raggiungono il limite maxmemory-gb, non sono presenti chiavi da rimuovere, il che può comportare una condizione di esaurimento della memoria se utilizzi un criterio di rimozione volatile-*.
Un'altra metrica che puoi monitorare è Chiavi scadute. Se la metrica mostra molte chiavi scadute, ma continui a vedere una pressione della memoria sull'istanza, devi ridurre maxmemory-gb.
Risolvere una condizione di esaurimento della memoria
Di seguito sono riportate alcune best practice da seguire se l'istanza è sottoposta a una pressione della memoria o si verificano errori di esaurimento della memoria.
Se utilizzi un criterio di rimozione
volatile-*assicurati di impostare TTL sulle chiavi che vuoi far scadere. Per maggiori dettagli, consulta Criterio di rimozione.Per le istanze che eseguono Redis 4.0 e versioni successive:
- Attiva
activedefragper l'istanza. Per maggiori dettagli, consulta Defragmentazione attiva.
- Attiva
Scopri come utilizzare le metriche per risolvere i problemi di esaurimento della memoria e ottenere informazioni sull'utilizzo della memoria dell'istanza: Monitorare l'utilizzo della memoria dell'istanza, Gestire il rapporto di utilizzo della memoria di sistema.
Scopri come regolare maxmemory quando esegui operazioni che utilizzano molta memoria.
Se la metrica del rapporto di memoria utilizzata del sistema supera l'80%, riduci il limite
maxmemory-gbdell'istanza. Per maggiori dettagli, consulta Gestire il rapporto di utilizzo della memoria utilizzata del sistema.Valuta la possibilità di aumentare la capacità dell'istanza.
Se continui a riscontrare condizioni di esaurimento della memoria, contatta l'assistenza Google Cloud.
Dimensionare correttamente l'istanza Memorystore
Questa sezione illustra tre approcci distinti che ti aiutano a dimensionare correttamente l'istanza in base al carico di lavoro:
- Determinare le dimensioni iniziali di un'istanza Memorystore spiega come stimare le dimensioni dell'istanza prima di crearla.
- Monitorare l'utilizzo della memoria dell'istanza descrive le metriche che forniscono informazioni utili su come l'istanza utilizza la memoria.
- Gestire il rapporto di utilizzo della memoria utilizzata del sistema spiega cosa fare se il rapporto di utilizzo della memoria utilizzata del sistema supera l'80%.
Determinare le dimensioni iniziali di un'istanza Memorystore
Per prima cosa, devi scegliere se vuoi un'istanza di livello standard o di livello base. Per scoprire di più sui livelli di Memorystore for Redis, consulta Funzionalità dei livelli Redis. Una volta selezionato il livello giusto per la tua applicazione, segui questi passaggi per determinare le dimensioni dell'istanza di cui hai bisogno:
Determina le dimensioni dei dati.
- Stima il numero di chiavi e le dimensioni medie delle chiavi che la tua applicazione scriverà nell'istanza Redis. Moltiplica questi valori per ottenere una stima approssimativa delle dimensioni dell'istanza di cui hai bisogno.
Scegli un criterio di rimozione.
- Se utilizzi il criterio maxmemory
noeviction, le dimensioni dell'istanza devono essere sufficienti per contenere il carico di lavoro di picco e il working set. Se esaurisci la memoria con questo criterio maxmemory, l'istanza può entrare in una condizione di esaurimento della memoria. - Altri criteri di rimozione non influenzano le dimensioni dell'istanza di cui devi eseguire il provisioning.
- Se utilizzi il criterio maxmemory
Esegui il provisioning di memoria aggiuntiva per le istanze di livello standard
- A differenza delle istanze di livello base, le istanze di livello standard riservano il 10% della capacità dell'istanza come buffer di replica. Se scegli un'istanza di livello standard, assicurati di prendere la stima dei dati dal passaggio 1 ed esegui il provisioning di un ulteriore 10% per il buffer di replica.
Stima la frequenza di scrittura media e di picco
- Se possibile, stima la frequenza di scrittura e le dimensioni delle chiavi che la tua applicazione utilizzerà. La frequenza di scrittura rispetto alla frequenza di rimozione delle chiavi determina la velocità con cui l'istanza crescerà nel tempo.
Fai lo scale up per raggiungere la percentuale successi cache desiderata
- Monitora la percentuale successi cache e, se non ottieni il numero di successi della cache desiderato, significa che devi aumentare le dimensioni dell'istanza o assicurarti che la tua applicazione stia scrivendo le chiavi nell'istanza Memorystore richieste e non soddisfatte.
Determinare se l'istanza sta bloccando le scritture a causa di una condizione di esaurimento della memoria
Se ricevi il seguente errore:
-OOM command not allowed under OOM prevention.
Quindi controlla se:
- La metrica del rapporto di utilizzo della memoria di sistema ha superato l'80% subito prima che l'istanza iniziasse a riscontrare problemi.
- Il rapporto di utilizzo della memoria di sistema è aumentato molto rapidamente prima che si verificassero problemi con l'istanza.
- La metrica della durata del sovraccarico della memoria di sistema ha mostrato valori superiori a zero nello stesso periodo in cui hai riscontrato scritture bloccate.
In questo caso, è probabile che l'istanza stia 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 del rapporto di utilizzo della memoria di sistema supera l'80%. Se il rapporto di memoria utilizzata del 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, la memoria utilizzata dal sistema può potenzialmente aumentare rapidamente fino al 100%. Memorystore offre i seguenti modi per gestire il rapporto di utilizzo della memoria di sistema:
- Attiva
activedefragper le istanze che eseguono Redis versione 4.0 e successive. - Riduci il limite
maxmemory-gbdell'istanza. - Fai lo scale up dell'istanza.
- Scegli il criterio di rimozione appropriato.
- Imposta i TTL sulle chiavi volatili.
- Elimina manualmente le chiavi dall'istanza.
Attivare activedefrag
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
la memoria frammentata. Se il traffico di scrittura è elevato, la sola deframmentazione potrebbe non essere sufficiente a impedire l'esaurimento della memoria dell'istanza. Pertanto, potrebbe essere necessario implementare i seguenti consigli:
Riduci il limite maxmemory dell'istanza
Se il rapporto di utilizzo della memoria utilizzata di sistema supera l'80%, devi ridurre maxmemory-gb, ma prima visualizza la variazione del rapporto di utilizzo della memoria utilizzata di sistema nel tempo per determinare il nuovo limite maxmemory-gb da impostare.
Scenario 1: il rapporto di utilizzo della memoria di sistema è aumentato gradualmente e lentamente. È probabile che si tratti di un problema di frammentazione e devi ridurre maxmemory-gb in piccoli incrementi finché il rapporto di memoria utilizzata del sistema non si stabilizza al di sotto dell'80%.
Scenario 2: il rapporto di memoria utilizzata del sistema è aumentato rapidamente e si verifica un carico di scrittura significativo sull'istanza. È probabile che un'operazione che utilizza molta memoria abbia causato il picco. In questa situazione, devi ridurre il limite maxmemory-gb in incrementi maggiori per assicurarti che l'istanza eviti di entrare in una condizione di esaurimento della memoria o che si ripristini da una condizione di esaurimento della memoria.
Tieni presente che la riduzione di maxmemory può ridurre il rapporto di successi della cache delle istanze.
Un rapporto di successi della cache molto inferiore indica che devi fare lo scale up della tua istanza in modo che la tua applicazione possa trarre vantaggio dall'utilizzo di Redis. Per scoprire
come regolare la configurazione maxmemory-gb, consulta Configurare le istanze Redis.
Fare lo scale up dell'istanza
Segui le istruzioni riportate in Scalare le istanze Redis per aumentare la capacità dell'istanza.
Esempio di scalabilità di Maxmemory:
Se hai un'istanza da 10 GB con maxmemory-gb impostato su 8 GB, hai 8 GB per l'archiviazione delle chiavi e 2 GB di overhead di memoria. Se aumenti le dimensioni dell'istanza a 20 GB, maxmemory-gb viene aumentato a 16 GB. Pertanto, l'istanza ora ha 16 GB di memoria per l'archiviazione delle chiavi e 4 GB di overhead.
Per
istruzioni su come aumentare o ridurre le dimensioni dell'istanza, consulta Scalare le istanze Redis.
Scegli il criterio di rimozione appropriato
Se archivi dati volatili, scegli uno dei volatile-* criteri di rimozione.
Se archivi 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 dall'istanza. Si tratta di una soluzione temporanea che ti aiuta a migliorare l'integrità dell'istanza.