Lesestatistiken

Cloud Spanner bietet eingebundene Tabellen, in denen Statistiken zu Lesevorgängen gespeichert werden. Mit SQL-Anweisungen können Sie Statistiken aus diesen SPANNER_SYS.READ_STATS*-Tabellen abrufen.

Wann Sie Lesestatistiken verwenden sollten

Lesestatistiken bieten einen Einblick in die Verwendung einer Datenbank durch eine Anwendung und können bei der Untersuchung von Leistungsproblemen hilfreich sein. Sie können zum Beispiel prüfen, welche Leseformen in der Datenbank ausgeführt werden, wie oft sie laufen und die Leistungsmerkmale dieser Leseformen beschreiben. Sie können die Lesestatistiken für Ihre Datenbank verwenden, um Leseformen zu identifizieren, die zu einer hohen CPU-Auslastung führen. Mit allgemeinen Statistiken können Sie das Verhalten des Traffics in einer Datenbank im Hinblick auf die Ressourcennutzung besser verstehen.

Beschränkungen

  • Dieses Tool eignet sich am besten für die Analyse von Streams ähnlicher Lesevorgänge, mit denen der größte Teil der CPU-Auslastung berücksichtigt wird. Es ist nicht ideal, nach Lesevorgängen zu suchen, die nur einmal ausgeführt wurden.

  • Die in diesen Statistiken erfasste CPU-Auslastung repräsentiert die serverseitige CPU-Auslastung in Cloud Spanner ohne die Prefetch-CPU-Auslastung und einige zusätzliche Aufwände.

  • Die Statistiken werden auf Best-Effort-Basis erfasst. Deshalb können Statistiken unter Umständen verloren gehen, wenn Probleme mit zugrunde liegenden Systemen vorliegen. Wenn es beispielsweise interne Netzwerkprobleme gibt, werden einige Statistiken möglicherweise nicht erfasst.

Verfügbarkeit

SPANNER_SYS-Daten sind nur über SQL-Schnittstellen verfügbar. Beispiel:

  • Die Seite Abfrage einer Datenbank in der Cloud Console

  • Befehl gcloud spanner databases execute-sql

  • Mit der executeQuery API

Andere von Cloud Spanner bereitgestellte Einzellesemethoden unterstützen SPANNER_SYS nicht.

Nach CPU-Form gruppierte CPU-Nutzung

In den folgenden Tabellen werden die Leseformen mit der höchsten CPU-Auslastung während eines bestimmten Zeitraums verfolgt:

  • SPANNER_SYS.READ_STATS_TOP_MINUTE: Leseformstatistiken zusammengefasst in Intervallen von einer Minute.
  • SPANNER_SYS.READ_STATS_TOP_10MINUTE: Leseformstatistiken zusammengefasst in Intervallen von zehn Minuten.
  • SPANNER_SYS.READ_STATS_TOP_HOUR: Leseformstatistiken zusammengefasst in Intervallen von 1 Stunde.

Diese Tabellen haben folgende Attribute:

  • Jede Tabelle enthält Daten für nicht überlappende Zeitintervalle in der Länge, die der Tabellenname festlegt.

  • Die Intervalle basieren auf der Uhrzeit. 1-Minuten-Intervalle enden nach einer Minute, 10-Minuten-Intervalle enden alle 10 Minuten ab Beginn der vollen Stunde, 1-Stunden-Intervalle enden zu jeder Stunde. Nach jedem Intervall erfasst Cloud Spanner Daten von allen Servern und stellt die Daten danach in den SPANNER_SYS-Tabellen bereit.

    Beispielsweise sind die neuesten, für SQL-Abfragen verfügbaren Intervalle um 11:59:30 Uhr:

    • 1 Minute: 11:58:00–11:58:59 Uhr
    • 10 Minuten: 11:40:00–11:49:59 Uhr
    • 1 Stunde: 10:00:00–10:59:59 Uhr
  • Cloud Spanner gruppiert die Statistiken nach Leseform. FPRINT (Fingerabdruck) wird basierend auf den an die Lesevorgänge verknüpften Spalten berechnet.

  • Jede Zeile enthält Statistiken für alle Ausführungen einer bestimmten Leseform, für die Cloud Spanner während des angegebenen Intervalls Statistiken erfasst.

  • Wenn Cloud Spanner keine Informationen zu jeder einzelnen Leseform speichern kann, die während des Intervalls ausgeführt wurde, priorisiert das System Leseformen mit der höchsten CPU-Auslastung im angegebenen Intervall.

