Wie kann ich eine hohe CPU-Auslastung auf meiner Amazon RDS for MySQL- oder Amazon Aurora MySQL-Instance beheben?

Lesedauer: 9 Minute
0

Ich erlebe eine hohe CPU-Auslastung auf meinen Amazon Relational Database Service (Amazon RDS) für MySQL DB-Instances oder meinen Amazon Aurora MySQL-Compatible Edition-Instances. Wie kann ich Fehler beheben und eine hohe CPU-Auslastung beheben?

Kurzbeschreibung

Eine Erhöhung der CPU-Auslastung kann durch verschiedene Faktoren verursacht werden, beispielsweise durch vom Benutzer initiierte hohe Workloads, mehrere gleichzeitige Abfragen oder lang laufende Transaktionen.

Um die Quelle der CPU-Auslastung in Ihrer Amazon RDS for MySQL-Instance zu ermitteln, überprüfen Sie die folgenden Ansätze:

  • Erweiterte Überwachung
  • Performance Insights
  • Abfragen, die die Ursache der CPU-Auslastung in der Workload ermitteln
  • Protokolle mit aktivierter Überwachung

Nachdem Sie die Quelle identifiziert haben, können Sie Ihre Workload analysieren und optimieren, um die CPU-Auslastung zu reduzieren.

Behebung

Verwendung der Erweiterten Überwachung

Die erweiterte Überwachung bietet eine Ansicht auf Betriebssystem (OS)-Ebene. Diese Ansicht kann helfen, die Ursache einer hohen CPU-Last auf einer granularen Ebene zu identifizieren. Sie können beispielsweise den Lastdurchschnitt, die CPU-Verteilung (System% oder Nice%) und die Liste der Betriebssystemprozesse überprüfen.

Mit Enhanced Überwachung können Sie die loadAverageMinute-Daten in Intervallen von 1, 5 und 15 Minuten überprüfen. Ein Lastdurchschnitt, der über der Anzahl der vCPUs liegt, weist darauf hin, dass die Instance stark ausgelastet ist. Wenn der Lastdurchschnitt unter der Anzahl der vCPUs für die DB-Instance-Klasse liegt, wird die Anwendungslatenz wahrscheinlich nicht durch CPU-Drosselung verursacht. Überprüfen Sie bei der Diagnose der Ursache der CPU-Auslastung den Lastdurchschnitt, um Fehlalarme zu vermeiden.

Wenn Sie beispielsweise eine DB-Instance haben, die eine db.m5.2xlarge Instance-Klasse mit 3000 bereitgestellten IOPS verwendet, die das CPU-Limit erreicht, können Sie anhand der folgenden Beispielmetriken die Hauptursache für die hohe CPU-Auslastung ermitteln. Im folgenden Beispiel sind der Instance-Klasse acht vCPUs zugeordnet. Für den gleichen Lastdurchschnitt bedeutet ein Wert über 170, dass die Maschine während des gemessenen Zeitraums einer starken Belastung ausgesetzt war:

Lastdurchschnitt (Minute)

Fünfzehn170,25
Fünf391,31
Eins596,74

CPU-Auslastung

Benutzer (%)0,71
System (%)4,9
Nice (%)93,92
Insgesamt (%)99,97

**Hinweis:**Amazon RDS gibt Ihrem Workload eine höhere Priorität gegenüber anderen Aufgaben, die auf der DB-Instance ausgeführt werden. Um diese Aufgaben zu priorisieren, haben Workload-Aufgaben einen höheren Nice-Wert. Daher steht Nice% in Erweiterter Überwachung für die Menge an CPU, die von Ihrem Workload für die Datenbank verwendet wird.

Nachdem Sie Erweiterte Überwachung aktiviert haben, können Sie auch die Liste der Betriebssystemprozesse überprüfen, die der DB-Instance zugeordnet ist. Die Erweiterte Überwachung zeigt maximal 100 Prozesse an. Auf diese Weise können Sie anhand der CPU- und Speicherauslastung ermitteln, welche Prozesse den größten Einfluss auf die Leistung haben.

