Problembehandlung bei hoher CPU-Auslastung in Azure Database for PostgreSQL – Flexibler Server

GILT FÜR: Azure Database for PostgreSQL – Flexibler Server

In diesem Artikel wird gezeigt, wie Sie die Grundursache einer hohen CPU-Auslastung schnell identifizieren und mit welchen möglichen Abhilfemaßnahmen Sie die CPU-Auslastung bei Verwendung von Azure Database for PostgreSQL – Flexibler Server steuern können.

In diesem Artikel lernen Sie Folgendes:

  • Informationen zu Problembehandlungsleitfäden zum Identifizieren und Abrufen von Empfehlungen zur Entschärfung von Ursachen.
  • Informationen über Tools, mit denen Sie eine hohe CPU-Auslastung ermitteln könne, z. B. Azure-Metriken, der Abfragespeicher und pg_stat_statements
  • Identifizieren von Grundursachen, z. B. zeitintensive Abfragen und Gesamtverbindungen
  • Wie Sie eine hohe CPU-Auslastung mithilfe von Explain Analyze, Verbindungspooling und VACUUM-Befehlen für Tabellen beheben

Leitfäden zur Problembehandlung

In den Problembehandlungsleitfäden für Funktionen, die im Azure Database for PostgreSQL – flexibler Server-Portal verfügbar sind, können Sie die wahrscheinliche Ursache und Empfehlungen für das Entschärfungsszenario mit hoher CPU-Auslastung finden. Informationen dazu, wie Sie die Problembehandlungsleitfäden einrichten, finden Sie unter Einrichten von Problembehandlungsleitfäden.

Tools zum Ermitteln einer hohen CPU-Auslastung

Mit diesen Tools können Sie eine hohe CPU-Auslastung identifizieren.

Azure-Metriken

Azure-Metriken sind ein guter Ausgangspunkt, um die CPU-Auslastung für ein bestimmtes Datum und einen bestimmten Zeitraum zu prüfen. Metriken geben Informationen zur Zeitspanne, in der die CPU-Auslastung hoch ausfällt. Vergleichen Sie die Diagramme der Schreib-IOPs, der Lese-IOPs, des Lesedurchsatzes und des Schreibdurchsatzes mit der CPU-Auslastung, um herauszufinden, wann die Workload eine hohe CPU-Auslastung verursacht hat. Für die proaktive Überwachung können Sie Warnungen für die Metriken konfigurieren. Eine detaillierte Anleitung finden Sie unter Azure-Metriken.

Abfragespeicher

Der Abfragespeicher erfasst automatisch den Verlauf von Abfragen sowie Laufzeitstatistiken und bewahrt diese auf, damit Sie sie später überprüfen können. Es teilt die Daten nach Zeit auf, so dass Sie zeitliche Nutzungsmuster sehen können. Die Daten für alle Benutzer*innen, Datenbanken und Abfragen werden in einer Datenbank namens azure_sys in der Azure Database for PostgreSQL Flexible Server-Instanz gespeichert. Eine detaillierte Anleitung finden Sie unter Abfragespeicher.

pg_stat_statements

Die Erweiterung „pg_stat_statements“ hilft, Abfragen zu ermitteln, die Zeit auf dem Server nutzen.

Mittlere oder durchschnittliche Ausführungszeit

Verwenden Sie für Postgres-Version 13 und höher die folgende Anweisung, um die besten fünf SQL-Anweisungen nach Mittelwert oder durchschnittlicher Ausführungszeit anzuzeigen:

SELECT userid::regrole, dbid, query, mean_exec_time
FROM pg_stat_statements
ORDER BY mean_exec_time
DESC LIMIT 5;

Gesamtausführungszeit

Führen Sie die folgenden Anweisungen aus, um die besten fünf SQL-Anweisungen nach Gesamtausführungszeit anzuzeigen.

Verwenden Sie für Postgres-Version 13 und höher die folgende Anweisung, um die besten fünf SQL-Anweisungen nach Gesamtausführungszeit anzuzeigen:

SELECT userid::regrole, dbid, query
FROM pg_stat_statements
ORDER BY total_exec_time
DESC LIMIT 5;

Ermitteln von Grundursachen

