Direkt zum Inhalt

Wie kann ich Probleme lösen, die durch ein „lwlock:pg_stat_statements“-Warteereignis in Amazon RDS für PostgreSQL oder der Aurora PostgreSQL-kompatiblen Edition verursacht wurden?

Lesedauer: 4 Minute
0

Ich möchte die Leistungsprobleme lösen, die durch ein „lwlock:pg_stat_statements“-Warteereignis in meinem Amazon Relational Database Service (Amazon RDS) für PostgreSQL oder meiner Amazon Aurora PostgreSQL-kompatiblen Edition verursacht wurden.

Lösung

Das Modul pg_stat_statements verfolgt die Statistiken über SQL-Anweisungen. Für PostgreSQL-DB-Instances, die mit PostgreSQL 11 oder höher kompatibel sind, wird die Bibliothek pg_stat_statements standardmäßig geladen. Weitere Informationen findest du unter pg_stat_statements auf der PostgreSQL-Website.

Wenn die Anzahl der verfolgten eindeutigen Anweisungen den Wert pg_stat_statements.max überschreitet, gibt PostgreSQL die Statistiken für die am seltensten ausgeführten Abfragen aus der Hash-Tabelle im gemeinsamen Speicher frei. Die Freigabe schafft Platz für neue Einträge.

Während der Freigabe verwendet PostgreSQL LWLock für die Hash-Tabelle, um den gleichzeitigen Zugriff zu verhindern. Dadurch werden möglicherweise gleichzeitige Backend-Prozesse blockiert und in Performance Insights wird möglicherweise das Warteereignis lwlock:PG\ _stat\ _statements angezeigt.

Hinweis: Wenn die Hash-Tabelle häufig Einträge zuweist, kann sich die Gesamtleistung des Workloads verschlechtern.

Modul pg_stat_statements.max erhöhen

Um die LWLock:pg_stat_statements-Warteereignisse zu reduzieren, erhöhe den Wert pg_stat_statements.max in der Parametergruppe. Weitere Informationen findest du unter pg_stat_statements.max auf der PostgreSQL-Website.

Hinweis: Wenn du den Wert von pg_stat_statements.max erhöhst, verbraucht die Hash-Tabelle zusätzlichen gemeinsamen Speicher, um mehr SQL-Anweisungsinformationen zu speichern.

Für Amazon RDS für PostgreSQL kannst du pg_stat_statements.max in der DB-Parametergruppe ändern.

Für Aurora PostgreSQL-kompatible Editionen kannst du den Wert entweder in der DB-Cluster-Parametergruppe oder in der DB-Parametergruppe ändern.

Nachdem du pg_stat_statements.max in der Parametergruppe geändert hast, starte die DB-Instance neu, um die Änderung zu übernehmen. Während des Neustarts kommt es ggf. zu einem kurzen Ausfall. Weitere Informationen findest du unter Neustarten einer DB-Instance: grundlegende Schritte und Neustarten einer DB-Instance innerhalb eines Aurora-Clusters.

Du kannst Parameter in der Standard-DB-Parametergruppe oder der Standard-DB-Cluster-Parametergruppe nicht ändern. Um Parameter in Standardgruppen zu ändern, erstelle eine benutzerdefinierte DB-Parametergruppe oder eine benutzerdefinierte DB-Cluster-Parametergruppe. Ordne sie dann deiner DB-Instance oder deinem DB-Cluster zu.

Hinweis: Du kannst lange Abfragetexte in einer separaten Festplattendatei speichern. Wenn die Datei aufgrund der Abfragelänge oder der hohen pg_stat_statements.max-Werte zu groß wird, werden möglicherweise alle Abfragetexte verworfen. Dann sind die Felder pg_stat_statements.query ggf. leer. Weitere Informationen findest du unter pg_stat_statements -- track statistics of SQL planning and execution auf der PostgreSQL-Website.

„pg_stat_statements“-Einträge reduzieren

Es hat sich bewährt, PostgreSQL Version 17 zu verwenden, um die Einträge von pg_stat_statements zu reduzieren. Wenn du beispielsweise PostgreSQL Version 17 oder höher verwendest, kannst du konstante SAVEPOINT-Namen durch Platzhalter ersetzen. Beispielsweise kannst du SAVEPOINT sp1 und SAVEPOINT sp2 als zwei verschiedene pg_stat_statements-Einträge in früheren Versionen von PostgreSQL speichern. In PostgreSQL Version 17 oder höher werden diese beiden Anweisungen jedoch als ein Eintrag gespeichert, beispielsweise als SAVEPOINT $1. Weitere Informationen findest du unter pg_stat_statements auf der PostgreSQL-Website.

Wenn du kein Upgrade auf PostgreSQL Version 17 oder höher durchführen kannst, überprüfe, ob deine Anwendung, Object-Relational Mappers (ORMs) und Datenbanktreiber automatisch SQL wie SAVEPOINT-Befehle ausgeben. Diese automatischen SAVEPOINT-Befehle können die Anzahl der pg_stat_statements-Einträge erhöhen.

Prüfe, wie viele Freigaben stattgefunden haben

PostgreSQL Version 14 und höher

Um zu überprüfen, wie oft eine Freigabe insgesamt stattgefunden hat, überprüfe die dealloc-Spalte der Ansicht pg_stat_statements_info. Du kannst diese Informationen verwenden, um deine pg_stat_statements.max entsprechend anzupassen. Weitere Informationen findest du in der Ansicht pg_stat_statements_info auf der PostgreSQL-Website.

Um die Anzahl der Freigaben über einen bestimmten Zeitraum zu überprüfen, wähle regelmäßig die Ansicht pg_stat_statements_info aus und berechne dann die Differenz zu pg_stat_statements_info.dealloc.

Wenn du die Ansicht pg_stat_statements_info auswählst, erhältst du möglicherweise die Fehlermeldung „ERROR: relation 'pg_stat_statements_info' does not exist“. Dieser Fehler tritt auf, wenn pg_stat_statements nur in den Speicher geladen, aber nicht in deiner Datenbank installiert wird. Um diesen Fehler zu beheben, installiere die Erweiterung pg_stat_statements in der Datenbank, zu der deine Anwendung eine Verbindung herstellt. Stelle eine Verbindung zur Datenbank her und führe dann die folgende SQL-Anweisung aus, um pg_stat_statements in der Datenbank zu installieren:

CREATE EXTENSION pg_stat_statements;

Weitere Informationen findest du unter CREATE EXTENSION auf der PostgreSQL-Website.