Überprüfen Sie im Abschnitt mit der Prozessliste des Betriebssystems (OS) von Erweiterte Überwachung die Betriebssystemprozesse und RDS-Prozesse. Bestätigen Sie den Prozentsatz der CPU-Auslastung eines mysqld- oder Aurora-Prozesses. Anhand dieser Metriken können Sie überprüfen, ob der Anstieg der CPU-Auslastung durch Betriebssystem- oder RDS-Prozesse verursacht wird. Sie können diese Metriken auch verwenden, um jeden Anstieg der CPU-Auslastung zu überwachen, der durch mysqld oder Aurora verursacht wird. Sie können sich auch die Aufteilung der CPU-Auslastung ansehen, indem Sie die Metriken für cpuUtilization überprüfen. Weitere Informationen finden Sie unter Überwachen von Betriebssystem-Metriken mit Erweitertet Überwachung.

**Hinweis:**Wenn Sie das Leistungsschema aktivieren, können Sie die Betriebssystem-Thread-ID der Prozess-ID Ihrer Datenbank zuordnen. Weitere Informationen finden Sie unter Warum verwendet meine Instance in Amazon RDS Swap-Speicher, obwohl ich über ausreichend Speicher verfüge?

Verwenden von Performance Insights

Sie können Performance Insights verwenden, um die genauen Abfragen zu identifizieren, die auf der Instance ausgeführt werden und eine hohe CPU-Auslastung verursachen. Aktivieren Sie zunächst Performance Insights for MySQL. Anschließend können Sie Performance Insights verwenden, um Ihre Workload zu optimieren. Konsultieren Sie unbedingt Ihren DBA.

Informationen zu Datenbank-Engines, die Sie mit Performance Insights verwenden können, finden Sie unter Überwachen der DB-Auslastung mit Performance Insights auf Amazon RDS.

Verwenden von Abfragen zur Erkennung der Ursache der CPU-Auslastung in der Workload

Bevor Sie Ihre Workload optimieren können, müssen Sie die problematische Abfrage identifizieren. Sie können die folgenden Abfragen ausführen, während das Problem mit der hohen CPU-Auslastung auftritt, um die Ursache der CPU-Auslastung zu ermitteln. Optimieren Sie dann Ihre Workload, um Ihre CPU-Auslastung zu reduzieren.

Der Befehl PROZESSLISTE ANZEIGEN zeigt Ihnen die Threads, die derzeit auf Ihrer MySQL-Instance ausgeführt werden. Manchmal kann es vorkommen, dass dieselben Anweisungen ohne Abschluss weiterlaufen. In diesem Fall müssen die nachfolgenden Anweisungen warten, bis der erste Satz von Anweisungen abgeschlossen ist. Dies liegt daran, dass das Sperren auf InnoDB-Zeilenebene möglicherweise dieselben Zeilen aktualisiert. Weitere Informationen finden Sie unter PROZESSLISTE ANZEIGEN-Anweisung auf der MySQL-Website.

SHOW FULL PROCESSLIST;

**Hinweis:**Führen Sie die PROZESSLISTE ANZEIGEN-Abfrage als primärer Systembenutzer aus. Wenn Sie nicht der primäre Systembenutzer sind, müssen Sie über MySQL PROZESS-Serveradministrationsrechte verfügen, um alle Threads sehen zu können, die auf einer MySQL-Instance ausgeführt werden. Wenn Sie keine Administratorrechte haben, zeigt PROZESSLISTE ANZEIGEN nur die Threads an, die mit dem von Ihnen verwendeten MySQL-Konto verknüpft sind.

Die Tabelle INNODB_TRX enthält Informationen über alle derzeit laufenden InnoDB-Transaktionen, die keine schreibgeschützten Transaktionen sind.

SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;

