Ottimizzazione di Aurora PostgreSQL con approfondimenti proattivi di Amazon DevOps Guru
Gli approfondimenti proattivi di DevOps Guru rilevano le condizioni problematiche nel cluster di database Aurora PostgreSQL e ti avvisa prima che si verifichino. Gli approfondimenti proattivi possono avvisare di una connessione di transazione inattiva da molto tempo. Per ulteriori informazioni sulla risoluzione dei problemi di inattività prolungata nelle connessioni di transazione, consulta Il database ha una connessione di transazione inattiva da molto tempo.
Con DevOps Guru è possibile:
-
Evitare molti problemi comuni relativi al database controllando la configurazione del database rispetto alle impostazioni consigliate comuni.
-
Ricevere gli avvisi per le criticità relative al parco istanze che, se non controllate, possono portare a problemi più gravi in seguito.
-
Ricevere gli avvisi per i nuovi problemi individuati.
Ogni approfondimento proattivo contiene un'analisi della causa del problema e i suggerimenti per le azioni correttive.
Per ulteriori informazioni su Amazon DevOps Guru per Amazon RDS, consulta Analisi delle anomalie delle prestazioni di Aurora con Amazon DevOps Guru per Amazon RDS.
Il database ha una connessione di transazione inattiva da molto tempo
Una connessione al database è nello stato idle in transaction da più di 1800 secondi.
Argomenti
Versioni del motore supportate
Queste informazioni approfondite sono supportate per tutte le versioni di Aurora PostgreSQL.
Contesto
Una transazione nello stato idle in transaction può contenere blocchi che impediscono l'esecuzione di altre query. Può anche impedire al VACUUM (incluso l'autovacuum) di cancellare le righe inutilizzate, con conseguente aumento delle dimensioni dell'indice o della tabella o del wraparound dell'ID della transazione.
Probabili cause di questo problema
Una transazione avviata in una sessione interattiva con BEGIN o START TRANSACTION non è stata terminata utilizzando un comando COMMIT, ROLLBACK o END. Lo stato della transazione diventa pertanto idle in
transaction.
Azioni
Puoi individuare le transazioni inattive eseguendo la query pg_stat_activity.
Nel client SQL, esegui la query riportata di seguito per elencare tutte le connessioni nello stato idle in transaction e ordinarle in base alla durata:
SELECT now() - state_change as idle_in_transaction_duration, now() - xact_start as xact_duration,* FROM pg_stat_activity WHERE state = 'idle in transaction' AND xact_start is not null ORDER BY 1 DESC;
Consigliamo azioni diverse a seconda delle cause degli approfondimenti.
Argomenti
Terminare la transazione
Quando si avvia una transazione in una sessione interattiva con BEGIN o START TRANSACTION, lo stato della transazione diventa idle in transaction. Rimane in questo stato finché non si termina la transazione con un comando COMMIT, ROLLBACK, END o si disconnette completamente la connessione per eseguire il rollback della transazione.
Interrompere la connessione
Interrompi la connessione con una transazione inattiva utilizzando la seguente query:
SELECT pg_terminate_backend(pid);
pid è l'ID di processo della connessione.
Configurare il parametro idle_in_transaction_session_timeout
Configura il parametro idle_in_transaction_session_timeout nel gruppo di parametri. Il vantaggio della configurazione di questo parametro è che non richiede un intervento manuale per terminare la transazione inattiva da tempo. Per ulteriori informazioni, consulta la documentazione di PostgreSQL
Il seguente messaggio verrà riportato nel file di log di PostgreSQL dopo l'interruzione della connessione, quando lo stato di una transazione è idle_in_transaction per un periodo superiore al tempo specificato.
FATAL: terminating connection due to idle in transaction timeout
Controllare lo stato di AUTOCOMMIT
AUTOCOMMIT è attivato per impostazione predefinita. Tuttavia accidentalmente se viene disattivato nel client, assicurati di riattivarlo.
-
Nel client psql, esegui il comando seguente:
postgres=>\set AUTOCOMMIT on -
In pgadmin, attivalo scegliendo l'opzione AUTOCOMMIT selezionando la freccia rivolta verso il basso.
Controllare la logica delle transazioni nel codice dell'applicazione
Controlla la logica dell'applicazione per individuare eventuali problemi. Prendi in considerazione le seguenti azioni:
-
Controlla se il commit automatico JDBC è impostato su true nell'applicazione. Inoltre, considera l'utilizzo di comandi
COMMITespliciti nel codice. -
Controlla la logica di gestione degli errori per vedere se chiude una transazione dopo gli errori.
-
Controlla se l'applicazione impiega molto tempo per elaborare le righe restituite da una query mentre la transazione è aperta. In tal caso, valuta la possibilità di codificare l'applicazione per chiudere la transazione prima di elaborare le righe.
-
Controlla se una transazione contiene molte operazioni di lunga durata. In tal caso, dividi la singola transazione in più transazioni.
Parametri rilevanti
A questo approfondimento sono correlati i seguenti parametri PI:
-
idle_in_transaction_count - Numero di sessioni nello stato
idle in transaction. -
idle_in_transaction_max_time - La durata della transazione in esecuzione più lunga nello stato
idle in transaction.