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

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

In diesem Artikel erfahren Sie, wie Sie schnell die Ursache einer hohen CPU-Auslastung identifizieren und mögliche Abhilfemaßnahmen zur Steuerung der CPU-Auslastung bei Verwendung von Azure Database für PostgreSQL flexiblen Server ausführen.

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

Die Verwendung der Anleitungen zur Problembehandlung, die im flexiblen Serverportal der Azure-Datenbank für PostgreSQL verfügbar ist, finden Sie die wahrscheinliche Ursache und Empfehlungen zur Entschärfung des hohen CPU-Szenarios.Using the feature troubleshooting guides which is available on the Azure Database for PostgreSQL flexible server portal the probable root cause and recommendations to the mitigate high CPU scenario can be found. 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. Daten für alle Benutzer, Datenbanken und Abfragen werden in einer Datenbank mit dem Namen azure_sys in der Azure-Datenbank für flexible Serverinstanz für PostgreSQL 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

Azure Database for PostgreSQL flexible Server bietet PgBouncer als integrierte Verbindungspoollösung 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>;