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-IntervallenSPANNER_SYS.READ_STATS_TOTAL_10MINUTE
: Zusammengefasste Statistiken für alle Leseformen in 10-Minuten-IntervallenSPANNER_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 denSPANNER_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
undSPANNER_SYS.READ_STATS_TOTAL_MINUTE
: Intervalle der letzten 6 Stunden.SPANNER_SYS.READ_STATS_TOP_10MINUTE
undSPANNER_SYS.READ_STATS_TOTAL_10MINUTE
: Intervalle der letzten 4 Tage.SPANNER_SYS.READ_STATS_TOP_HOUR
undSPANNER_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
- Weitere Informationen zu Tools zur Selbstbeobachtung
- Weitere Informationen zu dem, was Cloud Spanner für jede Datenbank in den Informationsschematabellen der Datenbank speichert
- SQL-Best-Practices für Cloud Spanner
- Hohe CPU-Auslastung untersuchen