Best practice di gestione della memoria

Questa pagina spiega la configurazione della memoria riservata per l'istanza Memcached e quando aumentare la memoria riservata, se necessario. Questa pagina spiega anche le altre best practice che devi conoscere per gestire in modo efficace la memoria per l'istanza Memcached.

Memorystore aggiunge memoria extra all'istanza, che non è visibile, per ospitare l'overhead creato dai processi Memcached. Tuttavia, a seconda del workload specifico, l'overhead di memoria può aumentare più della memoria extra di cui eseguiamo il provisioning a questo scopo.

Quando la memoria utilizzata supera la memoria di sistema totale di Memorystore, una condizione di esaurimento della memoria (OOM) può causare uno svuotamento completo della cache dei dati, che può interrompere l'applicazione e l'attività.

Le sezioni seguenti descrivono i principi generali da seguire durante la configurazione di un'istanza Memorystore per Memcached. Le sezioni trattano anche le metriche e gli avvisi che puoi utilizzare per monitorare la memoria e spiegano anche le azioni che puoi intraprendere.

Concetti di gestione della memoria

Capacità istanza

La capacità dell'istanza è la quantità di memoria di cui esegui il provisioning in GiB e per cui ti vengono addebitati i costi. La memoria della cache non è uguale alla capacità dell'istanza perché non è fissa. Tuttavia, quando crei l'istanza Memcached, la capacità dell'istanza è uguale alla memoria della cache per impostazione predefinita.

Ad esempio, se scegli una capacità dell'istanza di 5 GiB, per impostazione predefinita l'istanza ha 5 GiB di spazio per archiviare gli elementi.

Limite di memoria della cache

La memoria della cache è la dimensione totale della memoria disponibile per essere utilizzata come cache dall'istanza Memcached. Per impostazione predefinita, la memoria della cache è uguale alla capacità dell'istanza. Tuttavia, la regolazione della memoria riservata può ridurre la memoria della cache. Per maggiori dettagli, consulta Memoria riservata. Una volta che la memoria della cache è piena, Memcached inizia a rimuovere gli elementi archiviati nella cache per fare spazio a nuove scritture.

Tieni presente che quando visualizzi la metrica della memoria della cache, la memoria della cache segnalata per un nodo Memcached include solo lo spazio occupato dagli elementi. Ciò significa che Memcached potrebbe sottostimare l'utilizzo totale della memoria della cache. La cache potrebbe allocare memoria aggiuntiva come frammentazione all'interno delle slab.

Overhead di memoria

L'overhead di memoria è la memoria utilizzata dai processi Memcached. Non include gli elementi archiviati in memoria per la memorizzazione nella cache.

L'overhead di memoria viene scalato in base al numero di connessioni attive, al numero totale di elementi e alle dimensioni degli elementi. Inoltre, l'overhead di memoria è teoricamente illimitato, quindi ha il potenziale per crescere all'infinito.

Per tenere conto dell'overhead di memoria, Memorystore aggiunge memoria extra all'istanza. Tuttavia, la quantità di memoria extra che aggiungiamo non è visibile. Per la maggior parte dei workload, l'overhead di memoria non dovrebbe essere problematico.

Senza alcuna configurazione, la memoria di un nodo Memorystore for Memcached vuoto è simile al diagramma riportato di seguito.

segnaposto

Man mano che l'applicazione aggiunge elementi alla cache, Memcached accumula overhead per processi come i buffer di connessione e la tabella hash interna:

segnaposto

Poiché la crescita dell'overhead è illimitata, alcuni overhead per alcuni workload superano il limite riservato, come mostrato di seguito:

segnaposto

Quando l'overhead e gli elementi riempiono tutto lo spazio disponibile, Memcached esaurisce la memoria e il processo deve essere terminato dal sistema operativo, causando uno svuotamento completo della cache:

segnaposto

Potresti notare che l'overhead di memoria supera lo spazio extra che Memorystore alloca per l'overhead per impostazione predefinita (come indicato da un elevato utilizzo della memoria di sistema). In questo caso, aumenta il parametro Memoria riservata per creare l'overhead extra per il tuo workload.

Memoria riservata