Tabellenschema

Spaltenname Typ Beschreibung
INTERVAL_END TIMESTAMP Ende des Zeitintervalls, in dem die enthaltenen Leseausführungen aufgetreten sind.
REQUEST_TAG STRING Das optionale Anfrage-Tag für diesen Lesevorgang. Weitere Informationen zur Verwendung von Tags finden Sie unter Fehlerbehebung bei Anfrage-Tags. Statistiken für mehrere Lesevorgänge mit demselben Tag-String werden in einer einzigen Zeile zusammengefasst. Der "REQUEST_TAG" entspricht diesem Tag-String.
READ_COLUMNS ARRAY<STRING> Die gelesenen Spalten. Diese sind in alphabetischer Reihenfolge angeordnet.
FPRINT INT64 Der Hash des Werts REQUEST_TAG, falls vorhanden; andernfalls der Hash des Werts READ_COLUMNS.
EXECUTION_COUNT INT64 Häufigkeit, mit der Cloud Spanner die Form während des Intervalls ausgeführt hat.
AVG_ROWS FLOAT64 Durchschnittliche Anzahl der Zeilen, die der Lesevorgang zurückgegeben hat.
AVG_BYTES FLOAT64 Die durchschnittliche Anzahl der vom Lesevorgang zurückgegebenen Datenbyte, ohne den Aufwand der Übertragungscodierung.
AVG_CPU_SECONDS FLOAT64 Durchschnittliche Anzahl der CPU-Sekunden des Cloud Spanner-Servers, der den Lesevorgang ausführt, ohne der Prefetch-CPU und anderer Aufwände.
AVG_LOCKING_DELAY_SECONDS FLOAT64 Durchschnittliche Anzahl von Sekunden, die auf das Sperren gewartet wurde.
AVG_CLIENT_WAIT_SECONDS FLOAT64 Durchschnittliche Wartezeit in Sekunden, da der Client keine Daten so schnell verbraucht, wie Cloud Spanner sie erzeugen könnte.
AVG_LEADER_REFRESH_DELAY_SECONDS FLOAT64 Durchschnittliche Anzahl der Sekunden, die auf die Bestätigung mit dem Paxos-Leader gewartet wird, dass alle Schreibvorgänge beobachtet wurden.

Beispielabfragen

Dieser Abschnitt enthält mehrere Beispiel-SQL-Anweisungen, die Lesestatistiken abrufen. Sie können diese SQL-Anweisungen mit den Clientbibliotheken, mit dem gcloud-Befehlszeilentool oder mit der Cloud Console ausführen.

Grundlegende Statistiken für jede Leseform in einem bestimmten Zeitraum auflisten

Die folgende Abfrage gibt die Rohdaten für die Top-Leseformen in den letzten 1-minütigen Zeitintervallen zurück.

SELECT fprint,
       read_columns,
       execution_count,
       avg_cpu_seconds,
       avg_rows,
       avg_bytes,
       avg_locking_delay_seconds,
       avg_client_wait_seconds
FROM spanner_sys.read_stats_top_minute
ORDER BY interval_end DESC LIMIT 3;
Screenshot: Ausgabe der Abfrage
fprint read_columns execution_count avg_cpu_seconds avg_rows avg_bytes avg_locking_delay_seconds avg_client_wait_seconds
125062082139 ["Singers.id", "Singers.name"] 8514387 0.000661355290396507 310.79 205 8.3232564943763752e-06 0
151238888745 ["Singers.singerinfo"] 3341542 6.5992827184280315e-05 12784 54 4.6859741349028595e-07 0
14105484 ["Albums.id", "Albums.title"] 9306619 0.00017855774721667873 1165.4 2964.71875 1.4328191393074178e-06 0

