Un'istanza di Memorystore for Redis, se non gestita e configurata correttamente, può subire 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 della tua istanza.
In questo argomento:
Concetti di gestione della memoria - concetti chiave che devi conoscere per mantenere in buono stato la tua istanza Memorystore.
Operazioni che richiedono molta memoria - operazioni che possono causare una pressione della memoria.
Monitora l'utilizzo della memoria dell'istanza - metriche da monitorare per scoprire come l'istanza utilizza la memoria.
Risoluzione di una condizione di memoria insufficiente - passaggi da seguire per risolvere i problemi relativi a una condizione di memoria insufficiente.
Dimensiona correttamente l'istanza Memorystore: anziché creare un'istanza con provisioning eccessivo, scopri come dimensionarla correttamente.
Concetti di gestione della memoria
Questa sezione introduce i concetti che devi comprendere per gestire l'utilizzo della memoria della tua 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 ulteriori dettagli sulla selezione della capacità dell'istanza corretta, consulta Dimensionamento corretto dell'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 utilizzo della memoria di sistema, potrebbe essere necessario ridurre il limite dimaxmemory-gbper fornire un overhead di memoria per i picchi di workload.Per maggiori dettagli, vedi Gestire il rapporto di utilizzo della memoria di sistema.
Per scoprire come regolare
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 che richiedono molta 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 intervieni e l'utilizzo della memoria continua ad aumentare, rischi 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 l'80% o un valore superiore, potresti aver utilizzato una delle operazioni che richiedono molta memoria.
Durante gli aggiornamenti di manutenzione, il rapporto di utilizzo della memoria di sistema deve essere pari o inferiore al 50%. Inoltre, a volte l'esportazione 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 Memorystore. La memoria utilizzata da un'istanza può aumentare
fino al limite di configurazione
maxmemory-gb. Quando la memoria utilizzata supera il limite dimaxmemory-gb, viene applicato il criterio di rimozione.
Norme di sfratto
Il criterio di eliminazione dell'istanza (noto anche come criterio maxmemory) determina in che modo Redis elimina le chiavi quando i dati dell'istanza raggiungono il limite di
maxmemory-gb. Redis elimina le chiavi nell'ambito del normale caso d'uso della cache. L'eliminazione delle chiavi avviene come processo in background, pertanto le chiavi non vengono eliminate immediatamente dopo il raggiungimento del limite dimaxmemory-gb. Una velocità di scrittura elevata potrebbe superare l'eliminazione delle chiavi, con conseguente condizione di memoria esaurita.Il criterio di eliminazione predefinito di un'istanza Memorystore è
volatile-lru. Se utilizzi un criterio di rimozionevolatile-*, assicurati di impostare i TTL per le chiavi che vuoi che scadano, altrimenti Redis non ha chiavi da rimuovere.Per un elenco delle norme di sfratto, consulta Norme Maxmemory.
Per scoprire come modificare la policy di sfratto, consulta Configurazione delle istanze Redis.
Frammentazione della memoria
- La frammentazione della memoria può causare l'esaurimento della memoria dell'istanza Memorystore anche quando il rapporto tra la 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, alla fine, l'arresto anomalo del server Redis. La configurazione diactivedefragRedis può 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'impostazioneactivedefragsu "yes" comporta un compromesso per la CPU, ma può contribuire 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,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 velocità di scrittura elevata:
Operazione di esportazione
La funzionalità di esportazione di Memorystore utilizza l'operazione BGSAVE di Redis, che utilizza la copia in 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, per eseguire correttamente le esportazioni, potrebbe essere necessario
ridurre il limite di maxmemory-gb al 50% della capacità dell'istanza durante le esportazioni.
Operazioni di scalabilità e upgrade della versione
Lo scaling o l'upgrade durante i periodi di carico di scrittura elevato può esercitare pressione sulla 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 conseguente aumento della pressione sulla memoria. Se un'operazione di scalabilità o aggiornamento non riesce a causa dell'utilizzo 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 basso traffico dell'istanza, perché in questo modo si riduce l'impatto negativo che la riduzione di maxmemory ha sul tasso di hit della cache. - Esegui lo scale up/l'upgrade durante i periodi di bassa attività di scrittura.
Manutenzione
La manutenzione aggiunge anche pressione alla memoria della tua istanza. Devi adottare misure per fare in modo che la metrica 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 la periodo di manutenzione in modo che la metrica 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 ti forniscono informazioni sull'utilizzo della memoria della tua istanza. Per scoprire come visualizzare le metriche e impostare gli avvisi, consulta Monitoraggio delle istanze Redis.
Metriche correlate alla gestione della memoria
| Metrica | Indirizzo completo della metrica |
|---|---|
| Maxmemory | redis.googleapis.com/stats/memory/maxmemory |
| Utilizzo memoria | redis.googleapis.com/stats/memory/usage |
| Rapporto di utilizzo della memoria | 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 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 si avvicina la dimensione del working set
al raggiungimento del limite maxmemory-gb. A meno che il criterio di espulsione non sia impostato su
no-eviction, i dati dell'istanza che raggiungono maxmemory non indicano sempre
un problema. Tuttavia, l'eliminazione 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 eliminare 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 assicurarti che l'istanza disponga di memoria sufficiente per supportare il tuo workload e altre operazioni che richiedono molta memoria, è importante avere sempre a disposizione 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 in modo significativo, devi attivare activedefrag, ridurre maxmemory e valutare la scalabilità dell'istanza.
Una volta raggiunto il 100% del rapporto di utilizzo della memoria di sistema, qualsiasi operazione che aumenti ulteriormente l'impronta di 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 del sovraccarico della memoria di sistema
Se l'utilizzo della memoria è troppo elevato, Memorystore blocca le scritture nell'istanza per mantenerla in buono stato. Durata del sovraccarico della memoria di sistema monitora per quanto tempo l'istanza si trova nello stato di scrittura bloccata.
Ti consigliamo di impostare un avviso per questa metrica in modo da sapere quando le scritture vengono bloccate per la tua 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 il rapporto di hit della cache per sapere quale percentuale di ricerche di chiavi viene restituita correttamente dalle chiavi nella tua istanza Redis. In generale, un rapporto di hit della cache più elevato è migliore di un rapporto di hit della cache più basso. Ti consigliamo di annotare il rapporto di hit della cache prima di apportare
modifiche di configurazione importanti, ad esempio la regolazione del limite maxmemory-gb, la modifica della policy di eliminazione o
il ridimensionamento dell'istanza. Poi, dopo aver modificato l'istanza, controlla di nuovo il rapporto
cache-hit 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 essere un'indicazione che
non stai impostando TTL per le chiavi. In questi casi, quando i dati dell'istanza raggiungono
il limite di maxmemory-gb, non ci sono chiavi da eliminare, il che può comportare una condizione di esaurimento
della memoria se utilizzi un criterio di eliminazione volatile-*.
Un'altra metrica che puoi monitorare è chiavi scadute. Se la metrica mostra molte
chiavi scadute, ma continui a notare una pressione della memoria sull'istanza, devi
ridurre maxmemory-gb.
Risolvere una condizione di memoria insufficiente
Di seguito sono riportate alcune best practice da seguire se la tua istanza è sottoposta a pressione della memoria o si verificano errori di esaurimento della memoria.
Se utilizzi una policy di eliminazione
volatile-*, assicurati di impostare i TTL per le chiavi che vuoi che scadano. Per maggiori dettagli, consulta le norme relative allo sfratto.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 memoria insufficiente e ottenere informazioni sull'utilizzo della memoria dell'istanza: monitora l'utilizzo della memoria dell'istanza, gestisci il rapporto di utilizzo della memoria di sistema.
Scopri come regolare maxmemory durante l'esecuzione di operazioni che richiedono molta memoria.
Se la metrica Rapporto di utilizzo della memoria di sistema supera l'80%, riduci il limite di
maxmemory-gbdella tua istanza. Per ulteriori dettagli, consulta Gestire il rapporto di utilizzo della memoria di 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 la tua istanza in base al tuo workload:
- 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 di sistema spiega cosa fare se il rapporto di utilizzo della memoria di 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 la sezione 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 una policy di rimozione.
- Se utilizzi il criterio maxmemory
noeviction, le dimensioni dell'istanza devono essere sufficientemente grandi da contenere il carico di lavoro di picco e il working set. Se esaurisci la memoria con questa policy maxmemory, la tua istanza può entrare in una condizione di esaurimento della memoria. - Altre norme di sfratto non influiscono sulle dimensioni dell'istanza che devi provisionare.
- Se utilizzi il criterio maxmemory
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 Standard Tier, assicurati di prendere la stima dei dati del passaggio 1 e di eseguire il provisioning di un buffer di replica aggiuntivo del 10%.
Stimare la velocità di scrittura media e di picco
- Se possibile, stima la velocità di scrittura e le dimensioni delle chiavi che la tua applicazione utilizzerà. Il tasso di scrittura rispetto al tasso di rimozione delle chiavi determina la velocità di crescita della tua istanza nel tempo.
Aumenta le dimensioni per raggiungere la percentuale di successo della cache desiderata
- Monitora il tasso di hit della cache e, se non ottieni tanti hit della cache riusciti quanti ne vorresti, significa che devi aumentare le dimensioni dell'istanza o assicurarti che la tua applicazione scriva le chiavi nell'istanza Memorystore richieste e non soddisfatte.
Determina se l'istanza blocca le scritture a causa di una condizione di esaurimento della memoria
Se ricevi il seguente errore:
-OOM command not allowed under OOM prevention.
Poi controlla se:
- La metrica del rapporto di utilizzo della memoria di sistema ha superato l'80% subito prima che la tua istanza iniziasse a riscontrare problemi.
- Il rapporto di utilizzo della memoria di sistema è aumentato molto rapidamente prima che si verificassero problemi con la tua istanza.
- La metrica Durata sovraccarico 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 blocchi 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 per evitare che l'istanza esaurisca la memoria. A seconda del volume di scrittura e del pattern di accesso alle chiavi, l'utilizzo della memoria di 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. - Abbassa il limite di
maxmemory-gbdell'istanza. - Aumenta lo scale up dell'istanza.
- Scegli le norme di sfratto appropriate.
- Imposta i 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
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 che l'istanza esaurisca la memoria. Pertanto, potresti dover
implementare i seguenti consigli:
Ridurre il limite maxmemory dell'istanza
Se il rapporto di utilizzo della memoria di sistema supera l'80%, devi ridurre maxmemory-gb, ma
prima visualizza come è cambiato il rapporto di utilizzo della memoria di sistema nel tempo per determinare
quale nuovo limite di maxmemory-gb impostare.
Scenario 1: il rapporto di utilizzo della memoria di sistema è aumentato gradualmente e lentamente. La frammentazione è un problema probabile e devi 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 si verifica un
carico di scrittura significativo sull'istanza. Un'operazione che utilizza molta memoria
ha probabilmente causato il picco. In questa situazione, devi ridurre il limite di maxmemory-gb
con incrementi maggiori per assicurarti che l'istanza eviti di entrare in una
condizione di esaurimento della memoria o si ripristini da una condizione di esaurimento della memoria.
Tieni presente che la riduzione di maxmemory può diminuire il tasso di hit della cache delle istanze.
Un rapporto di hit della cache molto più basso indica che devi scalare la tua istanza in modo che
la tua applicazione possa trarre vantaggio dall'utilizzo di Redis. Per scoprire come regolare la configurazione di maxmemory-gb, vedi Configurazione delle istanze Redis.
Scalare l'istanza
Segui le istruzioni riportate in Scalabilità delle 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
memorizzare le chiavi e 2 GB di overhead di memoria. Se aumenti le dimensioni dell'istanza a 20 GB,
maxmemory-gb viene scalato a 16 GB. Pertanto, la tua istanza ora ha 16 GB di memoria
per l'archiviazione delle chiavi e 4 GB di overhead.
Consulta Scalare le istanze Redis per
istruzioni su come aumentare o diminuire le dimensioni dell'istanza.
Scegli la policy di rimozione appropriata
Se memorizzi dati volatili, scegli uno dei volatile-* criteri di eliminazione.
Se memorizzi dati non volatili, scegli una delle norme allkeys-*.
Eliminare 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.