Hohe CPU-Auslastung untersuchen

Auf dieser Seite wird beschrieben, wie Sie mithilfe von Messwerten und Diagrammen zur CPU-Auslastung zusammen mit anderen Tools zur Selbstbeobachtung die hohe CPU-Auslastung in Ihrer Datenbank untersuchen können.

Ermitteln, ob ein System oder eine Nutzeraufgabe eine hohe CPU-Auslastung verursacht

Die Google Cloud Console bietet verschiedene Monitoring-Tools für Spanner, mit denen Sie den Status der wichtigsten Messwerte für Ihre Instanz abrufen können. Eines davon ist das Diagramm CPU-Auslastung – gesamt. Dieses Diagramm zeigt die gesamte CPU-Auslastung als Prozentsatz der CPU-Ressourcen der Instanz, aufgeschlüsselt nach Aufgabenpriorität und Vorgangstyp. Es gibt zwei Arten von Aufgaben: Nutzeraufgaben wie Lese- und Schreibvorgänge und Systemaufgaben, zu denen automatisierte Hintergrundaufgaben wie die Verdichtung und das Backfill eines Index gehören.

Abbildung 1 zeigt ein Beispiel für das Diagramm CPU-Auslastung – gesamt.

Beispiel für ein Diagramm der CPU-Auslastung – gesamt

Abbildung 1. Diagramm CPU-Auslastung – Gesamt im Monitoring-Dashboard in der Google Cloud Console

Angenommen, Sie erhalten von Cloud Monitoring eine Benachrichtigung, dass die CPU-Auslastung deutlich gestiegen ist. Sie öffnen das Dashboard Monitoring für Ihre Instanz in der Google Cloud Console und überprüfen das Diagramm CPU-Auslastung – Gesamt. Wie in Abbildung 1 zu sehen ist, sehen Sie die erhöhte CPU-Auslastung durch Nutzeraufgaben mit hoher Priorität. Der nächste Schritt besteht darin, herauszufinden, welcher Nutzervorgang mit hoher Priorität die Erhöhung der CPU-Auslastung verursacht.

Mithilfe von Query Insights-Dashboards können Sie diesen und andere Messwerte in einer Zeitachse visualisieren. Anhand dieser vordefinierten Dashboards können Sie CPU-Auslastungsspitzen sehen und ineffiziente Abfragen erkennen.

Ermitteln, welcher Nutzervorgang die Spitze der CPU-Auslastung verursacht

Das Diagramm CPU-Auslastung – Gesamt in Abbildung 1 zeigt, dass Nutzeraufgaben mit hoher Priorität die CPU-Auslastung erhöhen.

Als Nächstes sehen Sie sich das Diagramm CPU-Auslastung nach Vorgangstyp in der Cloud Console an. Dieses Diagramm zeigt die CPU-Auslastung, aufgeschlüsselt nach vom Nutzer initiierten Vorgängen mit hoher, mittlerer und niedriger Priorität.

Was ist ein vom Nutzer initiierter Vorgang?

Ein vom Nutzer initiierter Vorgang ist ein Vorgang, der über eine API-Anfrage initiiert wird. Spanner gruppiert diese Anfragen in Vorgangstypen oder Kategorien. Jeder Vorgangstyp kann als Linie im Diagramm CPU-Auslastung nach Vorgangstyp angezeigt werden. In der folgenden Tabelle werden die API-Methoden beschrieben, die in den einzelnen Vorgangstypen enthalten sind.

Aktion API-Methoden Beschreibung
read_readonly Read
StreamingRead
Enthält Lesevorgänge, die Zeilen mit Schlüsselsuchen und -scans aus der Datenbank abrufen.
read_readwrite Read
StreamingRead
Enthält Lesevorgänge in Lese-Schreib-Transaktionen.
read_withpartitiontoken Read
StreamingRead
Umfasst Lesevorgänge, die mit einer Reihe von Partitionstokens ausgeführt werden.
executesql_select_readonly ExecuteSql
ExecuteStreamingSql
Enthält eine Anweisung zum Ausführen von Select-SQL und zum Ändern von Streamabfragen.
executesql_select_readwrite ExecuteSql
ExecuteStreamingSql
Enthält eine Anweisung zum Ausführen von Select innerhalb von Lese-Schreib-Transaktionen.
executesql_select_withpartitiontoken ExecuteSql
ExecuteStreamingSql
Enthält eine Anweisung zum Ausführen von Select, die mit einer Reihe von Partitionstokens ausgeführt wird.
executesql_dml_readwrite ExecuteSql
ExecuteStreamingSql
ExecuteBatchDml
Enthält eine Anweisung zum Ausführen der DML-SQL-Anweisung.
executesql_dml_partitioned ExecuteSql
ExecuteStreamingSql
ExecuteBatchDml
Enthält eine partitionierte DML-SQL-Anweisung.
beginorcommit BeginTransaction
Commit
Rollback
Enthält Anfangs-, Commit- und Rollback-Transaktionen.
misc PartitionQuery
PartitionRead
GetSession
CreateSession
Enthält PartitionQuery, PartitionRead, Create Database, Create Instance, sitzungsbezogene Vorgänge, interne zeitkritische Bereitstellungsvorgänge usw.

Hier ein Beispieldiagramm des Messwerts CPU-Auslastung nach Vorgangstyp.

Beispiel für ein Diagramm der CPU-Auslastung nach Vorgangstyp

Abbildung 2. Diagramm zur CPU-Auslastung nach Vorgangstyp in der Google Cloud Console