La memoria riservata è una configurazione di Memorystore che ti consente di aumentare la quantità di spazio disponibile per l'overhead di memoria.

Per aumentare la memoria disponibile per l'overhead di memoria, aumenta la memoria riservata, che riduce la memoria della cache disponibile. Devi aggiungere questo spazio extra se l'istanza è sottoposta a una pressione della memoria causata da un elevato overhead di memoria.

Le istanze create dopo il 25 ottobre 2021 hanno una percentuale di memoria riservata predefinita del 10%. Questo valore può essere sostituito aggiornando manualmente la configurazione dell'istanza. La riduzione della memoria riservata sull'istanza può aumentare notevolmente la probabilità di condizioni di esaurimento della memoria.

Il diagramma seguente mostra un'istanza che ha creato spazio extra per l'overhead di memoria aumentando la memoria riservata:

segnaposto

Una volta che la cache Memcached raggiunge questo limite ridotto, inizia a rimuovere gli elementi.

segnaposto

Una volta che inizi a utilizzare l'istanza, a seconda della metrica Utilizzo della memoria di sistema, potrebbe essere necessario aumentare la memoria riservata sull'istanza per supportare il workload di picco.

Per maggiori dettagli, consulta Gestire la memoria utilizzata del sistema.

Utilizzo della memoria di sistema

La memoria di sistema è uguale alla capacità dell'istanza di cui è stato eseguito il provisioning più lo spazio aggiuntivo che Memorystore aggiunge per l'overhead di memoria.

L'utilizzo della memoria di sistema è una metrica che mostra la percentuale di tutta la memoria utilizzata (elementi archiviati più overhead di memoria) rispetto alla memoria di sistema. È una metrica fondamentale da monitorare, perché mostra quanto sei vicino a riempire completamente la memoria di sistema disponibile per l'istanza. Man mano che la metrica Utilizzo della memoria di sistema si avvicina al 100%, è più probabile che l'istanza riscontri una condizione di esaurimento della memoria. Per assicurarti che l'istanza abbia memoria sufficiente per supportare il tuo workload, è importante avere sempre a disposizione una quantità sufficiente di memoria di sistema.

Per i workload che tentano di riempire completamente la cache e si basano sulle rimozioni di Memcached per gestire gli elementi archiviati, dovresti prevedere un utilizzo della memoria di sistema più elevato e potresti voler aumentare in modo preventivo la memoria riservata per assicurarti di avere spazio sufficiente per l'overhead.

Avvisi per l'utilizzo della memoria di sistema

Devi impostare un avviso per ricevere una notifica se la metrica Utilizzo della memoria di sistema supera il 90%. Se l'utilizzo della memoria di sistema è elevato, devi monitorare più attentamente la metrica Utilizzo della memoria di sistema e, se aumenta notevolmente, devi prendere in considerazione la possibilità di adottare misure per gestire l'utilizzo della memoria di sistema. È importante intervenire quando l'utilizzo della memoria di sistema raggiunge livelli elevati perché ti dà il tempo di mitigare il problema anziché dover gestire uno svuotamento della cache causato da una condizione di esaurimento della memoria.

Norme di rimozione

Memcached utilizza un algoritmo LRU ottimizzato per rimuovere gli elementi una volta riempita la memoria della cache. Per istruzioni su come disattivare le rimozioni della cache, consulta Configurare le istanze Memcached.

Il monitoraggio delle rimozioni mostra il numero di chiavi rimosse da Memcached a causa delle limitazioni di dimensioni. Gli elementi rimossi a causa della scadenza del TTL non sono inclusi in questa metrica. Se noti un numero elevato di rimozioni, l'aumento di capacità dell'istanza potrebbe comportare un aumento della percentuale successi cache.

Se le rimozioni non sono attivate e la cache è completamente piena, l'impostazione degli elementi nel server Memcached potrebbe non riuscire.

Percentuale di successi della cache

Devi monitorare regolarmente la metrica della percentuale di successi della cache in modo da sapere quale percentuale di ricerche di chiavi viene restituita correttamente dalle chiavi nell'istanza Memcached. In generale, una percentuale di successi della cache più elevata è migliore di una percentuale di successi della cache inferiore perché significa che la cache restituisce più richieste di cache.

