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 di attesa LWLock:MultiXactMemberBuffer, LWLock:MultiXactOffsetBuffer, LWLock:MultiXactMemberSLRU e LWLock:MultiXactOffsetSLRU indicano che una sessione è in attesa di recuperare un elenco di transazioni che modifica la stessa riga di una determinata tabella.
LWLock:MultiXactMemberBuffer: un processo è in attesa di I/O su un buffer semplice utilizzato meno di recente (SLRU) per un membro multixact.LWLock:MultiXactMemberSLRU: un processo è in attesa di accedere alla cache semplice utilizzata meno di recente (SLRU) per un membro multixact.LWLock:MultiXactOffsetBuffer: un processo è in attesa di I/O su un buffer semplice utilizzato meno di recente (SLRU) per un offset multixact.LWLock:MultiXactOffsetSLRU: un processo è in attesa di accedere alla cache semplice utilizzata meno di recente (SLRU) per un offset multixact.
Versioni del motore supportate
Queste informazioni relative all’evento di attesa sono supportate per tutte le versioni di Aurora PostgreSQL.
Contesto
Un multixact è una struttura dati che memorizza un elenco di ID transazione (XID) che modificano la stessa riga della tabella. Quando una singola transazione fa riferimento alla riga di una tabella, l’ID transazione viene memorizzato nella riga di intestazione della tabella. Quando più transazioni fanno riferimento alla stessa riga di una tabella, l’elenco degli ID transazione viene memorizzato nella struttura 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
Di seguito sono indicate tre cause comuni dell’uso di multixact:
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,SAVEPOINTe quindiUPDATE.Alcuni driver, ORM (Object-Relational Mapper) e livelli di astrazione dispongono di opzioni di configurazione per eseguire automaticamente il wrapping di tutte le operazioni con punti di salvataggio. Questo comportamento può generare molti eventi di attesa multixact in alcuni carichi di lavoro. L’opzione
autosavedel driver PostgreSQL JDBC ne è un esempio. Per ulteriori informazioni, consulta pgJDBCnella documentazione di PostgreSQL JDBC. Un altro esempio è il driver PostgreSQL ODBC e l’opzione protocol. Per ulteriori informazioni, consulta psqlODBC Configuration Options(Opzioni di configurazione di psqlODBC) nella documentazione del driver PostgreSQL ODBC. Sottotransazioni da clausole PL/pgSQL EXCEPTION: ogni clausola
EXCEPTIONscritta nelle funzioni o procedure PL/pgSQL crea internamente un oggettoSAVEPOINT.Chiavi esterne. Più transazioni acquisiscono un blocco di condivisione nel record padre.
Quando una determinata riga è inclusa in un’operazione con transazioni multiple, l’elaborazione della riga richiede il recupero degli ID transazione dagli elenchi 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. Questa operazione I/O dall’archiviazione significa che le query SQL 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 scalare il carico di lavoro.
Argomenti
Eseguire il congelamento del vacuum sulle tabelle con questo evento di attesa
Se questo evento di attesa si verifica all’improvviso e influisce sull’ambiente di produzione, è possibile utilizzare uno dei seguenti metodi temporanei per ridurne il numero.
-
Utilizzare VACUUM FREEZE sulla tabella o sulla partizione di tabella interessata per risolvere immediatamente il problema. Per ulteriori informazioni, consulta VACUUM
. -
Utilizzare la clausola VACUUM (FREEZE, INDEX_CLEANUP FALSE) per eseguire un processo di vacuum rapido saltando gli indici. Per ulteriori informazioni, consulta Vacuum di una tabella il più rapidamente possibile.
Aumentare la frequenza di autovacuum sulle tabelle con questo evento di attesa
Dopo aver scansionato tutte le tabelle in tutti i database, VACUUM rimuoverà infine i multixact e i relativi valori multixact meno recenti verranno avanzati. Per ulteriori informazioni, consulta Multixact e wraparound
Se l’utilizzo di VACUUM FREEZE sulla tabella o sulla partizione di tabella interessata risolve il problema dell’evento di attesa, è consigliabile utilizzare un pianificatore, ad esempio pg_cron, per eseguire VACUUM invece di regolare l’autovacuum a livello di istanza.
Per aumentare la frequenza di autovacuum, è possibile ridurre il valore del parametro di archiviazione autovacuum_multixact_freeze_max_age nella tabella interessata. Per ulteriori informazioni, consulta 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. Per iniziare, è consigliabile utilizzare i seguenti valori:
- Per Aurora PostgreSQL 17 e versioni successive:
-
multixact_offset_buffers= 128multixact_member_buffers= 256
- Per Aurora PostgreSQL 16 e versioni precedenti:
-
multixact_offsets_cache_size= 128multixact_members_cache_size= 256
Nota
In Aurora PostgreSQL 17, i nomi dei parametri vengono modificati da multixact_offsets_cache_size a multixact_offset_buffers e da multixact_members_cache_size a multixact_member_buffers per allinearli alla versione Community PostgreSQL 17.
È possibile impostare questi parametri a livello di cluster in modo che tutte le istanze del cluster rimangano coerenti. È consigliabile 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 scrittura affinché le modifiche ai parametri abbiano effetto.
I parametri sono espressi in termini di voci di cache multixact. Ogni voce di cache utilizza 8 KB di memoria. Per calcolare la memoria totale riservata, moltiplicare il valore di ogni parametro per 8 KB. Ad esempio, se si imposta un parametro su 128, la memoria riservata totale sarà 128 * 8 KB = 1 MB.
Ridurre le transazioni di lunga durata
Le transazioni di lunga durata fanno sì che le informazioni sulle transazioni vengano mantenute nel vacuum fino al commit 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. Provare a modificare l’applicazione per evitare o ridurre al minimo l’uso di transazioni di lunga durata.
Azioni a lungo termine
Esaminare il carico di lavoro per scoprire la causa dello spillover multixact. È necessario risolvere il problema per scalare il carico di lavoro e ridurre l’evento di attesa.
È necessario analizzare il DDL (Data Definition Language) utilizzato per creare le tabelle. Assicurarsi che le strutture e gli indici delle tabelle siano ben progettati.
Se le tabelle interessate hanno chiavi esterne, stabilire se sono necessarie o se esiste un altro modo per applicare l’integrità referenziale.
Quando una tabella ha indici inutilizzati di grandi dimensioni, l’autovacuum può non adattarsi al carico di lavoro e potrebbe impedirne l’esecuzione. Per evitare ciò, verificare la presenza di indici non utilizzati e rimuoverli completamente. Per ulteriori informazioni, consulta Gestione dell’autovacuum con indici di grandi dimensioni.
Ridurre l’uso di punti di salvataggio nelle transazioni.