LWLock:MultiXact - Amazon Aurora

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

LWLock:MultiXact

Gli eventi LWLock:MultiXactMemberBufferLWLock:MultiXactOffsetBuffer,LWLock:MultiXactMemberSLRU, e LWLock:MultiXactOffsetSLRU wait indicano che una sessione è in attesa di recuperare un elenco di transazioni che modifica la stessa riga in una determinata tabella.

  • LWLock:MultiXactMemberBuffer— Un processo è in attesa di I/O su un semplice buffer (SLRU) utilizzato meno di recente per un membro multixact.

  • LWLock:MultiXactMemberSLRU— Un processo è in attesa di accedere alla cache semplice usata meno di recente () per un membro multixact. SLRU

  • LWLock:MultiXactOffsetBuffer— Un processo è in attesa di I/O su un semplice buffer () usato l'ultima volta () per un offset multixact. SLRU

  • LWLock:MultiXactOffsetSLRU— Un processo è in attesa di accedere alla cache semplice usata meno di recente () per un offset multixact. SLRU

Versioni del motore supportate

Queste informazioni sugli eventi di attesa sono supportate per tutte le versioni di Aurora Postgre. SQL

Context

Un multixact è una struttura di dati che memorizza un elenco di transazioni IDs (XIDs) che modificano la stessa riga della tabella. Quando una singola transazione fa riferimento a una riga in una tabella, l'ID della transazione viene memorizzato nella riga di intestazione della tabella. Quando più transazioni fanno riferimento alla stessa riga in una tabella, l'elenco delle transazioni IDs viene memorizzato nella struttura di dati multixact. Gli eventi di attesa multixact indicano che una sessione sta recuperando dalla struttura dei dati l'elenco delle transazioni che fanno riferimento a una determinata riga di una tabella.

Probabili cause di aumento delle attese

Le tre cause più comuni dell'uso di multixact sono le seguenti:

  • Sottotransazioni da punti di salvataggio espliciti: la creazione esplicita di un punto di salvataggio nelle transazioni genera nuove transazioni per la stessa riga. Ad esempio, utilizzando SELECT FOR UPDATE, SAVEPOINT e quindi UPDATE.

    Alcuni driver, object relational mapper (ORMs) e layer di astrazione dispongono di opzioni di configurazione per includere automaticamente tutte le operazioni con punti di salvataggio. Questo comportamento può generare molti eventi di attesa multixact in alcuni carichi di lavoro. L'opzione SQL JDBC Postgre Driver ne è un esempio. autosave Per ulteriori informazioni, consulta pg JDBC nella documentazione di SQL JDBC Postgre. Un altro esempio è il SQL ODBC driver Postgre e la sua opzione. protocol Per ulteriori informazioni, consulta le opzioni di ODBC configurazione di psql nella documentazione del driver SQL ODBC Postgre.

  • Sottotransazioni da SQL EXCEPTION clausole PL/pg — Ogni EXCEPTION clausola che scrivi nelle funzioni o procedure PL/pg ne crea una internamente. SQL SAVEPOINT

  • Chiavi esterne. Più transazioni acquisiscono un blocco di condivisione nel record padre.

Quando una determinata riga è inclusa in un'operazione di transazione multipla, l'elaborazione della riga richiede il recupero della transazione dalle inserzioni. IDs multixact Se le ricerche non riescono a ottenere il multixact dalla cache di memoria, la struttura dei dati deve essere letta dal livello di archiviazione di Aurora. Questo I/O proveniente dallo storage significa che le SQL query possono richiedere più tempo. Gli errori nella cache di memoria possono iniziare a verificarsi con l'utilizzo intensivo, a causa del numero elevato di transazioni multiple. Tutti questi fattori contribuiscono ad un aumento di questo evento di attesa.

Azioni

Consigliamo azioni diverse a seconda delle cause dell'evento di attesa. Alcune di queste azioni possono aiutare a ridurre immediatamente gli eventi di attesa. Tuttavia, altre potrebbero richiedere indagini e correzioni per aumentare il carico di lavoro.

Esegui il congelamento sottovuoto sui tavoli con questo evento di attesa

