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 carico di lavoro specifico, l'overhead di memoria può aumentare più della memoria aggiuntiva che eseguiamo il provisioning a questo scopo.
Quando l'utilizzo della memoria supera la memoria di sistema Memorystore totale, una condizione di esaurimento della memoria (OOM) può causare lo svuotamento completo della cache dei dati, il che può interrompere l'applicazione e l'attività.
Le sezioni seguenti descrivono i principi generali da seguire durante la configurazione di un'istanza Memorystore for 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 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 cache
La memoria 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, vedi Memoria riservata. Una volta riempita la memoria cache, Memcached inizia a rimuovere gli elementi memorizzati nella cache per fare spazio a nuove scritture.
Tieni presente che quando visualizzi la metrica della memoria cache, la memoria 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 memoria aggiuntiva può essere allocata dalla cache come frammentazione all'interno dei blocchi.
Overhead della 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 della memoria viene scalato in base al numero di connessioni attive, al numero totale di elementi e alle dimensioni degli elementi. Inoltre, l'overhead della memoria è teoricamente illimitato, quindi ha il potenziale di crescere all'infinito.
Per tenere conto dell'overhead della memoria, Memorystore aggiunge memoria extra all'istanza. Tuttavia, la quantità di memoria aggiuntiva che aggiungiamo non è visibile. Per la maggior parte dei carichi di lavoro, l'overhead di memoria non dovrebbe essere problematico.
Senza alcuna configurazione, la memoria di un nodo Memorystore for Memcached vuoto appare come nel diagramma riportato di seguito.

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

Poiché la crescita dell'overhead è illimitata, l'overhead per alcuni carichi di lavoro supera il limite riservato, come mostrato di seguito:

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

Potresti notare che l'overhead della memoria aumenta oltre lo spazio aggiuntivo allocato per impostazione predefinita da Memorystore (come indicato dall'elevato utilizzo della memoria di sistema). In questo caso, aumenta il parametro Memoria riservata per creare un overhead aggiuntivo per il tuo workload.
Memoria riservata
La memoria riservata è una configurazione di Memorystore che ti consente di aumentare la quantità di spazio disponibile da utilizzare per l'overhead della memoria.
Per aumentare la memoria disponibile per l'overhead della memoria, aumenti la memoria riservata, il che riduce la memoria della cache disponibile. Devi aggiungere questo spazio aggiuntivo se la tua istanza subisce una pressione della memoria causata da un overhead elevato della 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 sull'istanza. La riduzione della memoria riservata sull'istanza può aumentare notevolmente la probabilità di condizioni di esaurimento della memoria.
Il seguente diagramma mostra un'istanza che ha creato spazio aggiuntivo per l'overhead della memoria aumentando la memoria riservata:

