Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
LWLock:MultiXact
Die Warteereignisse LWLock:MultiXactMemberBuffer, LWLock:MultiXactOffsetBuffer, LWLock:MultiXactMemberSLRU und LWLock:MultiXactOffsetSLRU geben an, dass eine Sitzung darauf wartet, eine Liste von Transaktionen abzurufen, die dieselbe Zeile in einer bestimmten Tabelle ändern.
LWLock:MultiXactMemberBuffer– Ein Prozess wartet auf I/O in einem einfachen, am wenigsten zuletzt verwendeten (SLRU) Puffer für ein Multixact-Mitglied.LWLock:MultiXactMemberSLRU– Ein Prozess wartet darauf, auf den einfachen, am wenigsten zuletzt verwendeten (SLRU) Cache für ein Multixact-Mitglied zuzugreifen.LWLock:MultiXactOffsetBuffer– Ein Prozess wartet auf I/O in einem einfachen, am wenigsten zuletzt verwendeten (SLRU) Puffer für ein Multixact-Offset.LWLock:MultiXactOffsetSLRU– Ein Prozess wartet darauf, auf den einfachen, am wenigsten zuletzt verwendeten (SLRU) Cache für ein Multixact-Offset zuzugreifen.
Unterstützte Engine-Versionen
Diese Warteereignisinformationen werden für alle Versionen von Aurora PostgreSQL unterstützt.
Kontext
Multixact ist eine Datenstruktur, die eine Liste von Transaktions-IDs (XIDs) speichert, welche dieselbe Tabellenzeile ändern. Wenn eine einzelne Transaktion auf eine Zeile in einer Tabelle verweist, wird die Transaktions-ID in der Kopfzeile der Tabelle gespeichert. Verweisen mehrere Transaktionen auf dieselbe Zeile in einer Tabelle, wird die Liste der Transaktions-IDs in der Multixact-Datenstruktur gespeichert. Die Multixact-Warteereignisse geben an, dass eine Sitzung die Liste der Transaktionen, die sich auf eine bestimmte Zeile in einer Tabelle beziehen, aus der Datenstruktur abruft.
Wahrscheinliche Ursachen für erhöhte Wartezeiten
3 häufige Ursachen für die Verwendung von Multixact sind die folgenden:
Untertransaktionen expliziter Savepoints – Wenn Sie explizit einen Savepoint in Ihren Transaktionen erstellen, werden neue Transaktionen für dieselbe Zeile generiert. Verwenden Sie beispielsweise
SELECT FOR UPDATE,SAVEPOINTund dannUPDATE.Einige Treiber, objektrelationale Mappers (ORMs) und Abstraktionsschichten verfügen über Konfigurationsoptionen, um alle Operationen automatisch mit Savepoints zu umschließen. Dies kann bei einigen Workloads zu vielen Multixact-Warteereignissen führen. Die
autosave-Option des PostgreSQL-JDBC-Treibers ist ein Beispiel dafür. Weitere Informationen finden Sie unter pgJDBCin der PostgreSQL-JDBC-Dokumentation. Ein anderes Beispiel ist der PostgreSQL-ODBC-Treiber und seine protocol-Option. Weitere Informationen finden Sie unter psqlODBC-Konfigurationsoptionenin der Dokumentation zu PostgreSQL-ODBC-Treibern. Untertransaktionen von PL/pgSQL-EXCEPTION-Klauseln – Jede
EXCEPTION-Klausel, die Sie in Ihren PL/pgSQL-Funktionen oder -Prozeduren schreiben, erstellt intern einenSAVEPOINT.Fremdschlüssel – Mehrere Transaktionen erwerben eine Freigabesperre für den übergeordneten Datensatz.
Wenn eine bestimmte Zeile in einer Operation mit mehreren Transaktionen enthalten ist, müssen für die Verarbeitung der Zeile die Transaktions-IDs aus den multixact-Auflistungen abgerufen werden. Wenn durch Lookups der Multixact nicht aus dem Speichercache abgerufen werden kann, muss die Datenstruktur aus der Aurora-Speicherschicht gelesen werden. Dieser I/O-Vorgang aus dem Speicher bedeutet, dass SQL-Abfragen länger dauern können. Speicher-Cache-Fehler können bei starker Auslastung aufgrund einer großen Anzahl von mehreren Transaktionen auftreten. All diese Faktoren tragen zu einer Zunahme dieses Warteereignisses bei.
Aktionen
Abhängig von den Ursachen Ihres Warteereignisses empfehlen wir verschiedene Aktionen. Einige dieser Aktionen können dazu beitragen, die Warteereignisse sofort zu reduzieren. Andere erfordern jedoch möglicherweise eine Untersuchung und Korrektur, um Ihren Workload zu skalieren.
Themen
Durchführen einer Bereinigungseinfrierung auf Tabellen mit diesem Warteereignis
Wenn die Anzahl dieses Warteereignisses plötzlich stark ansteigt und sich auf Ihre Produktionsumgebung auswirkt, können Sie eine der folgenden temporären Methoden verwenden, um die Anzahl zu reduzieren.
-
Verwenden Sie VACUUM FREEZE für die betroffene Tabelle oder Tabellenpartition, um das Problem sofort zu beheben. Weitere Informationen finden Sie unter VACUUM
. -
Verwenden Sie die Klausel VACUUM (FREEZE, INDEX_CLEANUP FALSE), um eine schnelle Bereinigung durch Überspringen von Indizes durchzuführen. Weitere Informationen finden Sie unter Möglichst schnelles Bereinigen einer Tabelle.
Erhöhen der Häufigkeit der Selbstbereinigung in Tabellen mit diesem Warteereignis
Nach dem Scannen aller Tabellen in allen Datenbanken entfernt die VACUUM-Operation schließlich Multixacts, wobei die ältesten Multixact-Werte weiterverwendet werden. Weitere Informationen finden Sie unter Multixacts und Wraparound
Wenn die Verwendung von VACUUM FREEZE für die betroffene Tabelle oder Tabellenpartition das Problem mit dem Warteereignis behebt, empfehlen wir, einen Scheduler wie pg_cron für die VACUUM-Durchführung zu verwenden, anstatt den Selbstbereinigung auf Instance-Ebene anzupassen.
Damit die Selbstbereinigung häufiger stattfindet, können Sie den Wert des autovacuum_multixact_freeze_max_age-Speicherparameters in der betroffenen Tabelle reduzieren. Weitere Informationen finden Sie unter autovacuum_multixact_freeze_max_age
Erhöhen der Speicherparameter
Sie können die Speichernutzung für Multixact-Caches optimieren, indem Sie die folgenden Parameter anpassen. Diese Einstellungen steuern, wie viel Speicher für diese Caches reserviert wird. Dies kann dazu beitragen, Multixact-Warteereignisse in Ihrem Workload zu reduzieren. Wir empfehlen, mit den folgenden Werten zu beginnen:
- Für Aurora PostgreSQL 17 und höher:
-
multixact_offset_buffers= 128multixact_member_buffers= 256
- Für Aurora PostgreSQL 16 und niedriger:
-
multixact_offsets_cache_size= 128multixact_members_cache_size= 256
Anmerkung
In Aurora PostgreSQL 17 wurden Parameternamen von multixact_offsets_cache_size in multixact_offset_buffers und von multixact_members_cache_size in multixact_member_buffers geändert, um sie an die Community von PostgreSQL 17 anzupassen.
Sie können diese Parameter auf Cluster-Ebene festlegen, sodass alle Instances in Ihrem Cluster konsistent bleiben. Wir empfehlen Ihnen, die Werte zu testen und anzupassen, damit sie Ihren spezifischen Workload-Anforderungen und Ihrer Instance-Klasse optimal entsprechen. Sie müssen die Writer-Instance neu starten, damit die Parameteränderung wirksam wird.
Die Parameter werden in Form von Multixact-Cache-Einträgen ausgedrückt. Jeder Cache-Eintrag belegt Speicherplatz Höhe von 8 KB. Um den gesamten reservierten Speicher zu berechnen, multiplizieren Sie jeden Parameterwert mit 8 KB. Wenn Sie beispielsweise einen Parameter auf 128 setzen, beträgt der gesamte reservierte Speicher 128 * 8 KB = 1 MB.
Reduzieren von Transaktionen mit langer Laufzeit
Transaktionen mit langer Laufzeit führen dazu, dass der Bereinigungsprozess Informationen beibehält, bis die Transaktion bestätigt oder die schreibgeschützte Transaktion geschlossen wird. Wir empfehlen, langlebige Transaktionen proaktiv zu überwachen und zu verwalten. Weitere Informationen finden Sie unter Die Datenbank läuft seit langem inaktiv in Transaktionsverbindung. Ändern Sie Ihre Anwendung, wenn möglich, um die Verwendung von Transaktionen mit langer Laufzeit zu vermeiden oder zu minimieren.
Langfristige Aktionen
Untersuchen Sie Ihren Workload, um die Ursache für den Multixact-Überlauf zu ermitteln. Sie müssen das Problem beheben, um Ihren Workload zu skalieren und Warteereignisse zu reduzieren.
Sie müssen die DDL (Datendefinitionssprache) analysieren, die zum Erstellen Ihrer Tabellen verwendet wurde. Stellen Sie sicher, dass die Tabellenstrukturen und Indizes optimal gestaltet sind.
Wenn die betroffenen Tabellen Fremdschlüssel enthalten, ermitteln Sie, ob sie benötigt werden oder ob es eine andere Möglichkeit gibt, die referenzielle Integrität durchzusetzen.
Wenn eine Tabelle große, ungenutzte Indizes enthält, kann das dazu führen, dass der Selbstbereinigungsvorgang nicht zu Ihrem Workload passt und die Ausführung möglicherweise blockiert. Um dies zu vermeiden, suchen Sie nach ungenutzten Indizes und entfernen Sie diese vollständig. Weitere Informationen finden Sie unter Verwalten der automatischen Bereinigung mit großen Indizes.
Reduzieren Sie die Verwendung von Savepoints in Ihren Transaktionen.