Questo documento spiega come identificare l'utilizzo elevato della memoria per le istanze Cloud SQL e fornisce suggerimenti su come risolvere i problemi relativi alla memoria.
Per scoprire come configurare l'utilizzo della memoria per un'istanza Cloud SQL, vedi Best practice per la gestione dell'utilizzo della memoria.
Identificare l'utilizzo elevato della memoria
Utilizza Metrics Explorer per identificare l'utilizzo della memoria
Puoi esaminare l'utilizzo della memoria dell'istanza con la metrica database/memory/components.usage
in Metrics Explorer.
Utilizza Query Insights per analizzare il piano e spiegare il consumo di risorse elevate
Query Insights consente di rilevare, diagnosticare e prevenire problemi di prestazioni delle query per i database Cloud SQL. Query Insights fornisce un elenco di query a lunga esecuzione insieme al relativo piano di spiegazione (documentazione di PostgreSQL). Esamina il piano esplicativo e identifica la parte della query con un metodo di scansione con un'elevata memoria utilizzata. Indipendentemente dal tempo di esecuzione delle query, Query Insights offre un piano di spiegazione per tutte le query. Identifica le query complesse che richiedono più tempo, in modo da sapere quali query bloccano la memoria per durate più lunghe.
I metodi di scansione più comuni di PostgreSQL che utilizzano un'elevata memoria includono i seguenti:
- Scansione heap bitmap
- Ordinamento rapido
- Hash join o hash
Utilizzo elevato della memoria e log pertinenti per le istanze abilitate per Gemini
Se Gemini è abilitato, invece di un errore di esaurimento della memoria (OOM) che causa un tempo di inattività del database, viene terminata una connessione che esegue una query con un utilizzo elevato della memoria, evitando così tempi di inattività del database. Per identificare la query predefinita, puoi controllare le seguenti voci nei log del database:
(...timestamp….) db=postgres, user=customer FATAL: terminating connection due to administrator command
Viene visualizzato il seguente log del database Cloud SQL per PostgreSQL, che acquisisce la query per l'utilizzo elevato della memoria che è stata terminata per evitare lo OOM. La query è una versione normalizzata della query originale:
db=postgres,user=customer LOG: postgres process with PID 1734 for the query "SELECT COUNT(product) AS item_count FROM test_table WHERE product_type = $1 AND product LIKE $2 AND c6_2 IN ($3,$4,$5,$6,$7)" has been cancelled.
Le notifiche vengono visualizzate anche nella pagina Istanze Cloud SQL per i seguenti eventi:
- Utilizzo della memoria dell'istanza nelle ultime 24 ore.
- Elenco di query normalizzate che sono state annullate nelle ultime 24 ore.
- Un link alla documentazione di Google sull'ottimizzazione dell'utilizzo della memoria.
Utilizzo elevato della memoria - Suggerimenti
I seguenti suggerimenti risolvono i problemi più comuni relativi alla memoria.
Se l'istanza continua a utilizzare un'elevata quantità di memoria, è probabile che alla fine venga riscontrato un problema di tipo out of memory
.
Se le esigenze di memoria di PostgreSQL o di un altro processo causano l'esaurimento della memoria del sistema, vedrai un messaggio del kernel Out of Memory
nei log di PostgreSQL e l'istanza di PostgreSQL viene arrestata.
Ad esempio:
Out of Memory: Killed process 12345 (postgres)
L'istanza più comune in cui riscontri un problema OOM è con un valore più alto, work_mem
, con un numero elevato di connessioni attive.
Di conseguenza, se riscontri problemi di OOM frequenti o se eviti questi errori nell'istanza Cloud SQL per PostgreSQL, ti consigliamo di seguire questi suggerimenti:
Imposta
work_mem
Le query che utilizzano l'ordinamento rapido sono più veloci di quelle che utilizzano l'ordinamento di unione esterno. Il primo, però, può portare all'esaurimento della memoria. Per risolvere questo problema, imposta un valore di
work_mem
sufficientemente ragionevole in modo da bilanciare entrambe le operazioni di ordinamento nella memoria e sul disco. Puoi anche valutare la possibilità di impostarework_mem
a livello di sessione anziché per un'intera istanza.Monitora le sessioni attive
Ogni connessione utilizza una determinata quantità di memoria. Utilizza la seguente query per verificare il numero di connessioni attive:
SELECT state, usename, count(1) FROM pg_stat_activity WHERE pid <> pg_backend_pid() GROUP BY state, usename ORDER BY 1;
Se hai un numero elevato di sessioni attive, analizza la causa principale di un numero elevato di sessioni attive, ad esempio i blocchi delle transazioni.
Imposta
shared_buffers
Se il valore di
shared_buffers
viene impostato su un valore più alto, valuta la possibilità di diminuire il valore dishared_buffers
in modo che la memoria possa essere utilizzata per altre operazioni, ad esempiowork_mem
, o per la creazione di nuove connessioni.Rapporto di hit della cache
In genere PostgreSQL cerca di mantenere nella cache i dati a cui accedi più spesso. Quando i dati vengono richiesti da un client, se sono già memorizzati nella cache in buffer condivisi, vengono inviati direttamente al client. In tal caso si parla di successo della cache. Se i dati non sono presenti nei buffer condivisi, vengono prima recuperati nei buffer condivisi da un disco e poi forniti al client. Questo prende il nome di fallimento della cache. Il rapporto di successo della cache misura il numero di richieste di contenuti gestite dalla cache rispetto alle richieste ricevute. Esegui la query seguente per verificare il percentuale successi cache per le richieste della tabella nell'istanza PostgreSQL:
SELECT sum(heap_blks_read) as heap_read, sum(heap_blks_hit) as heap_hit, sum(heap_blks_hit) / (sum(heap_blks_hit) + sum(heap_blks_read)) as ratio FROM pg_statio_user_tables;
Esegui la query seguente per verificare il percentuale successi cache per le richieste di indicizzazione nell'istanza PostgreSQL:
SELECT sum(idx_blks_read) as idx_read, sum(idx_blks_hit) as idx_hit, (sum(idx_blks_hit) - sum(idx_blks_read)) / sum(idx_blks_hit) as ratio FROM pg_statio_user_indexes;
In genere, un rapporto di successo della cache pari al 95-99% è considerato un buon valore.
Abilita pagine di grandi dimensioni Per impostazione predefinita, Cloud SQL per PostgreSQL è abilitato
huge_pages
per una migliore gestione della memoria. Ti consigliamo di abilitarla. Per saperne di più suhuge_pages
, consulta la documentazione di PostgreSQL.Imposta
max_locks_per_transaction
Il valore
max_locks_per_transaction
indica il numero di oggetti di database che possono essere bloccati contemporaneamente. Nella maggior parte dei casi, il valore predefinito di 64 è sufficiente. Tuttavia, se hai a che fare con un set di dati di grandi dimensioni, potresti ritrovarti con degli OOM. Valuta la possibilità di aumentare il valore dimax_locks_per_transaction
in modo abbastanza alto da evitare gli eventi OOM.Il valore
max_locks_per_transaction
deve esseremax_locks_per_transaction
* (max_connections
+max_prepared_transactions
) oggetti. Ciò significa che se hai 300.000 oggetti e se il valore dimax_connections
è 200,max_locks_per_transaction
dovrebbe essere 1500.Imposta
max_pred_locks_per_transaction
La transazione potrebbe non riuscire se i tuoi client toccano molte tabelle diverse in un'unica transazione serializzabile. In questo caso, ti consigliamo di aumentare il valore di
max_pred_locks_per_transaction
fino a un valore ragionevolmente elevato. Comemax_locks_per_transaction
, anchemax_pred_locks_per_transaction
utilizza la memoria condivisa, quindi non impostare un valore irragionevole alto.Se l'utilizzo della memoria è ancora elevato e ritieni che le query siano traffico legittimo, valuta la possibilità di aumentare il numero di risorse di memoria nell'istanza per evitare arresti anomali o tempi di inattività del database.