Condividi tramite


Risolvere i problemi di utilizzo elevato della CPU in Database di Azure per PostgreSQL - Server flessibile

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 Database di Azure per PostgreSQL server flessibile.

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 le tabelle a vuoto.

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 lettura, Byte velocità effettiva lettura/sec e Byte 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 delle statistiche di runtime e le mantiene per la revisione. Seziona i dati in base al tempo, in modo che sia possibile visualizzare i modelli di utilizzo temporali. I dati per tutti gli utenti, i database e le query vengono archiviati in un database denominato azure_sys nell'istanza del server flessibile Database di Azure per PostgreSQL.

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 media durata di esecuzione:

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, quelli 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 usename esempio (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 vuoto e tabella

Mantenere aggiornate le statistiche delle tabelle consente di migliorare le prestazioni delle query. Monitorare se viene eseguita la normale autovacuumazione.

La query seguente consente di identificare le tabelle che richiedono il vuoto:

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 le colonne e last_autoanalyze forniscono la data e l'ora dell'ultima analisi automatica della tabella. Se le tabelle non vengono sottoposte a vuoto regolarmente, seguire questa procedura per ottimizzare l'autovacuum.

Per altre informazioni sulla risoluzione dei problemi e sull'ottimizzazione di autovacuum, vedere Risoluzione dei problemi di Autovacuum.

Una soluzione a breve termine consiste nell'eseguire un'analisi manuale a vuoto delle tabelle in cui vengono visualizzate query lente:

VACUUM ANALYZE <table>;

Condividere i suggerimenti e i bug con il team del prodotto Database di Azure per PostgreSQL.