Sie können die Anzeige auf eine bestimmte Priorität beschränken, indem Sie oben im Diagramm das Menü Priorität verwenden. Dabei wird jeder Vorgangstyp oder jede Kategorie in einem Liniendiagramm dargestellt. Die Kategorien, die unter dem Diagramm aufgeführt sind, identifizieren die entsprechende Grafik. Sie können jedes Diagramm ausblenden und anzeigen lassen, indem Sie den entsprechenden Kategoriefilter auswählen oder die Auswahl aufheben.

Alternativ können Sie dieses Diagramm auch wie unten beschrieben im Messwert-Explorer erstellen:

Diagramm zur CPU-Auslastung nach Vorgangstyp im Metrics Explorer erstellen

  1. Wählen Sie in der Google Cloud Console Monitoring aus oder klicken Sie auf die folgende Schaltfläche:

    Zu Monitoring

  2. Wählen Sie im Navigationsbereich den Metrics Explorer aus.
  3. Geben Sie im Feld Ressourcentyp und Messwert suchen den Wert spanner.googleapis.com/instance/cpu/utilization_by_operation_type ein und klicken Sie dann auf die Zeile, die unter dem Feld angezeigt wird.
  4. Geben Sie im Feld Filter den Wert instance_id ein. Geben Sie dann die Instanz-ID ein, die Sie prüfen möchten, und klicken Sie auf >Übernehmen.
  5. Wählen Sie im Feld Gruppieren nach aus der Drop-down-Liste category aus. Das Diagramm zeigt die CPU-Auslastung der Nutzeraufgaben, gruppiert nach Vorgangstyp oder Kategorie.

Mit dem Messwert CPU-Auslastung nach Priorität im vorherigen Abschnitt konnten Sie feststellen, ob eine Nutzer- oder Systemaufgabe zu einer Erhöhung der CPU-Ressourcennutzung geführt hat. Mit dem Messwert CPU-Auslastung nach Vorgangstyp können Sie genauer nachsehen und herausfinden, welche Art von vom Nutzer initiiertem Vorgang hinter dieser Erhöhung der CPU-Auslastung steckt.

Ermitteln, welche Nutzeranfrage zu einer erhöhten CPU-Auslastung beiträgt

Um zu ermitteln, welche Nutzeranfrage für den Anstieg der CPU-Auslastung in der Grafik zum Ausführungstyp executesql_select_readonly in Abbildung 2 konkret verantwortlich ist, verwenden Sie die integrierten Statistiktabellen zur Selbstprüfung und erhalten so mehr Einblick.

Verwenden Sie die folgende Tabelle als Leitfaden, um anhand des Vorgangstyps, der eine hohe CPU-Auslastung verursacht, zu ermitteln, welche Statistiktabelle abgefragt werden soll.

Vorgangstyp Abfrage Lesen Transaktion
read_readonly Nein Ja Nein
read_readwrite Nein Ja Ja
read_withpartitiontoken Nein Ja Nein
executesql_select_readonly Ja Nein Nein
executesql_select_withpartitiontoken Ja Nein Nein
executesql_select_readwrite Ja Nein Ja
executesql_dml_readwrite Ja Nein Ja
executesql_dml_partitioned Nein Nein Ja
beginorcommit Nein Nein Ja

Wenn beispielsweise read_withpartitiontoken das Problem ist, beheben Sie den Fehler mithilfe von Lesestatistiken.

In diesem Szenario scheint der Vorgang executesql_select_readonly der Grund für die beobachtete Erhöhung der CPU-Auslastung zu sein. Anhand der vorhergehenden Tabelle sollten Sie sich als Nächstes Abfragestatistiken ansehen, um herauszufinden, welche Abfragen teuer sind, häufig ausgeführt werden oder große Datenmengen scannen.

Führen Sie die folgende Abfrage in der Statistiktabelle query_stats_top_hour aus, um die Abfragen mit der höchsten CPU-Auslastung der vorherigen Stunde zu ermitteln.

SELECT text,
       execution_count AS count,
       avg_latency_seconds AS latency,
       avg_cpu_seconds AS cpu,
       execution_count * avg_cpu_seconds AS total_cpu
FROM spanner_sys.query_stats_top_hour
WHERE interval_end =
  (SELECT MAX(interval_end)
   FROM spanner_sys.query_stats_top_hour)
ORDER BY total_cpu DESC;

Die Ausgabe zeigt Abfragen, sortiert nach CPU-Auslastung. Nachdem Sie die Abfrage mit der höchsten CPU-Auslastung ermittelt haben, können Sie sie mit den folgenden Optionen optimieren.

  • Prüfen Sie den Abfrageausführungsplan, um mögliche Ineffizienzen zu ermitteln, die zu einer hohen CPU-Auslastung führen können.

  • Prüfen Sie, ob die Abfrage den Best Practices für SQL entspricht.

  • Prüfen Sie das Schemadesign der Datenbank und aktualisieren Sie das Schema, um effizientere Abfragen zu ermöglichen.

  • Richten Sie eine Referenz für die Häufigkeit ein, mit der Spanner eine Abfrage während eines Intervalls ausführt. Mit dieser Referenz können Sie die Ursache für unerwartete Abweichungen vom normalen Verhalten erkennen und untersuchen.

Wenn Sie keine CPU-intensive Abfrage gefunden haben, fügen Sie der Instanz die Rechenkapazität hinzu. Weitere Rechenkapazitäten bieten mehr CPU-Ressourcen und geben Spanner die Möglichkeit, eine größere Arbeitslast zu bewältigen. Weitere Informationen finden Sie unter Rechenkapazität erhöhen.

Nächste Schritte