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 Ereignisse LWLock:MultiXactMemberBuffer
LWLock:MultiXactOffsetBuffer
,LWLock:MultiXactMemberSLRU
, und LWLock:MultiXactOffsetSLRU
wait zeigen 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 Puffer (SLRU), der zuletzt verwendet wurde, für ein Multixact-Mitglied.LWLock:MultiXactMemberSLRU
— Ein Prozess wartet darauf, auf den einfachen Cache () für ein Multixact-Mitglied zuzugreifen. SLRULWLock:MultiXactOffsetBuffer
— Ein Prozess wartet auf I/O in einem einfachen Puffer, der zuletzt zuletzt verwendet wurde () für einen Multixact-Offset. SLRULWLock:MultiXactOffsetSLRU
— Ein Prozess wartet darauf, für einen Multixact-Offset auf den einfachen Cache, der zuletzt zuletzt benutzt wurde (), zuzugreifen. SLRU
Unterstützte Engine-Versionen
Diese Informationen zum Warteereignis werden für alle Versionen von Aurora Postgre SQL unterstützt.
Kontext
Ein Multixact ist eine Datenstruktur, die eine Liste von Transaktionen IDs (XIDs) speichert, die dieselbe Tabellenzeile ändern. Wenn eine einzelne Transaktion auf eine Zeile in einer Tabelle verweist, wird die Transaktions-ID in der Kopfzeile der Tabelle gespeichert. Wenn mehrere Transaktionen auf dieselbe Zeile in einer Tabelle verweisen, IDs wird die Liste der Transaktionen 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
Es gibt drei häufige Ursachen für die Verwendung von Multixact:
Untertransaktionen von expliziten Savepoints — Wenn Sie explizit einen Savepoint in Ihren Transaktionen erstellen, werden neue Transaktionen für dieselbe Zeile generiert. Verwenden Sie beispielsweise
SELECT FOR UPDATE
,SAVEPOINT
und dannUPDATE
.Einige Treiber, objektrelationale Mapper (ORMs) und Abstraktionsebenen verfügen über Konfigurationsoptionen zum automatischen Umschließen aller Operationen mit Savepoints. Dies kann bei einigen Workloads zu vielen Multixact-Warteereignissen führen. Die Option des SQL JDBC Postgre-Treibers ist ein Beispiel dafür.
autosave
Weitere Informationen finden Sie unter pg JDBCin der Postgre-Dokumentation. SQL JDBC Ein anderes Beispiel ist der SQL ODBC Postgre-Treiber und seine protocol
Option. Weitere Informationen finden Sie unter ODBCpsql-Konfigurationsoptionenin der Dokumentation zum Postgre-Treiber. SQL ODBC Untertransaktionen von SQL EXCEPTION PL/pG-Klauseln — Jede
EXCEPTION
Klausel, die Sie in Ihre SQL PL/pG-Funktionen oder -Prozeduren schreiben, erzeugt intern eine.SAVEPOINT
Fremdschlüssel – Mehrere Transaktionen erwerben eine Freigabesperre für den übergeordneten Datensatz.
Wenn eine bestimmte Zeile in einem Vorgang mit mehreren Transaktionen enthalten ist, muss für die Verarbeitung der Zeile die Transaktion aus den Auflistungen abgerufen werden. IDs multixact
Wenn durch Lookups der Multixact nicht aus dem Speichercache abgerufen werden kann, muss die Datenstruktur aus der Aurora-Speicherschicht gelesen werden. Diese I/O 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 Wartezeiten sofort zu reduzieren. Andere erfordern jedoch möglicherweise Untersuchungen und Korrekturen, um Ihre Arbeitslast zu skalieren.
Themen
Führen Sie mit diesem Wait-Event das Vakuumfrosten von Tischen durch
Wenn dieses Warteereignis plötzlich stark ansteigt und sich auf Ihre Produktionsumgebung auswirkt, können Sie eine der folgenden temporären Methoden verwenden, um die Anzahl der Ereignisse zu reduzieren.
-
Verwenden Sie VACUUMFREEZEes 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 _ CLEANUPFALSE), um ein schnelles Löschen durchzuführen, indem Sie die Indizes überspringen. Weitere Informationen finden Sie unter Schnellstes Löschen einer Tabelle.
Erhöhen Sie mit diesem Warteereignis die Häufigkeit des automatischen Absaugens von Tischen
Nach dem Scannen aller Tabellen in allen Datenbanken VACUUM werden die Multixacts irgendwann entfernt und ihre ältesten Multixact-Werte werden erweitert. Weitere Informationen finden Sie unter Multixacts und Wraparound.
Wenn das Problem mit dem Warteereignis durch die Verwendung VACUUM FREEZE auf der betroffenen Tabelle oder Tabellenpartition behoben wird, empfehlen wir, einen Scheduler zu verwendenpg_cron
, um das Autovacuum durchzuführen, VACUUM anstatt es auf Instance-Ebene anzupassen.
Damit das Autovakuieren häufiger erfolgt, können Sie den Wert des Speicherparameters autovacuum_multixact_freeze_max_age
in der betroffenen Tabelle reduzieren. Weitere Informationen finden Sie unter autovacuum_multixact_freeze_max_age
Erhöhen Sie die 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:
multixact_offsets_cache_size
bis 128multixact_members_cache_size
auf 256
Sie können diese Parameter auf Clusterebene 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 am besten entsprechen. Sie müssen die Writer-Instanz neu starten, damit die Parameteränderungen wirksam werden.
Die Parameter werden in Form von Multixact-Cache-Einträgen ausgedrückt. Jeder Cache-Eintrag belegt Speicherplatz8 KB
. Um den gesamten reservierten Speicher zu berechnen, multiplizieren Sie jeden Parameterwert mit8 KB
. Wenn Sie beispielsweise einen Parameter auf 128 setzen, wäre der gesamte reservierte Speicher128 * 8 KB = 1 MB
.
Reduzieren Sie lang andauernde Transaktionen
Eine lang andauernde Transaktion führt dazu, dass das Vakuum seine Informationen so lange aufbewahrt, bis die Transaktion festgeschrieben 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. Versuchen Sie, Ihre Anwendung so zu modifizieren, dass Sie lange laufende Transaktionen vermeiden oder minimieren.
Langfristige Maßnahmen
Untersuchen Sie Ihren Workload, um die Ursache für den Multixact-Spillover zu ermitteln. Sie müssen das Problem beheben, um Ihre Arbeitslast zu skalieren und Wartezeiten zu reduzieren.
Sie müssen die DDL (Datendefinitionssprache) analysieren, die zur Erstellung Ihrer Tabellen verwendet wurde. Stellen Sie sicher, dass die Tabellenstrukturen und Indizes gut gestaltet sind.
Wenn die betroffenen Tabellen Fremdschlüssel enthalten, stellen Sie fest, ob diese benötigt werden oder ob es eine andere Möglichkeit gibt, die referenzielle Integrität durchzusetzen.
Wenn eine Tabelle über große, ungenutzte Indizes verfügt, kann das dazu führen, dass Autovacuum nicht zu Ihrer Arbeitslast passt und die Ausführung möglicherweise blockiert wird. Um dies zu vermeiden, suchen Sie nach ungenutzten Indizes und entfernen Sie diese vollständig. Weitere Informationen finden Sie unter Autovacuum mit großen Indizes verwalten.
Reduzieren Sie die Verwendung von Savepoints bei Ihren Transaktionen.