Leseformen auflisten, sortiert nach der höchsten CPU-Auslastung

Die folgende Abfrage gibt die Leseformen mit der höchsten CPU-Auslastung der letzten Stunde zurück:

SELECT read_columns,
       execution_count,
       avg_cpu_seconds,
       execution_count * avg_cpu_seconds AS total_cpu
FROM spanner_sys.read_stats_top_hour
WHERE interval_end =
  (SELECT MAX(interval_end)
   FROM spanner_sys.read_stats_top_hour)
ORDER BY total_cpu DESC LIMIT 3;
Screenshot: Ausgabe der Abfrage
read_columns execution_count avg_cpu_seconds total_cpu
["Singers.id", "Singers.name"] 1647 0.00023380297430622681 0.2579
["Albums.id", "Albums.title"] 720 0.00016738889440282034 0.221314999999999
["Singers.singerinfo""] 3223 0.00037764625882302246 0.188053

Zusammengefasste Statistiken

SPANNER_SYS enthält auch Tabellen zum Speichern aggregierter Lesestatistiken, die von Cloud Spanner in einem bestimmten Zeitraum erfasst wurden:

  • SPANNER_SYS.READ_STATS_TOTAL_MINUTE: Zusammengefasste Statistiken für alle Leseformen in 1-Minuten-Intervallen
  • SPANNER_SYS.READ_STATS_TOTAL_10MINUTE: Zusammengefasste Statistiken für alle Leseformen in 10-Minuten-Intervallen
  • SPANNER_SYS.READ_STATS_TOTAL_HOUR: Zusammengefasste Statistiken für alle Leseformen in Intervallen von 1 Stunde.

Zusammengefasste Statistiktabellen haben die folgenden Eigenschaften:

  • Jede Tabelle enthält Daten für nicht überlappende Zeitintervalle in der Länge, die der Tabellenname angibt.

  • Die Intervalle beziehen sich auf die Uhrzeit. 1-Minuten-Intervalle enden nach einer vollen Minute, 10-Minuten-Intervalle enden alle 10 Minuten ab Beginn der vollen Stunde, 1-Stunden-Intervalle enden zu jeder vollen Stunde.

    Zum Beispiel sind um 11:59:30 Uhr die neuesten Intervalle, die für SQL-Abfragen zu zusammengefassten Lesestatistiken zur Verfügung stehen:

    • 1 Minute: 11:58:00–11:58:59 Uhr
    • 10 Minuten: 11:40:00–11:49:59 Uhr
    • 1 Stunde: 10:00:00–10:59:59 Uhr
  • Jede Zeile enthält zusammengefasste Daten für alle Leseformen, die während des angegebenen Intervalls über die Datenbank ausgeführt wurden. Es gibt nur je eine Zeile pro Zeitintervall.

  • Die in den SPANNER_SYS.READ_STATS_TOTAL_*-Tabellen erfassten Statistiken können Lesevorgänge enthalten, die Cloud Spanner nicht in den SPANNER_SYS.READ_STATS_TOP_*-Tabellen erfasst hat.

Tabellenschema

Spaltenname Typ Beschreibung
INTERVAL_END TIMESTAMP Ende des Zeitintervalls, in dem die enthaltene Leseformausführungen aufgetreten sind.
EXECUTION_COUNT INT64 Häufigkeit, mit der Cloud Spanner die Form während des Intervalls ausgeführt hat.
AVG_ROWS FLOAT64 Durchschnittliche Anzahl der Zeilen, die von den Lesevorgängen zurückgegeben wurden.
AVG_BYTES FLOAT64 Durchschnittliche Anzahl der von den Lesevorgängen zurückgegebenen Datenbyte, ohne den Aufwand der Übertragungscodierung.
AVG_CPU_SECONDS FLOAT64 Durchschnittliche Anzahl der CPU-Sekunden des Cloud Spanner-Servers, der den Lesevorgang ausführt, ohne der Prefetch-CPU und anderer Aufwände.
AVG_LOCKING_DELAY_SECONDS FLOAT64 Durchschnittliche Anzahl von Sekunden, die auf das Sperren gewartet wurde.
AVG_CLIENT_WAIT_SECONDS FLOAT64 Durchschnittliche Anzahl der Sekunden, die aufgrund der Drosselung mit Warten verbracht wurden.
AVG_LEADER_REFRESH_DELAY_SECONDS FLOAT64 Durchschnittliche Anzahl der Sekunden, die für die Koordinierung der Lesevorgänge in mehreren Instanzen in multiregionalen Konfigurationen erforderlich sind.

Beispielabfragen

Dieser Abschnitt enthält mehrere Beispiel-SQL-Anweisungen, die zusammengefasste Lesestatistiken abrufen. Sie können diese SQL-Anweisungen mit den Clientbibliotheken, mit dem gcloud-Befehlszeilentool oder mit der Cloud Console ausführen.

Gesamte CPU-Auslastung in allen Leseformen ermitteln

Die folgende Abfrage gibt die Anzahl der CPU-Stunden zurück, die in der letzten Stunde von Leseformen verbraucht wurden:

SELECT (avg_cpu_seconds * execution_count / 60 / 60)
  AS total_cpu_hours
FROM spanner_sys.read_stats_total_hour
WHERE interval_end =
  (SELECT MAX(interval_end)
   FROM spanner_sys.read_stats_total_hour);
Screenshot: Ausgabe der Abfrage
total_cpu_hours
0.00026186111111111115

Gesamtausführungsanzahl in einem bestimmten Zeitraum ermitteln

Die folgende Abfrage gibt die Gesamtzahl der Leseformen zurück, die im letzten vollständigen 1-Minuten-Intervall ausgeführt wurden:

SELECT interval_end,
       execution_count
FROM spanner_sys.read_stats_total_minute
WHERE interval_end =
  (SELECT MAX(interval_end)
   FROM spanner_sys.read_stats_total_minute);
Screenshot: Ausgabe der Abfrage
interval_end execution_count
2020-05-28 11:02:00-07:00 12861966

Datenaufbewahrung

Cloud Spanner speichert die Daten für jede Tabelle mindestens für die folgenden Zeiträume:

  • SPANNER_SYS.READ_STATS_TOP_MINUTE und SPANNER_SYS.READ_STATS_TOTAL_MINUTE: Intervalle der letzten 6 Stunden.

  • SPANNER_SYS.READ_STATS_TOP_10MINUTE und SPANNER_SYS.READ_STATS_TOTAL_10MINUTE: Intervalle der letzten 4 Tage.

  • SPANNER_SYS.READ_STATS_TOP_HOUR und SPANNER_SYS.READ_STATS_TOTAL_HOUR: Intervalle der letzten 30 Tage.

Fehlerbehebung bei hoher CPU-Auslastung mit Lesestatistiken

Cloud Spanner-Lesestatistiken sind nützlich, wenn Sie eine hohe CPU-Auslastung in Ihrer Cloud Spanner-Datenbank untersuchen oder einfach nur die CPU-intensiven Leseformen in Ihrer Datenbank verstehen möchten. Das Prüfen der Leseformen, die erhebliche Mengen an Datenbankressourcen beanspruchen, bietet Cloud Spanner-Nutzern eine potenzielle Möglichkeit, die Betriebskosten zu senken und möglicherweise die allgemeinen Systemlatenzen zu verbessern. Anhand der folgenden Schritte zeigen wir Ihnen, wie Sie mit Lesestatistiken hohe CPU-Auslastung in Ihrer Datenbank untersuchen können.

Zeitraum auswählen, der untersucht werden soll

Starten Sie die Prüfung mit der Suche nach einem Zeitpunkt, an dem Ihre Anwendung begann, eine hohe CPU-Auslastung zu verzeichnen. Beispiel: Das Problem trat am 28. Mai 2020 um 17:20 Uhr auf.

Erfassung von Lesestatistiken für den ausgewählten Zeitraum

Nachdem ein Zeitraum zum Starten der Prüfung ausgewählt wurde, betrachten wir die Statistikdaten, die etwa zu diesem Zeitpunkt in der Tabelle READ_STATS_TOTAL_10MINUTE gesammelt wurden. Die Ergebnisse dieser Abfrage können Aufschluss darüber geben, wie sich die CPU und andere Lesestatistiken in diesem Zeitraum geändert haben. Die folgende Abfrage gibt die zusammengefassten Lesestatistiken von 4:30 pm bis 7:30 pm (einschließlich) zurück.

SELECT
  interval_end,
  ROUND(avg_cpu_seconds,4) as avg_cpu_seconds,
  execution_count,
  avg_locking_delay_seconds
FROM SPANNER_SYS.READ_STATS_TOTAL_10MINUTE
WHERE
  interval_end >= "2020-05-28T16:30:00"
  AND interval_end <= "2020-05-28T19:30:00"
ORDER BY interval_end;

Nehmen wir als Beispiel das folgende Ergebnis zu unserer Abfrage:

interval_end avg_cpu_seconds execution_count avg_locking_delay_seconds
2020-05-28 16:40:00-07:00 0.0004 11111421 8.3232564943763752e-06
2020-05-28 16:50:00-07:00 0.0002 8815637 8.98734051776406e-05
2020-05-28 17:00:00-07:00 0.0001 8260215 6.039129247846453e-06
2020-05-28 17:10:00-07:00 0.0001 8514387 9.0535466616680686e-07
2020-05-28 17:20:00-07:00 0.0006 13715466 2.6801485272173765e-06
2020-05-28 17:30:00-07:00 0.0007 12861966 4.6859741349028595e-07
2020-05-28 17:40:00-07:00 0.0007 3755954 2.7131391918005383e-06
2020-05-28 17:50:00-07:00 0.0006 4248137 1.4328191393074178e-06
2020-05-28 18:00:00-07:00 0.0006 3986198 2.6973481999639748e-06
2020-05-28 18:10:00-07:00 0.0006 3510249 3.7577083563017905e-06
2020-05-28 18:20:00-07:00 0.0004 3341542 4.0940589703795433e-07
2020-05-28 18:30:00-07:00 0.0002 8695147 1.9914494947583975e-05
2020-05-28 18:40:00-07:00 0.0003 11679702 1.8331461539001595e-05
2020-05-28 18:50:00-07:00 0.0003 9306619 1.2527332321222135e-05
2020-05-28 19:00:00-07:00 0.0002 8520508 6.2268448078447915e-06
2020-05-28 19:10:00-07:00 0.0006 13715466 2.6801485272173765e-06
2020-05-28 19:20:00-07:00 0.0005 11947323 3.3029114639321295e-05
2020-05-28 19:30:00-07:00 0.0002 8514387 9.0535466616680686e-07

Hier sehen Sie, dass die durchschnittliche CPU-Zeit (avg_cpu_seconds) in den markierten Intervallen höher ist. interval_end mit dem Wert 2020-05-28 19:20:00 hat eine höhere CPU-Zeit. Daher wählen wir dieses Intervall aus, um es im nächsten Schritt genauer zu untersuchen.

Herausfinden, welche Leseformen eine hohe CPU-Nutzung verursachen

Wir forschen jetzt etwas gründlicher nach und fragen die Tabelle READ_STATS_TOP_10MINUTE nach dem Intervall ab, das im vorhergehenden Schritt ausgewählt wurde. Die Ergebnisse dieser Abfrage können dabei helfen, zu erkennen, welche Leseformen eine hohe CPU-Auslastung verursachen.

SELECT
  read_columns,
  ROUND(avg_cpu_seconds,4) as avg_cpu_seconds,
  execution_count,
  avg_rows
FROM SPANNER_SYS.READ_STATS_TOP_10MINUTE
WHERE
  interval_end = "2020-05-28T19:20:00"
ORDER BY avg_cpu_seconds DESC LIMIT 3;

Die folgenden Daten sind ein Beispiel für das Ergebnis, das wir von unserer Abfrage erhalten, und geben Informationen über die drei häufigsten Leseformen zurück, geordnet nach avg_cpu_seconds. Beachten Sie die Verwendung von ROUND in der Abfrage, um die Ausgabe von avg_cpu_seconds auf vier Dezimalstellen zu beschränken.

read_columns avg_cpu_seconds execution_count avg_rows
[TestHigherLatency._exists,TestHigherLatency.lang_status,TestHigherLatency.score,globalTagAffinity.shares]1 0.4192 1182 11650.42216582
[TestHigherLatency._exists,TestHigherLatency.lang_status,TestHigherLatency.likes,globalTagAffinity.score] 0.0852 4 12784
[TestHigherLatency._exists,TestHigherLatency.lang_status,TestHigherLatency.score,globalTagAffinity.ugcCount] 0.0697 1140 310.7921052631

1 _exists ist ein internes Feld, mit dem geprüft wird, ob eine bestimmte Zeile vorhanden ist.

Ein Grund für eine hohe CPU-Auslastung könnte sein, dass Sie angefangen haben, einige wenige Leseformen häufiger auszuführen (execution_count). Möglicherweise hat sich die durchschnittliche Anzahl der Zeilen, die das Lesen zurückgab, erhöht (avg_rows). Wenn keine dieser Eigenschaften der gelesenen Form etwas Interessantes ergibt, können Sie andere Eigenschaften wie avg_locking_delay_seconds, avg_client_wait_seconds oder avg_bytes untersuchen.

Best Practices zur Reduzierung der hohen CPU-Auslastung anwenden

Wenn Sie die vorhergehenden Schritte durchgeführt haben, überlegen Sie, ob einer dieser Best Practices in Ihrer Situation hilfreich ist.

  • Die Häufigkeit, mit der Cloud Spanner während des Intervalls Leseformen ausgeführt hat, ist ein gutes Beispiel für einen Messwert. Sie benötigen eine Referenz, um erkennen zu können, ob eine Messung angemessen oder ein Problem ist. Wenn Sie eine Referenz für den Messwert erstellt haben, können Sie die Ursache für unerwartete Abweichungen vom normalen Verhalten erkennen und untersuchen.

  • Wenn die CPU-Auslastung die meiste Zeit relativ konstant ist, aber plötzlich eine Spitze zeigt, die mit einer ähnlichen plötzlichen Spitze in den Benutzeranfragen oder im Anwendungsverhalten korreliert werden kann, könnte dies ein Hinweis darauf sein, dass alles wie erwartet funktioniert.

  • Geben Sie die folgende Abfrage ein, um die Top-Leseformen zu ermitteln, die nach der Häufigkeit sortiert sind, mit der Cloud Spanner jede Leseform ausführt:

    SELECT interval_end, read_columns, execution_count
    FROM SPANNER_SYS.READ_STATS_TOP_MINUTE
    ORDER BY execution_count DESC
    LIMIT 10;
    
  • Wenn Sie nach den geringstmöglichen Leselatenzen suchen, insbesondere bei Verwendung von multiregionalen Instanzkonfigurationen, verwenden Sie veraltete Lesevorgänge statt starker Lesevorgänge, um die AVG_LEADER_REFRESH_DELAY_SECONDS-Komponente der Leselatenz zu reduzieren/zu entfernen.

  • Wenn Sie nur Lesevorgänge ausführen und Ihren Lesevorgang mithilfe einer einzelnen Lesemethode ausdrücken können, sollten Sie diese einzelne Lesemethode verwenden. Einzelne Lesevorgänge werden im Gegensatz zu Lese-Schreib-Transaktionen nicht gesperrt. Daher sollten Sie schreibgeschützte Transaktionen anstelle von teureren Lese-Schreib-Transaktionen verwenden, wenn Sie keine Daten schreiben.

Nächste Schritte