Die Tabelle INNODB_LOCKS enthält Informationen über Sperren, die eine InnoDB-Transaktion angefordert, aber nicht erhalten hat.

Für MySQL 5.7 oder früher:

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;

Ab MySQL 8.0:

SELECT * FROM performance_schema.data_locks;

Die Tabelle INNODB_LOCK_WAITS enthält eine oder mehrere Zeilen für jede blockierte InnoDB-Transaktion.

Für MySQL 5.7 oder früher:

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;

Ab MySQL 8.0:

SELECT * FROM performance_schema.data_lock_waits;

Sie können eine Abfrage ähnlich der folgenden ausführen, um die Transaktionen anzuzeigen, die warten, und die Transaktionen, die die wartenden Transaktionen blockieren. Weitere Informationen finden Sie unter Verwenden von InnoDB-Transaktions- und Sperrinformationen auf der MySQL-Website.

Für MySQL 5.7 oder früher:

SELECT
  r.trx_id waiting_trx_id,
  r.trx_mysql_thread_id waiting_thread,
  r.trx_query waiting_query,
  b.trx_id blocking_trx_id,
  b.trx_mysql_thread_id blocking_thread,
  b.trx_query blocking_query
FROM       information_schema.innodb_lock_waits w
INNER JOIN information_schema.innodb_trx b
  ON b.trx_id = w.blocking_trx_id
INNER JOIN information_schema.innodb_trx r
  ON r.trx_id = w.requesting_trx_id;

Ab MySQL 8.0:

SELECT
  r.trx_id waiting_trx_id,
  r.trx_mysql_thread_id waiting_thread,
  r.trx_query waiting_query,
  b.trx_id blocking_trx_id,
  b.trx_mysql_thread_id blocking_thread,
  b.trx_query blocking_query
FROM       performance_schema.data_lock_waits w
INNER JOIN information_schema.innodb_trx b
  ON b.trx_id = w.blocking_engine_transaction_id
INNER JOIN information_schema.innodb_trx r
  ON r.trx_id = w.requesting_engine_transaction_id;

Die INNODB-STATUS DER ENGINE ANZEIGEN-Abfrage liefert Informationen aus dem Standard-InnoDB-Monitor über den Status der InnoDB-Speicher-Engine. Weitere Informationen finden Sie unter MOTOR ANZEIGEN-Anweisung auf der MySQL-Website.

SHOW ENGINE INNODB STATUS;

Der SHOW\ [GLOBAL | SESSION] STATUS gibt Auskunft über den Serverstatus. Weitere Informationen finden Sie unter PROZESSLISTE ANZEIGEN-Anweisung auf der MySQL-Website.

SHOW GLOBAL STATUS;

**Hinweis:**Diese Abfragen wurden auf Aurora 2.x (MySQL 5.7), Aurora 1. x (MySQL 5.6) und MariaDB 10.x getestet. Darüber hinaus wird die Tabelle INFORMATION_SCHEMA.INNODB_LOCKS ab MySQL 5.7.14 nicht mehr unterstützt und in MySQL 8.0 entfernt. Die Tabelle performance_schema.data_locks ersetzt die Tabelle INFORMATION_SCHEMA.INNODB_LOCKS. Weitere Informationen finden Sie unter The data_locks table auf der MySQL-Website.

Analysieren von Protokollen und Einschalten der Überwachung