Una volta raggiunto questo limite ridotto, la cache Memcached inizia a eliminare gli elementi.

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 picco di workload.
Per maggiori dettagli, vedi Gestire l'utilizzo della memoria di sistema.
Utilizzo della memoria di sistema
La memoria di sistema è pari alla capacità dell'istanza di cui è stato eseguito il provisioning più lo spazio aggiuntivo aggiunto da Memorystore per l'overhead della memoria.
Utilizzo della memoria di sistema è una metrica che mostra la percentuale di tutta la memoria utilizzata (elementi archiviati più overhead della memoria) rispetto alla memoria di sistema. È una metrica fondamentale da monitorare, perché mostra quanto è vicino il riempimento completo della memoria di sistema disponibile per la tua 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 garantire che l'istanza abbia memoria sufficiente per supportare il tuo workload, è importante avere sempre a disposizione memoria di sistema sufficiente.
Per i carichi di lavoro che tentano di riempire completamente la cache e si basano sulle eliminazioni di Memcached per gestire gli elementi archiviati, dovresti aspettarti un utilizzo della memoria di sistema più elevato e potresti voler aumentare preventivamente la memoria riservata per garantire di avere spazio sufficiente per l'overhead.
Avvisi per l'utilizzo della memoria di sistema
Ti consigliamo di impostare un avviso per ricevere una notifica se la metrica Utilizzo memoria di sistema supera il 90%. Se l'utilizzo della memoria di sistema è elevato, devi monitorare più da vicino la metrica e, se aumenta notevolmente, devi prendere in considerazione l'adozione di misure per gestire l'utilizzo della memoria di sistema. Intervenire quando l'utilizzo della memoria di sistema raggiunge livelli elevati è importante perché ti dà il tempo di mitigare il problema invece di dover gestire uno svuotamento della cache causato da una condizione di esaurimento della memoria.
Norme di sfratto
Memcached utilizza un algoritmo LRU ottimizzato per eliminare gli elementi una volta riempita la memoria della cache. Per istruzioni sulla disattivazione delle espulsioni dalla cache, consulta Configurazione delle istanze di Memcached.
Monitoraggio delle rimozioni mostra il numero di chiavi rimosse da Memcached a causa delle limitazioni delle dimensioni. Gli elementi rimossi a causa della scadenza del TTL non sono inclusi in questa metrica. Se noti un numero elevato di espulsioni, lo scale up dell'istanza potrebbe comportare un aumento del rapporto di hit della cache.
Se le espulsioni non sono abilitate e la cache è completamente piena, l'impostazione degli elementi nel server Memcached potrebbe non riuscire.
Percentuale successi cache
Devi monitorare regolarmente la metrica del rapporto di hit della cache per sapere la percentuale di ricerche di chiavi restituite correttamente dalle chiavi nella tua istanza Memcached. In generale, un rapporto di successo della cache più elevato è migliore di un rapporto di successo della cache più basso perché significa che la cache restituisce più richieste di cache.
Ti consigliamo di prendere nota del rapporto di hit della cache prima di apportare modifiche di configurazione importanti, ad esempio la regolazione della memoria riservata, la regolazione dei TTL delle chiavi o il ridimensionamento dell'istanza. Poi, dopo aver modificato l'istanza, controlla di nuovo il rapporto di hit della cache per vedere l'impatto della modifica su questa metrica.
Monitoraggio dell'utilizzo della memoria dell'istanza
Le seguenti metriche forniscono informazioni sull'utilizzo della memoria dell'istanza. Per scoprire come visualizzare le metriche e impostare gli avvisi, consulta Monitoraggio delle istanze Memcached.
Metriche relative alla gestione della memoria
| Metrica | Indirizzo completo della metrica |
|---|---|
| Memoria 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 |
| Sfratti | memcache.googleapis.com/node/eviction_count |
Gestione dell'utilizzo della memoria di sistema
Se la tua istanza è sottoposta a pressione della memoria o si verificano errori OOM, segui i passaggi riportati di seguito per risolvere il problema:
- Verifica una condizione di esaurimento della memoria.
- Aumenta la memoria riservata sull'istanza.
- Aumenta le dimensioni dell'istanza.
- Imposta i TTL per le chiavi volatili.
- Elimina manualmente le chiavi nell'istanza.
- Se continui a riscontrare condizioni di esaurimento della memoria, contatta l'assistenza Google Cloud.
Verifica di una condizione di esaurimento della memoria
Quando l'istanza raggiunge una condizione di errore OutOfMemory, il primo segnale è il riavvio dell'istanza. Per verificare se un riavvio è causato da una condizione OOM, visualizza le metriche Uptime 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, ciò 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 della memoria. Lo fa riducendo il limite di memoria cache dell'istanza. Devi aumentare la memoria riservata se la metrica Utilizzo della memoria di sistema supera il 90%.
Per istruzioni su come modificare la configurazione della memoria riservata, consulta Configurazione delle istanze Memcached.
L'aumento della memoria riservata riduce la memoria disponibile per archiviare gli elementi, il che comporta l'eliminazione degli elementi in tempi più brevi. Ciò può ridurre percentuale successi cache dell'istanza. Gli elementi non vengono rimossi se hai disattivato le rimozioni.
Scalare l'istanza
Segui le istruzioni riportate in Scalare le istanze Memcached per aumentare il numero di nodi. Se la tua applicazione è configurata per distribuire le chiavi tra i nodi, lo spazio di archiviazione degli elementi complessivo disponibile per la tua 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'ulteriore allocazione della memoria cache.
Eliminare manualmente le chiavi sull'istanza
Ti consigliamo di eliminare le chiavi quando la memoria è insufficiente. Tuttavia, poiché Memcached open source non libera la memoria allocata in precedenza, l'eliminazione delle chiavi riduce semplicemente la possibilità di entrare in una condizione OOM. Riduce la possibilità perché le nuove scritture utilizzano la memoria vuota. L'aumento dell'overhead della memoria può comunque causare una condizione OOM perché la memoria allocata in precedenza è dedicata all'archiviazione degli elementi e non può essere utilizzata dall'overhead.