Condividi tramite


Risolvere i problemi di utilizzo elevato della CPU nel server flessibile di Database di Azure per PostgreSQL

SI APPLICA A: Database di Azure per PostgreSQL - Server flessibile

Questo articolo descrive come identificare la causa radice dell'utilizzo elevato della CPU. Fornisce anche possibili azioni correttive per controllare l'utilizzo della CPU quando si usa il iserver flessibile di Database di Azure per PostgreSQL.

Contenuto dell'articolo:

  • Informazioni sulle guide alla risoluzione dei problemi per identificare e ottenere raccomandazioni per attenuare le cause radice.
  • Informazioni sugli strumenti per identificare un utilizzo elevato della CPU, ad esempio metriche di Azure, archivio query e pg_stat_statements.
  • Come identificare le cause radice, ad esempio query a esecuzione prolungata e connessioni totali.
  • Come risolvere l'utilizzo elevato della CPU usando EXPLAIN ANALYZE, il pool di connessioni e svuotando le tabelle.

Guide alla risoluzione dei problemi

Usando le Guide alla risoluzione dei problemi è possibile identificare la probabile causa radice di uno scenario elevato della CPU e leggere le raccomandazioni per attenuare il problema riscontrato.

Per informazioni su come configurare e usare le guide alla risoluzione dei problemi, seguire le guide alla risoluzione dei problemi di installazione.

Strumenti per identificare l'utilizzo elevato della CPU

Prendere in considerazione l'uso dell'elenco di strumenti seguente per identificare un utilizzo elevato della CPU.

Metriche di Azure

Metriche di Azure è un buon punto di partenza per controllare l'utilizzo della CPU per un periodo specifico. Le metriche forniscono informazioni sulle risorse usate durante il periodo in cui l'utilizzo della CPU è elevato. Confrontare i grafici di operazioni di I/O di scrittura, operazioni di I/O di lettura, Byte velocità effettiva lettura/sec eByte velocità effettiva scrittura/sec con percentuale CPU, per scoprire i tempi in cui il carico di lavoro ha causato un utilizzo elevato della CPU.

Per il monitoraggio proattivo, è possibile configurare gli avvisi sulle metriche. Per indicazioni dettagliate, vedere Metriche di Azure.

Query Store

Query Store acquisisce automaticamente la cronologia delle query e le statistiche di runtime e le conserva a scopo di verifica. Seziona i dati in base al tempo in modo che sia possibile visualizzare i modelli di utilizzo temporali. I dati relativi a tutti gli utenti, tutti i database e tutte le query vengono archiviati in un database denominato azure_sys nell'istanza di Database di Azure per PostgreSQL - Server flessibile.

Query Store può correlare le informazioni sugli eventi di attesa con le statistiche di runtime delle query. Usare Query Store per identificare le query con un utilizzo elevato della CPU durante il periodo di interesse.

Per altre informazioni, vedere Archivio query.

pg_stat_statements

L'estensione pg_stat_statements consente di identificare le query che utilizzano tempo nel server. Per altre informazioni su questa estensione, vedere la relativa documentazione.

Tempo medio o medio di esecuzione

Per Postgres versioni 13 e successive, usare l'istruzione seguente per visualizzare le prime cinque istruzioni SQL per media o il tempo di esecuzione medio:

SELECT userid::regrole, dbid, query, mean_exec_time
FROM pg_stat_statements
ORDER BY mean_exec_time DESC
LIMIT 5;

Tempo totale di esecuzione

Eseguire le istruzioni seguenti per visualizzare le prime cinque istruzioni SQL in base al tempo di esecuzione totale.

Per Postgres versioni 13 e successive, usare l'istruzione seguente per visualizzare le prime cinque istruzioni SQL in base al tempo di esecuzione totale:

SELECT userid::regrole, dbid, query
FROM pg_stat_statements
ORDER BY total_exec_time
DESC LIMIT 5;

Identificare le cause radice