Devi prendere nota della percentuale di successi della cache prima di apportare modifiche di configurazione di grandi dimensioni, ad esempio la regolazione della memoria riservata, la regolazione dei TTL delle chiavi o l'aumento di capacità dell'istanza. Poi, dopo aver modificato l'istanza, controlla di nuovo la percentuale di successi della cache per vedere in che modo la modifica ha influito su questa metrica.

Monitorare l'utilizzo della memoria dell'istanza

Le seguenti metriche forniscono insight sulla memoria utilizzata dell'istanza. Per scoprire come visualizzare le metriche e impostare gli avvisi, consulta Monitorare le istanze Memcached.

Metrica Indirizzo completo della metrica
Memoria della cache memcache.googleapis.com/node/cache_memory
Utilizzo della memoria di sistema memcache.googleapis.com/node/memory/utilization
Percentuale di successi della cache memcache.googleapis.com/node/hit_ratio
Rimozioni memcache.googleapis.com/node/eviction_count

Gestire la memoria utilizzata del sistema

Se l'istanza è sottoposta a una pressione della memoria o riscontra errori di esaurimento della memoria, segui questi passaggi per risolvere il problema:

  1. Verifica una condizione di esaurimento della memoria.
  2. Aumenta la memoria riservata sull'istanza.
  3. Fai lo scale up dell'istanza.
  4. Imposta i TTL sulle chiavi volatili.
  5. Elimina manualmente le chiavi sull'istanza.
  6. Se continui a riscontrare condizioni di esaurimento della memoria, contatta l'assistenza di Google Cloud.

Verificare una condizione di esaurimento della memoria

Quando l'istanza raggiunge una condizione di esaurimento della memoria, il primo segnale è un riavvio dell'istanza. Per verificare se un riavvio è causato da una condizione di esaurimento della memoria, visualizza le metriche Tempo di attività e Utilizzo della memoria di sistema.

Se l'utilizzo della memoria di sistema era superiore al 90% prima che il tempo di attività scendesse a zero, significa che il riavvio dell'istanza è stato probabilmente causato da una condizione di esaurimento della memoria.

Aumentare la memoria riservata

L'aumento della memoria riservata crea più spazio per l'overhead di memoria. A questo scopo, riduce il limite di memoria della cache dell'istanza. Devi aumentare la memoria riservata se la metrica Utilizzo della memoria di sistema supera il 90%.

Per istruzioni su come regolare la configurazione della memoria riservata, consulta Configurare le istanze Memcached.

L'aumento della memoria riservata riduce la memoria disponibile per archiviare gli elementi, con conseguente rimozione degli elementi prima. Questo può ridurre la percentuale successi cache dell'istanza. Gli elementi non vengono rimossi se hai disattivato le rimozioni.

Fare lo scale up dell'istanza

Segui le istruzioni riportate in Aumentare la capacità delle istanze Memcached per aumentare il conteggio dei nodi. Se l'applicazione è configurata per partizionare le chiavi tra i nodi, lo spazio di archiviazione totale degli elementi disponibile per l'applicazione aumenta e il numero di chiavi archiviate su ogni singolo nodo diminuisce.

Impostare i TTL sulle chiavi volatili

Configura l'applicazione per impostare i TTL sulle chiavi archiviate in Memcached. Per impostazione predefinita, Memcached controlla periodicamente le chiavi scadute e le rimuove, liberando spazio sul server e impedendo l'allocazione di ulteriore memoria della cache.

Eliminare manualmente le chiavi sull'istanza

Devi prendere in considerazione l'eliminazione delle chiavi quando la memoria è sottoposta a pressione. Tuttavia, poiché Memcached open source non libera la memoria allocata in precedenza, l'eliminazione delle chiavi riduce solo la probabilità di entrare in una condizione di esaurimento della memoria. Riduce la probabilità perché le nuove scritture utilizzano la memoria vuota. L'aumento dell'overhead di memoria può comunque causare una condizione di esaurimento della memoria perché la memoria allocata in precedenza è dedicata all'archiviazione degli elementi e non può essere utilizzata dall'overhead.