Se questo evento di attesa si verifica improvvisamente e influisce sull'ambiente di produzione, puoi utilizzare uno dei seguenti metodi temporanei per ridurne il numero.

  • VACUUMFREEZEUtilizzatelo sulla tabella o sulla partizione di tabella interessata per risolvere immediatamente il problema. Per ulteriori informazioni, consulta VACUUM.

  • Utilizzate la clausola VACUUM (FREEZE, INDEX _ CLEANUPFALSE) per eseguire un vacuo rapido saltando gli indici. Per ulteriori informazioni, vedere Aspirare una tabella il più rapidamente possibile.

Aumenta la frequenza di aspirazione automatica sui tavoli con questo evento di attesa

Dopo aver analizzato tutte le tabelle in tutti i database, alla fine VACUUM rimuoverà i multixact e i loro valori multixact più vecchi verranno aggiornati. Per ulteriori informazioni, vedere Multixacts e Wraparound. Per ridurre al minimo gli eventiLWLock: MultiXact wait, è necessario eseguirli tutte le VACUUM volte che è necessario. Per fare ciò, assicurati che il cluster Aurora Postgre SQL DB sia configurato VACUUM in modo ottimale.

Se l'utilizzo VACUUM FREEZE sulla tabella o sulla partizione di tabella interessata risolve il problema dell'evento di attesa, consigliamo di utilizzare uno scheduler, ad esempio, per eseguire VACUUM invece di regolare l'pg_cronautovacuum a livello di istanza.

Affinché l'autovacuum avvenga più frequentemente, puoi ridurre il valore del parametro di archiviazione nella tabella interessata. autovacuum_multixact_freeze_max_age Per ulteriori informazioni, vedere autovacuum_multixact_freeze_max_age.

Aumentare i parametri di memoria

È possibile ottimizzare l'utilizzo della memoria per le cache multixact regolando i seguenti parametri. Queste impostazioni controllano la quantità di memoria riservata a queste cache, il che può aiutare a ridurre gli eventi di attesa multixact nel carico di lavoro. Ti consigliamo di iniziare con i seguenti valori:

  • multixact_offsets_cache_sizefino a 128

  • multixact_members_cache_sizefino a 256

È possibile impostare questi parametri a livello di cluster in modo che tutte le istanze del cluster rimangano coerenti. Ti consigliamo di testare e modificare i valori per adattarli al meglio ai requisiti specifici del carico di lavoro e alla classe di istanza. È necessario riavviare l'istanza di writer per rendere effettive le modifiche ai parametri.

I parametri sono espressi in termini di voci di cache multixact. Ogni voce della cache utilizza memoria8 KB. Per calcolare la memoria totale riservata, moltiplica il valore di ogni parametro per8 KB. Ad esempio, se imposti un parametro su 128, la memoria riservata totale sarebbe128 * 8 KB = 1 MB.

Riduci le transazioni di lunga durata

Una transazione di lunga durata fa sì che il vuoto conservi le proprie informazioni fino al completamento della transazione o fino alla chiusura della transazione di sola lettura. Ti consigliamo di monitorare e gestire in modo proattivo le transazioni di lunga durata. Per ulteriori informazioni, consulta Il database ha una connessione di transazione inattiva da molto tempo. Prova a modificare l'applicazione per evitare o ridurre al minimo l'uso di transazioni di lunga durata.

Azioni a lungo termine

Esamina il tuo carico di lavoro per scoprire la causa dello spillover multixact. È necessario risolvere il problema per scalare il carico di lavoro e ridurre l'attesa.

  • È necessario analizzare il DDL (linguaggio di definizione dei dati) utilizzato per creare le tabelle. Assicurati che le strutture e gli indici delle tabelle siano ben progettati.

  • Se le tabelle interessate hanno chiavi esterne, stabilite se sono necessarie o se esiste un altro modo per applicare l'integrità referenziale.

  • Quando una tabella ha indici inutilizzati di grandi dimensioni, autovacuum può non adattarsi al carico di lavoro e potrebbe impedirne l'esecuzione. Per evitare ciò, verifica la presenza di indici non utilizzati e rimuovili completamente. Per ulteriori informazioni, consulta Gestire l'autovacuum con indici di grandi dimensioni.

  • Riduci l'uso dei savepoint nelle tue transazioni.