Se i livelli di consumo della CPU sono elevati in generale, quelle seguenti potrebbero essere possibili cause radice:

Transazioni con esecuzione prolungata

Le transazioni con esecuzione prolungata possono utilizzare risorse CPU che possono causare un utilizzo elevato della CPU.

La query seguente consente di identificare le connessioni in esecuzione per il tempo più lungo:

SELECT pid, usename, datname, query, now() - xact_start as duration
FROM pg_stat_activity
WHERE pid <> pg_backend_pid() AND state IN ('idle in transaction', 'active')
ORDER BY duration DESC;

Numero totale di connessioni e numero di connessioni in base allo stato

Un numero elevato di connessioni al database potrebbe comportare anche un aumento dell'utilizzo della CPU e della memoria.

La query seguente fornisce informazioni sul numero di connessioni in base allo stato:

SELECT state, count(*)
FROM  pg_stat_activity
WHERE pid <> pg_backend_pid()
GROUP BY state
ORDER BY state ASC;

Risolvere l'utilizzo elevato della CPU

Usare EXPLAIN ANALYZE, prendere in considerazione l'uso del pool di connessioni PgBouncer predefinito e terminare le transazioni a esecuzione prolungata per risolvere un utilizzo elevato della CPU.

Usare EXPLAIN ANALYZE

Dopo aver appreso le query che utilizzano più CPU, usare EXPLAIN ANALYZE per esaminarle e ottimizzarle ulteriormente.

Per altre informazioni sul comando EXPLAIN ANALYZE, vedere la relativa documentazione.

PgBouncer, un pool di connessioni predefinito

In situazioni in cui sono presenti molte connessioni di breve durata o molte connessioni che rimangono inattive per la maggior parte della loro vita, è consigliabile usare un pooler di connessioni come PgBouncer.

Per altre informazioni su PgBouncer, vedere Procedure consigliate per il pool di connessioni e la gestione delle connessioni con PostgreSQL

Database di Azure per PostgreSQL - Server flessibile offre PgBouncer come soluzione predefinita per pool di connessioni. Per altre informazioni, vedere PgBouncer.

Terminare le transazioni a esecuzione prolungata

È possibile prendere in considerazione l'eliminazione di una transazione a esecuzione prolungata come opzione.

Per terminare il PID di una sessione, è necessario trovare il relativo PID usando la query seguente:

SELECT pid, usename, datname, query, now() - xact_start as duration
FROM pg_stat_activity
WHERE pid <> pg_backend_pid() AND state IN ('idle in transaction', 'active')
ORDER BY duration DESC;

È anche possibile filtrare in base ad altre proprietà, ad esempio usename(nome utente), datname (nome database) e così via.

Dopo aver ottenuto il PID della sessione, è possibile terminarlo usando la query seguente:

SELECT pg_terminate_backend(pid);

Monitorare le statistiche di svuotamento e tabella

Mantenere aggiornate le statistiche delle tabelle consente di migliorare le prestazioni delle query. Monitorare se viene eseguita il normale svuotaento automatico.

La query seguente consente di identificare le tabelle che devono essere svuotate:

SELECT schemaname,relname,n_dead_tup,n_live_tup,last_vacuum,last_analyze, last_autovacuum,last_autoanalyze
FROM pg_stat_all_tables
WHERE n_live_tup > 0;

last_autovacuum e last_autoanalyze le colonne forniscono la data e l'ora dell'ultimo svuotamento della tabella. Se le tabelle non vengono svuotate regolarmente, seguire questa procedura per ottimizzare lo svuotamento automatico.

Per altre informazioni sulla risoluzione dei problemi e sull'ottimizzazione dello svuotamento automatico, vedere Risoluzione dei problemi di svuotamento automatico.

Una soluzione a breve termine consiste nell'eseguire uno svuotamento manuale delle tabelle in cui vengono visualizzate query lente:

VACUUM ANALYZE <table>;