LWLock:MultiXact - Amazon Aurora

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:MultiXactMemberBufferLWLock: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, 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

Ein Multixact ist eine Datenstruktur, die eine Liste von Transaction 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 dann UPDATE.

    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 autosave-Option des PostgreSQL-JDBC-Treibers ist ein Beispiel dafür. Weitere Informationen finden Sie unter pgJDBC in der PostgreSQL-JDBC-Dokumentation. Ein anderes Beispiel ist der PostgreSQL-ODBC-Treiber und seine protocol-Option. Weitere Informationen finden Sie unter psqlODBC-Konfigurationsoptionen in der Dokumentation zu PostgreSQL-ODBC-Treibern.

  • Untertransaktionen von PL/pgSQL EXCEPTION-Klauseln — Jede EXCEPTION Klausel, die Sie in Ihre PL/pgSQL-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. 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 Wartezeiten sofort zu reduzieren. Andere erfordern jedoch möglicherweise Untersuchungen und Korrekturen, um Ihre Arbeitslast zu skalieren.

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 VACUUM FREEZE für die betroffene Tabelle oder Tabellenpartition, um das Problem sofort zu beheben. Weitere Informationen finden Sie unter VACUUM.

  • Verwenden Sie die VACUUM-Klausel (FREEZE, INDEX_CLEANUP FALSE), um ein schnelles Vakuum 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 entfernt VACUUM schließlich Multixacts, und ihre ältesten Multixact-Werte werden weiterverwendet. Weitere Informationen finden Sie unter Multixacts und Wraparound. Um die Ereignisse LWLock: MultiXact wait auf ein Minimum zu beschränken, müssen Sie VACUUM so oft wie nötig ausführen. Stellen Sie dazu sicher, dass das VACUUM in Ihrem Aurora PostgreSQL-DB-Cluster optimal konfiguriert ist.

Wenn die Verwendung von VACUUM FREEZE für die betroffene Tabelle oder Tabellenpartition das Problem mit dem Warteereignis behebt, empfehlen wir, einen Scheduler zu verwenden, z. B. um VACUUM durchzuführenpg_cron, anstatt das Autovacuum auf Instance-Ebene anzupassen.

Damit das Autovakuieren häufiger stattfindet, 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:

Für Aurora PostgreSQL 17 und höher:
  • multixact_offset_buffers= 128

  • multixact_member_buffers= 256

Für Aurora PostgreSQL 16 und früher:
  • multixact_offsets_cache_size= 128

  • multixact_members_cache_size= 256

Anmerkung

In Aurora PostgreSQL 17 wurden die Parameternamen von bis multixact_offset_buffers und von bis geändertmultixact_offsets_cache_size, um sie multixact_members_cache_size an multixact_member_buffers die Community 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 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 (Data Definition Language) 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.