Freigeben über


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 beschrieben, wie Sie die Grundursache einer hohen CPU-Auslastung ermitteln. Er enthält außerdem mögliche Abhilfemaßnahmen zur Steuerung der CPU-Auslastung bei Verwendung von Azure Database for PostgreSQL – Flexibler Server.

In diesem Artikel lernen Sie Folgendes:

  • Informationen zu Problembehandlungsleitfäden zum Identifizieren und Abrufen von Empfehlungen zur Entschärfung von Ursachen.
  • Informationen zu Tools, mit denen Sie eine hohe CPU-Auslastung ermitteln können, z. B. Azure-Metriken, Abfragespeicher und pg_stat_statements
  • Identifizieren von Grundursachen, z. B. zeitintensive Abfragen und Gesamtverbindungen
  • Beheben einer hohen CPU-Auslastung mithilfe von EXPLAIN ANALYZE, Verbindungspooling und VACUUM-Befehlen für Tabellen

Leitfäden zur Problembehandlung

Mithilfe der Leitfäden zur Problembehandlung können Sie die wahrscheinliche Grundursache eines Szenarios mit hoher CPU-Auslastung identifizieren, und Sie können Empfehlungen lesen, um das ermittelte Problem zu beheben.

Zum Einrichtung der Problembehandlung und zum Verwenden der Leitfäden befolgen Sie die Anweisungen zur Einrichtung der Problembehandlung.

Tools zum Ermitteln einer hohen CPU-Auslastung

Verwenden Sie ggf. die folgenden Tools zur Identifizierung einer hohen CPU-Auslastung.

Metriken in Azure

Azure-Metriken sind ein guter Ausgangspunkt, um die CPU-Auslastung für einen bestimmten Zeitraum zu prüfen. Metriken enthalten Informationen zu den Ressourcen, die während der Zeit der hohen CPU-Auslastung genutzt werden. Vergleichen Sie die Diagramme für Schreib-IOPs, Lese-IOPs, Lesedurchsatz Bytes/Sekunde und Schreibdurchsatz Bytes/Sekunde mit CPU-Prozentsatz, 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. Er teilt die Daten nach Zeit auf, so dass Sie zeitliche Nutzungsmuster sehen können. Die Daten für alle Benutzer, Datenbanken und Abfragen werden in einer Datenbank namens azure_sys in der Instanz von Azure Database for PostgreSQL – Flexibler Server gespeichert.

Im Abfragespeicher können Informationen zu Warteereignissen den Abfragelaufzeitstatistiken zugeordnet werden. Verwenden Sie den Abfragespeicher, um Abfragen zu identifizieren, die während des relevanten Zeitraums viel CPU verbrauchen.

Weitere Informationen finden Sie unter Abfragespeicher.

pg_stat_statements

Die Erweiterung pg_stat_statements hilft, Abfragen zu ermitteln, die Zeit auf dem Server in Anspruch nehmen. Weitere Informationen zu dieser Erweiterung finden in der Dokumentation.

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 kann ebenfalls zu einer erhöhten CPU- und Arbeitsspeicherauslastung führen.

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 state
ORDER BY state ASC;

Beheben einer hohen CPU-Auslastung

Verwenden Sie EXPLAIN ANALYZE, ziehen Sie die Verwendung der integrierten PgBouncer-Verbindungspoolfunktion in Erwägung, und beenden Sie zeitintensive Transaktionen, um eine hohe CPU-Auslastung zu beheben.

Verwenden von EXPLAIN ANALYZE

Sobald Sie die Abfragen kennen, die mehr CPU verbrauchen, verwenden Sie EXPLAIN ANALYZE, um sie weiter zu untersuchen und zu optimieren.

Weitere Informationen zum Befehl EXPLAIN ANALYZE finden Sie in der entsprechenden Dokumentation.

PgBouncer, eine integrierte Verbindungspoolfunktion

In Situationen, in denen es viele kurzlebige Verbindungen oder viele Verbindungen gibt, die den Großteil ihrer Lebensdauer im Leerlauf bleiben, sollten Sie eine Verbindungspoolfunktion wie PgBouncer verwenden.

Weitere Informationen zu PgBouncer finden Sie in den Artikeln zur Verbindungspoolfunktion und zu bewährten Methoden für die Verbindungsverarbeitung mit PostgreSQL.

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>;

Teilen Sie Ihre Vorschläge und Fehler mit dem Azure Database for PostgreSQL-Produktteam.