Wenn die CPU-Auslastung im Allgemeinen hoch ausfällt, könnten folgende Gründe die möglichen Grundursachen sein:

Lang andauernde Transaktionen

Zeitintensive Transaktionen können CPU-Ressourcen nutzen, die zu einer hohen CPU-Auslastung führen können.

Die folgende Abfrage hilft beim Ermitteln der zeitintensivsten Verbindungen:

SELECT pid, usename, datname, query, now() - xact_start as duration
FROM pg_stat_activity
WHERE pid <> pg_backend_pid() and state IN ('idle in transaction', 'active')
ORDER BY duration DESC;

Gesamtanzahl der Verbindungen und Anzahl der Verbindungen nach Zustand

Eine hohe Anzahl von Datenbankverbindungen sind ein weiteres Problem, das zu einer erhöhten CPU- und Arbeitsspeicherauslastung führen kann.

Die folgende Abfrage gibt Informationen zur Anzahl der Verbindungen nach Zustand zurück:

SELECT state, count(*)
FROM  pg_stat_activity
WHERE pid <> pg_backend_pid()
GROUP BY 1 ORDER BY 1;

Beheben einer hohen CPU-Auslastung

Verwenden Sie Explain Analyze, PgBouncer und Verbindungspooling. Beenden Sie zudem zeitintensive Transaktionen, um eine hohe CPU-Auslastung zu beheben.

Verwenden von Explain Analyze

Sobald Sie die zeitintensive Abfrage kennen, verwenden Sie EXPLAIN, um die Abfrage weiter zu untersuchen und zu optimieren.
Weitere Informationen zum Befehl EXPLAIN erhalten Sie unter Explain.

PgBouncer und Verbindungspooling

In Situationen, in denen viele Leerlaufverbindungen oder viele Verbindungen vorhanden sind, die die CPU nutzen, sollten Sie einen Verbindungspooler wie PgBouncer verwenden.

Weitere Informationen zu PgBouncer finden Sie unter:

Verbindungspooling

Bewährte Methoden

Der flexible Server von Azure Database for PostgreSQL bietet PgBouncer als integrierte Lösung für das Verbindungspooling an. Weitere Informationen finden Sie unter PgBouncer.

Beenden zeitintensiver Transaktionen

Zeitintensive Transaktionen können beendet werden.

Um die PID einer Sitzung zu beenden, müssen Sie die PID mithilfe der folgenden Abfrage ermitteln:

SELECT pid, usename, datname, query, now() - xact_start as duration
FROM pg_stat_activity
WHERE pid <> pg_backend_pid() and state IN ('idle in transaction', 'active')
ORDER BY duration DESC;

Sie können auch nach anderen Eigenschaften wie usename (Benutzername), datname (Datenbankname) usw. filtern.

Wenn Sie die PID der Sitzung haben, können Sie sie mithilfe der folgenden Abfrage beenden:

SELECT pg_terminate_backend(pid);

Überwachen von Vakuum- und Tabellenstatistiken

Die Tabellenstatistiken auf dem neuesten Stand zu halten, hilft, die Abfrageleistung zu verbessern. Überwachen Sie, ob regelmäßige autovacuum-Vorgänge durchgeführt werden.

Die folgende Abfrage hilft Ihnen, Tabellen zu ermitteln, für die VACUUM-Vorgänge ausgeführt werden müssen:

select schemaname,relname,n_dead_tup,n_live_tup,last_vacuum,last_analyze,last_autovacuum,last_autoanalyze
from pg_stat_all_tables where n_live_tup > 0;

Die Spalten last_autovacuum und last_autoanalyze geben das Datum und die Uhrzeit an, an denen zuletzt ein autovacuum-Vorgang ausgeführt oder die Tabelle analysiert wurde. Wenn keine regelmäßigen VACUUM-Vorgänge für Tabellen ausgeführt werden, sollten Sie autovacuum-Vorgänge optimieren. Weitere Informationen zur Problembehandlung und Optimierung von „autovacuum“ finden Sie unter Problembehandlung von „autovacuum“.

Eine kurzfristige Lösung wäre eine manuelle VACUUM-Analyse der Tabellen, die langsame Abfragen aufweisen:

vacuum analyze <table_name>;