Wenn Sie Protokolle analysieren oder die Überwachung in Amazon RDS for MySQL aktivieren möchten, sollten Sie die folgenden Ansätze in Betracht ziehen:

  • Analysieren Sie das allgemeine Abfrageprotokoll von MySQL, um zu sehen, was mysqld zu einem bestimmten Zeitpunkt tut. Sie können auch die Abfragen anzeigen, die zu einem bestimmten Zeitpunkt auf Ihrer Instance ausgeführt werden, einschließlich Informationen darüber, wann Clients eine Verbindung herstellen oder trennen. Weitere Informationen finden Sie unter The General Query Log auf der MySQL-Website.
    **Hinweis:**Wenn Sie das General Query Log für längere Zeiträume aktivieren, verbrauchen die Protokolle Speicherplatz und können den Leistungsaufwand erhöhen.
  • Analysieren Sie die MySQL Slow Query Logs, um Abfragen zu finden, deren Ausführung länger dauert als die Sekunden, die Sie für long_query_time festgelegt haben. Sie können auch Ihre Workload überprüfen und Ihre Abfragen analysieren, um die Leistung und den Speicherverbrauch zu verbessern. Weitere Informationen finden Sie unter The Slow Query Log auf der MySQL-Website. **Tipp:**Wenn Sie Slow Query Log oder General Query Log verwenden, setzen Sie den Parameter log_output auf DATEI.
  • Verwenden Sie das MariaDB Audit-Plugin, um die Datenbankaktivität zu überprüfen. Sie können beispielsweise Benutzer verfolgen, die sich an der Datenbank anmelden, oder Abfragen, die für die Datenbank ausgeführt werden. Weitere Informationen finden Sie unter MariaDB Audit Plugin-Unterstützung.
  • Wenn Sie Aurora for MySQL verwenden, können Sie auch Fortgeschrittenes Auditing verwenden. Auditing kann Ihnen mehr Kontrolle über die Arten von Abfragen geben, die Sie protokollieren möchten. Dadurch wird der Aufwand für die Protokollierung reduziert.
  • Verwenden Sie den Parameter innodb_print_all_deadlocks, um nach Deadlocks und Ressourcensperren zu suchen. Sie können diesen Parameter verwenden, um Informationen über Deadlocks in InnoDB-Benutzertransaktionen im MySQL-Fehlerprotokoll aufzuzeichnen. Weitere Informationen finden Sie unter innodb_print_all_deadlocks auf der MySQL-Website.

Analyse und Optimierung der hohen CPU-Auslastung

Nachdem Sie die Abfrage identifiziert haben, die die CPU-Auslastung erhöht, optimieren Sie Ihre Workload, um den CPU-Verbrauch zu reduzieren.

Wenn Sie eine Abfrage sehen, die für Ihren Workload nicht erforderlich ist, können Sie mit dem folgenden Befehl die Verbindung beenden:

CALL mysql.rds_kill(processID);

Führen Sie den Befehl VOLLSTÄNDIGE PROZESSLISTE ANZEIGEN aus, um die Prozess-ID einer Abfrage zu ermitteln.

Wenn Sie die Abfrage nicht beenden möchten, optimieren Sie die Abfrage mit ERKLÄREN. Der Befehl ERKLÄREN zeigt die einzelnen Schritte, die beim Ausführen einer Abfrage erforderlich sind. Weitere Informationen finden Sie unter Optimieren von Abfragen mit ERKLÄREN auf der MySQL-Website.

Um die Profildetails zu überprüfen, aktivieren Sie PROFILERSTELLUNG. Der Befehl PROFILERSTELLUNG kann den Ressourcenverbrauch für Anweisungen angeben, die während der aktuellen Sitzung ausgeführt werden. Weitere Informationen finden Sie unter PROFIL ANZEIGEN-Anweisung auf der MySQL-Website.

Verwenden Sie TABELLENSTATISTIKEN, um Tabellenstatistiken zu aktualisieren. Der Befehl TABELLENSTATISTIKEN kann dem Optimierer helfen, einen geeigneten Plan für die Ausführung der Abfrage auszuwählen. Weitere Informationen finden Sie unter TABELLENSTATISTIKEN-Anweisung auf der MySQL-Website.


Ähnliche Informationen

Amazon RDS für MySQL

Amazon RDS für MariaDB

Wie aktiviere und überwache ich Protokolle für eine Amazon RDS MySQL-DB-Instance?

Optimieren von Amazon RDS für MySQL mit Performance Insights