Statistiken zu Splits

In diesem Dokument wird beschrieben, wie Sie Hotspots in Ihrer Datenbank erkennen und Fehler beheben. Sie können sowohl mit GoogleSQL als auch mit PostgreSQL auf Statistiken zu Hotspots in Segmenten zugreifen.

Spanner speichert Ihre Daten als zusammenhängenden Schlüsselbereich, der nach den Primärschlüsseln Ihrer Tabellen und Indexe sortiert ist. Ein Split ist ein Bereich von Zeilen aus einer Gruppe von Tabellen oder einem Index. Der Anfang des Splits wird als Split-Start bezeichnet. Mit dem Split-Limit wird das Ende des Splits festgelegt. Der Split umfasst den Split-Start, aber nicht das Split-Limit.

In Spanner sind Hotspots Situationen, in denen zu viele Anfragen an denselben Server gesendet werden, wodurch die Ressourcen des Servers überlastet werden und möglicherweise hohe Latenzen auftreten. Die von Hotspots betroffenen Splits werden als heiße oder warme Splits bezeichnet.

Die Hotspot-Statistik eines Splits (im System als CPU_USAGE_SCORE identifiziert) ist ein Maß für die Last auf einem Split, die durch die auf dem Server verfügbaren Ressourcen eingeschränkt ist. Dieser Wert wird als Prozentsatz angegeben. Wenn mehr als 50% der Last auf einem Split durch die verfügbaren Ressourcen eingeschränkt werden, gilt der Split als „warm“. Wenn 100% der Last auf einem Split eingeschränkt sind, gilt der Split als „hot“. Solche Hot Splits können sich auch auf die Latenz der Anfragen auswirken, die von ihnen verarbeitet werden.

Die CPU_USAGE_SCORE eines Splits kann konstant bleiben oder sich im Laufe der Zeit ändern, je nachdem, auf welche Arbeitslasten der Split zugreift und wie sich die Splitgrenzen ändern.

Basierend auf den Ressourcenbeschränkungen für warme und heiße Splits verwendet Spanner möglicherweise lastbasierte Aufteilung, um die Last gleichmäßig auf den Schlüsselbereich zu verteilen. Die warmen und heißen Splits können zur Lastverteilung auf die Server der Instanz verschoben werden. Spanner führt die lastbasierte Aufteilung im Hintergrund durch, um die Auswirkungen auf die Latenz zu minimieren. Aufgrund von Anti-Patterns in der Anwendung kann Spanner die Last jedoch möglicherweise auch nach mehreren Versuchen nicht ausgleichen. In der Spalte UNSPLITTABLE_REASONS in den Statistikansichten finden Sie die genauen Gründe, warum ein Hot- oder Warm-Split nicht weiter unterteilt werden konnte. Daher müssen dauerhafte warme oder heiße Splits, die mindestens 10 Minuten dauern, möglicherweise weiter untersucht und die Anwendung geändert werden, insbesondere wenn UNSPLITTABLE_REASONS vorhanden sind.

Mit den Statistiken zum Heißlaufen von Spanner-Splits können Sie die Splits ermitteln, in denen Hotspots auftreten, und nachvollziehen, warum sie möglicherweise bestehen bleiben. Anhand dieser Statistiken und UNSPLITTABLE_REASONS-Codes können Sie ermitteln, welche Maßnahmen Sie ergreifen müssen, um Hotspots zu beheben. Sie können dann bei Bedarf Änderungen an Ihrer Anwendung oder Ihrem Schema vornehmen.

Auf Statistiken zu Hot Splits zugreifen

Cloud Spanner stellt die Statistiken für Hot Splits im Schema SPANNER_SYS bereit. SPANNER_SYS-Daten sind über GoogleSQL- und PostgreSQL-Schnittstellen verfügbar. Sie haben folgende Möglichkeiten, auf diese Daten zuzugreifen:

Die folgenden von Spanner bereitgestellten Methoden für einzelne Leseaufrufe unterstützen SPANNER_SYS nicht:

  • Starken Lesevorgang aus einer einzelnen Zeile oder mehreren Zeilen in einer Tabelle durchführen
  • Veralteten Lesevorgang aus einer einzelnen Zeile oder mehreren Zeilen in einer Tabelle durchführen
  • Aus einer einzelnen Zeile oder mehreren Zeilen in einem sekundären Index lesen

Statistiken zu am stärksten genutzten Splits

Mit den folgenden Ansichten können Sie Hot Splits im Blick behalten:

  • SPANNER_SYS.SPLIT_STATS_TOP_MINUTE: Hier werden Splits angezeigt, die in 1-Minuten-Intervallen beliebt sind.
  • SPANNER_SYS.SPLIT_STATS_TOP_10MINUTE: Hier werden Splits angezeigt, die während eines beliebigen Teils eines 10-Minuten-Intervalls beliebt sind.
  • SPANNER_SYS.SPLIT_STATS_TOP_HOUR: Hier werden Splits angezeigt, die während eines beliebigen Teils eines 1-Stunden-Intervalls beliebt sind.

Diese Ansichten haben folgende Eigenschaften:

  • Jede Ansicht enthält Daten für nicht überlappende Zeitintervalle in der Länge, die der Ansichtsname festlegt.
  • Die Intervalle basieren auf der Uhrzeit:
    • 1-Minuten-Intervalle enden nach einer vollen Minute.
    • 10-Minuten-Intervalle enden in der 10. Minute der Stunde, z. B. 11:10:00, 11:20:00.
    • 1-Stunden-Intervalle enden zu jeder vollen Stunde.
  • Nach jedem Intervall erfasst Cloud Spanner Daten von allen Servern und stellt die Daten danach in den SPANNER_SYS-Ansichten 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
  • Spanner gruppiert die Statistiken nach Splits.
  • Jede Zeile enthält Statistiken, einschließlich des CPU_USAGE_SCORE-Prozentsatzes, der angibt, wie heiß oder warm ein Split ist, für jeden Split, für den Spanner während des angegebenen Intervalls Statistiken erfasst.
  • Die Ansicht SPANNER_SYS.SPLIT_STATS_TOP_MINUTE enthält detaillierte Statistiken für jede Minute. In dieser Ansicht können Sie die letzten Ereignisse detailliert debuggen.
  • In den Ansichten SPANNER_SYS.SPLIT_STATS_TOP_10MINUTE und SPANNER_SYS.SPLIT_STATS_TOP_HOUR werden aggregierte Daten in 10‑Minuten- bzw. Stundenintervallen dargestellt. Verwenden Sie diese Ansichten für die Trendanalyse oder um Probleme der letzten Tage oder Wochen zu untersuchen. Weitere Informationen zur Aggregation finden Sie unter Ereignisaggregation ansehen.
  • Wenn Spanner nicht alle Hot Splits während des Intervalls speichern kann, priorisiert das System die Splits mit dem höchsten CPU_USAGE_SCORE-Prozentsatz im angegebenen Intervall. Wenn keine Splits zurückgegeben werden, gibt es keine Hot Splits.

Datenaufbewahrung

Die maximale Datenmenge, die Spanner für jede Ansicht zu einem beliebigen Zeitpunkt beibehält, ist wie folgt:

  • SPANNER_SYS.SPLIT_STATS_TOP_MINUTE: Intervalle der letzten 24 Stunden.
  • SPANNER_SYS.SPLIT_STATS_TOP_10MINUTE: Intervalle der letzten 4 Tage.
  • SPANNER_SYS.SPLIT_STATS_TOP_HOUR: Intervalle der letzten 30 Tage.

Diese Aufbewahrungszeiträume können nicht verlängert oder verkürzt werden und Sie können nicht verhindern, dass Spanner Statistiken zu Hot Splits erfasst.

  • Wenn Sie Statistikdaten löschen möchten, müssen Sie entweder die verfolgte Datenbank löschen oder warten, bis die Statistikdaten aus der Aufbewahrung entfernt werden.
  • Wenn Sie Statistikdaten länger aufbewahren möchten, kopieren Sie die Daten regelmäßig aus den Statistikansichten für den Hot-Split.

Schema ansehen

Die folgende Tabelle zeigt das Schema für Statistiken zu Hot Splits:

Spaltenname Typ Beschreibung
INTERVAL_END TIMESTAMP Ende des Zeitintervalls, in dem der Split stark oder sehr stark genutzt wurde.
SPLIT_START STRING Der Startschlüssel des Zeilenbereichs im Split. Der Split-Start kann auch <begin> sein, was den Beginn des Schlüsselbereichs angibt.
SPLIT_LIMIT STRING Der Limitschlüssel für den Zeilenbereich im Split. Der Limitschlüssel kann auch <end> sein, was das Ende des Schlüsselbereichs angibt.
CPU_USAGE_SCORE INT64 Der CPU_USAGE_SCORE-Prozentsatz der Splits. Ein CPU_USAGE_SCORE-Prozentsatz von 50% weist auf das Vorhandensein von warmen oder heißen Splits hin.
AFFECTED_TABLES STRING ARRAY Die Tabellen, deren Zeilen möglicherweise im Split enthalten sind.
UNSPLITTABLE_REASONS STRING ARRAY Gibt den Typ der Hotspots an, die durch die lastbasierte Aufteilung nicht behoben werden können, häufig aufgrund von Anti-Patterns. Wenn ein Grund angegeben ist, ist wahrscheinlich eine Nutzeraktion erforderlich, z. B. Anpassungen des Schemas oder der Arbeitslast. Ein leeres Array bedeutet, dass entweder während dieses Intervalls keine nicht aufteilbaren Bedingungen erkannt wurden oder die hohe Last zu kurzlebig war, als dass Spanner hätte feststellen können, ob sie nicht aufteilbar war. Weitere Informationen finden Sie unter UNSPLITTABLE_REASONS-Typen.

Split-Start- und Split-Limitschlüssel

Ein Split ist ein zusammenhängender Zeilenbereich einer Datenbank, der durch die Start- und Limit-Schlüssel definiert wird. Eine Aufteilung kann eine einzelne Zeile, ein schmaler oder ein breiter Zeilenbereich sein und mehrere Tabellen oder Indexe umfassen.

In den Spalten SPLIT_START und SPLIT_LIMIT werden die Primärschlüssel einer warmen oder heißen Aufteilung angegeben.

Beispielschema

Das folgende Schema ist eine Beispielstabelle für die Themen auf dieser Seite.

GoogleSQL

CREATE TABLE Users (
  UserId INT64 NOT NULL,
  FirstName STRING(MAX),
  LastName STRING(MAX),
) PRIMARY KEY(UserId);

CREATE INDEX UsersByFirstName ON Users(FirstName DESC);

CREATE TABLE Threads (
  UserId INT64 NOT NULL,
  ThreadId INT64 NOT NULL,
  Starred BOOL,
) PRIMARY KEY(UserId, ThreadId),
  INTERLEAVE IN PARENT Users ON DELETE CASCADE;

CREATE TABLE Messages (
  UserId INT64 NOT NULL,
  ThreadId INT64 NOT NULL,
  MessageId INT64 NOT NULL,
  Subject STRING(MAX),
  Body STRING(MAX),
) PRIMARY KEY(UserId, ThreadId, MessageId),
  INTERLEAVE IN PARENT Threads ON DELETE CASCADE;

CREATE INDEX MessagesIdx ON Messages(UserId, ThreadId, Subject),
INTERLEAVE IN Threads;

PostgreSQL

CREATE TABLE users
(
   userid    BIGINT NOT NULL PRIMARY KEY,-- INT64 to BIGINT
   firstname VARCHAR(max),-- STRING(MAX) to VARCHAR(MAX)
   lastname  VARCHAR(max)
);

CREATE INDEX usersbyfirstname
  ON users(firstname DESC);

CREATE TABLE threads
  (
    userid   BIGINT NOT NULL,
    threadid BIGINT NOT NULL,
    starred  BOOLEAN, -- BOOL to BOOLEAN
    PRIMARY KEY (userid, threadid),
    CONSTRAINT fk_threads_user FOREIGN KEY (userid) REFERENCES users(userid) ON
    DELETE CASCADE -- Interleave to Foreign Key constraint
  );

CREATE TABLE messages
  (
    userid    BIGINT NOT NULL,
    threadid  BIGINT NOT NULL,
    messageid BIGINT NOT NULL PRIMARY KEY,
    subject   VARCHAR(max),
    body      VARCHAR(max),
    CONSTRAINT fk_messages_thread FOREIGN KEY (userid, threadid) REFERENCES
    threads(userid, threadid) ON DELETE CASCADE
  -- Interleave to Foreign Key constraint
  );

CREATE INDEX messagesidx ON messages(userid, threadid, subject), REFERENCES
threads(userid, threadid);

Stellen Sie sich vor, Ihr Schlüsselbereich sieht so aus:

PRIMÄRSCHLÜSSEL
<begin>
Users()
Threads()
Users(2)
Users(3)
Threads(3)
Threads(3,"a")
Messages(3,"a",1)
Messages(3,"a",2)
Threads(3, "aa")
Users(9)
Users(10)
Threads(10)
UsersByFirstName("abc")
UsersByFirstName("abcd")
<end>

Beispiel für Splits

Im Folgenden finden Sie einige Beispiele für Splits, damit Sie sich ein Bild davon machen können.

SPLIT_START und SPLIT_LIMIT können die Zeile einer Tabelle oder eines Index angeben oder <begin> und <end> sein, die die Grenzen des Schlüsselbereichs der Datenbank darstellen. SPLIT_START und SPLIT_LIMIT können auch gekürzte Schlüssel enthalten, die allen vollständigen Schlüsseln in der Tabelle vorangestellt sind. Threads(10) ist beispielsweise ein Präfix für jede Threads-Zeile, die in Users(10) verschachtelt ist.

SPLIT_START SPLIT_LIMIT AFFECTED_TABLES ERKLÄRUNG
Users(3) Users(10) UsersByFirstName: Users, Threads, Messages, MessagesIdx Die Aufteilung beginnt in der Zeile mit UserId=3 und endet in der Zeile vor der Zeile mit UserId = 10. Der Split enthält die Users-Tabellenzeilen und alle zugehörigen überlappenden Tabellenzeilen für UserId=3 bis 10.
Messages(3,"a",1) Threads(3,"aa") Threads, Messages, MessagesIdx Der Split beginnt mit der Zeile mit UserId=3, ThreadId="a" und MessageId=1 und endet mit der Zeile vor der Zeile mit dem Schlüssel UserId=3 und ThreadsId = "aa". Die Aufteilung enthält alle Tabellen zwischen Messages(3,"a",1) und Threads(3,"aa"). Da split_start und split_limit in derselben Zeile der übergeordneten Tabelle verschränkt sind, enthält der Split die Zeilen der verschränkten Tabellen zwischen dem Start und dem Grenzwert. Unter schemas-overview erfahren Sie, wie verschachtelte Tabellen zusammen angeordnet werden.
Messages(3,"a",1) <end> UsersByFirstName: Users, Threads, Messages, MessagesIdx Die Aufteilung beginnt in der Tabelle „messages“ in der Zeile mit dem Schlüssel UserId=3, ThreadId="a" und MessageId=1. Der Split enthält alle Zeilen von split_start bis <end>, dem Ende des Schlüsselbereichs der Datenbank. Alle Zeilen der Tabellen nach dem split_start, z. B. Users(4), sind im Split enthalten.
<begin> Users(9) UsersByFirstName: Users, Threads, Messages, MessagesIdx Der Split beginnt bei <begin>, dem Beginn des Schlüsselbereichs der Datenbank, und endet in der Zeile vor der Users-Zeile mit UserId=9. Der Split enthält also alle Tabellenzeilen vor Users, alle Zeilen der Users-Tabelle vor UserId=9 und die Zeilen der verschachtelten Tabellen.
Messages(3,"a",1) Threads(10) UsersByFirstName: Users, Threads, Messages, MessagesIdx Der Split beginnt bei Messages(3,"a", 1), das in Users(3) verschachtelt ist, und endet in der Zeile vor Threads(10). Threads(10) ist ein gekürzter Split-Schlüssel, der ein Präfix eines beliebigen Schlüssels der Threads-Tabelle ist, die in Users(10) verschachtelt ist.
Users() <end> UsersByFirstName: Users, Threads, Messages, MessagesIdx Der Split beginnt mit dem gekürzten Split-Schlüssel von Users(), der jedem vollständigen Schlüssel der Tabelle Users vorangestellt ist. Der Split erstreckt sich bis zum Ende des möglichen Schlüsselbereichs in der Datenbank. Die affected_tables umfassen daher die Tabelle Users, ihre verschachtelten Tabellen und Indexe sowie alle Tabellen, die nach „users“ angezeigt werden.
Threads(10) UsersByFirstName("abc") UsersByFirstName: Users, Threads, Messages, MessagesIdx Der Split beginnt in der Threads-Zeile mit UserId = 10 und endet am Index UsersByFirstName mit dem Schlüssel vor "abc".

UNSPLITTABLE_REASONS-Typen

Wenn Spanner einen Hotspot nicht durch lastbasiertes Aufteilen beheben kann, werden in der Spalte UNSPLITTABLE_REASONS der Ansichten SPLIT_STATS_TOP_* einer oder mehrere der folgenden Gründe angegeben:

HOT_ROW

Beschreibung:Die hohe Last konzentriert sich auf eine einzelne Zeile. In Spanner können keine Aufteilungspunkte innerhalb einer einzelnen Zeile hinzugefügt werden.

Häufige Ursachen:

  • Häufige Vorgänge mit hohem Volumen (Lesen, Schreiben oder Aktualisieren) für einen einzelnen Schlüssel.
  • Schemadesigns, die den Zugriff auf eine einzelne Zeile zentralisieren.

Strategien zur Risikominderung:

  • Reduzieren Sie die QPS für den Hot Split.
  • Schema neu gestalten, um die Last zu verteilen Zähler können beispielsweise auf mehrere Zeilen verteilt werden.
  • Best Practices für Schemadesign

MOVING_HOT_SPOT

Beschreibung:Der Schlüsselbereich, der eine hohe Belastung aufweist, verschiebt sich im Laufe der Zeit, oft sequenziell. Die lastbasierte Aufteilung ist ineffektiv, da sich der Hotspot verlagert, bevor Spanner den zuvor betroffenen Bereich aufteilen kann.

Häufige Ursachen:

  • Einfügungen mit einem monoton steigenden oder fallenden führenden Schlüsselteil, z. B. einem Commit-Zeitstempel.
  • Sequenzielle Punktlesevorgänge im gesamten Schlüsselbereich einer Tabelle.

Strategien zur Risikominderung:

  • Vermeiden Sie monoton steigende oder fallende Schlüssel für den ersten Teil des Primärschlüssels bei schreibintensiven Arbeitslasten. Detaillierte Strategien zur Risikominderung finden Sie unter Best Practices für das Schemadesign. Dazu können Sie beispielsweise UUIDs verwenden oder einen Hash des Schlüssels voranstellen.

LARGE_SCAN_HOT_SPOT

Beschreibung:Die Aufteilung ist aufgrund häufiger oder ressourcenintensiver Vorgänge, die einen wichtigen Bereich durchsuchen, stark ausgelastet. Dazu können Bereichslesevorgänge (einschließlich Lesevorgängen, die als Teil einer Transaktion ausgegeben werden) oder Abfragen gehören. Spanner vermeidet es, die von solchen Vorgängen abgedeckten Bereiche übermäßig aufzuteilen, um potenzielle Leistungseinbußen bei diesen Scans zu vermeiden, die auftreten können, wenn die Daten zu stark über viele kleine Aufteilungen fragmentiert werden.

Häufige Ursachen:

  • Abfragen oder Lesevorgänge, die umfangreiche Scans für häufig aufgerufene Daten ausführen.
  • DML-Anweisungen (UPDATE, DELETE) mit WHERE-Klauseln, für die Bereiche gescannt werden müssen.
  • Fehlen geeigneter Indexe, was zu Scans der Basistabelle führt.

Strategien zur Risikominderung:

  • Optimieren Sie SQL-Anweisungen (SELECT, UPDATE, DELETE), um die Anzahl der gescannten Zeilen zu reduzieren.
  • Erstellen Sie geeignete Indexe, um gängige Abfrage- und DML-Prädikate zu unterstützen und die Anzahl der gescannten Zeilen zu minimieren.

UNISOLATABLE_HOT_ROW

Beschreibung:Spanner erkennt einen Schlüssel mit geringer Breite und hoher Last, kann ihn aber nicht isolieren, indem neue Split-Punkte eingefügt werden, da kein geeigneter Split-Punkt verfügbar ist. Dieser Fall ähnelt HOT_ROW, aber SPLIT_START und SPLIT_LIMIT isolieren den Hotspot nicht vollständig.

Häufige Ursachen:

  • Hohe, lokalisierte Last für eine Zeile oder benachbarte Zeilen mit demselben Schlüsselpräfix.

Strategien zur Risikominderung:

  • Analysieren Sie die Zugriffsmuster der Anwendungen für die Schlüssel in den gemeldeten SPLIT_START und SPLIT_LIMIT.
  • Strategien zur Minderung überschneiden sich häufig mit HOT_ROW und konzentrieren sich auf die Reduzierung der direkten operativen Belastung des problematischen schmalen Schlüsselbereichs.

UNSPECIFIED

Beschreibung: Der Split ist stark ausgelastet und kann nicht aufgeteilt werden. Die Ursache fällt jedoch nicht unter die anderen spezifischen Kategorien. Dies kann bei komplexen Lastszenarien oder aufgrund des internen Systemverhaltens passieren.

Strategien zur Risikominderung:

  • Untersuchen Sie Anwendungsarbeitslasten, Abfragen oder Transaktionen, die auf die Tabellen im Hot Split (in AFFECTED_TABLES aufgeführt) zugreifen und eine erhöhte Last aufweisen.
  • Mit Tools wie Query Insights und Transaction Insights können Sie kostspielige Vorgänge identifizieren.
  • Bewerten Sie die Arbeitslast und achten Sie darauf, dass Sie die Best Practices für das Schemadesign und die Best Practices für SQL verwenden.
  • Wenn der Hotspot trotz der vorherigen Optimierungen länger als 10 Minuten bestehen bleibt, erstellen Sie eine Supportanfrage.

Ereignisaggregation ansehen

Einträge in den Ansichten SPANNER_SYS.SPLIT_STATS_TOP_10MINUTE und SPANNER_SYS.SPLIT_STATS_TOP_HOUR stellen eine Aggregation der 1-Minuten-Intervalle innerhalb der jeweiligen Fenster dar:

CPU_USAGE_SCORE: Hier wird der maximale CPU_USAGE_SCORE angezeigt, der für das Segment in einem beliebigen 1‑Minuten-Intervall innerhalb des 10‑Minuten- oder 1‑Stunden-Zeitraums aufgezeichnet wurde.

UNSPLITTABLE_REASONS: Dieses Array ist eine Vereinigung aller eindeutigen UNSPLITTABLE_REASONS, die für die Aufteilung in allen 1-Minuten-Intervallen innerhalb des Fensters beobachtet wurden.

Eine Aufschlüsselung wird in diesen Ansichten angezeigt, wenn die CPU_USAGE_SCORE in mindestens einem der zugrunde liegenden 1-Minuten-Intervalle 50% oder höher war.

Beispiel für die Aggregation

Sehen Sie sich den Split von Users(101) bis Users(102) an. In der folgenden Tabelle sind die möglichen Einträge in der Ansicht MINUTE über einen Zeitraum von 10 Minuten (10:00:00 bis 10:10:00) dargestellt:

INTERVAL_END SPLIT_START SPLIT_LIMIT CPU_USAGE_SCORE AFFECTED_TABLES UNSPLITTABLE_REASONS
10:01:00 Nutzer(101) Nutzer(102) 60 [Messages,Users,Threads] []
10:02:00 Nutzer(101) Nutzer(102) 95 [Messages,Users,Threads] [HOT_ROW]
10:03:00 Nutzer(101) Nutzer(102) 80 [Messages,Users,Threads] [HOT_ROW]
10:04:00 Nutzer(101) Nutzer(102) 55 [Users,Threads] []
10:06:00 Nutzer(101) Nutzer(102) 70 [Users,Threads] [LARGE_SCAN_HOT_SPOT]
10:07:00 Nutzer(101) Nutzer(102) 65 [Users,Threads] [LARGE_SCAN_HOT_SPOT]
10:09:00 Nutzer(101) Nutzer(102) 52 [Users,Threads] []

Der entsprechende aggregierte Eintrag in 10MINUTE für das Intervall, das um 10:10:00 endet, wäre für diesen Split:

INTERVAL_END SPLIT_START SPLIT_LIMIT CPU_USAGE_SCORE AFFECTED_TABLES UNSPLITTABLE_REASONS
10:10:00 Nutzer(101) Nutzer(102) 95 [Messages,Users,Threads] [HOT_ROW, LARGE_SCAN_HOT_SPOT]
  • CPU_USAGE_SCORE: 95 ist der maximale Wert aus der Spalte CPU_USAGE_SCORE in der 1-Minuten-Ansicht für diesen Split im Fenster.
  • UNSPLITTABLE_REASONS: [HOT_ROW, LARGE_SCAN_HOT_SPOT] ist die Vereinigung aller eindeutigen Gründe, die in der Spalte UNSPLITTABLE_REASONS in der 1-Minuten-Ansicht enthalten sind.

In diesem Beispiel wird gezeigt, wie in der Ansicht 10MINUTE die höchste Belastung und alle Arten von nicht aufteilbaren Problemen zusammengefasst werden, die im Zeitraum aufgetreten sind. Für die Ansicht HOUR gilt dieselbe Aggregationslogik über ein Zeitfenster von 60 Minuten.

Beliebte Splits finden

Mit der folgenden SQL-Anweisung können Sie Statistiken zu Hot Splits abrufen. Sie können diese SQL-Anweisungen mit den Clientbibliotheken, der Google Cloud CLI oder derGoogle Cloud -Konsole ausführen.

SELECT
  t.interval_end,
  t.split_start,
  t.split_limit,
  t.cpu_usage_score,
  t.affected_tables,
  t.unsplittable_reasons
FROM
  SPANNER_SYS.SPLIT_STATS_TOP_DURATION AS t
WHERE
  -- Optional: Filter by a specific interval end time
  -- t.interval_end = 'INTERVAL_END_TIME'
ORDER BY
  t.interval_end DESC, t.cpu_usage_score DESC;

Ersetzen Sie Folgendes:

  • DURATION: Wählen Sie je nach Beobachtungszeitraum MINUTE, 10MINUTE oder HOUR aus. Beispiel: SPANNER_SYS.SPLIT_STATS_TOP_HOUR.
  • INTERVAL_END_TIME: Ersetzen Sie dies durch einen TIMESTAMP für die Endzeit Ihres Beobachtungszeitraums. Beispiel: 2072-06-08 08:30:00Z

Abfrageergebnisse interpretieren

Eine vollständige Liste der UNSPLITTABLE_REASONS-Codes und der möglichen Diagnosen finden Sie unter UNSPLITTABLE_REASONS-Typen. Die Ausgabe Ihrer Anfrage könnte beispielsweise so aussehen:

SPLIT_START SPLIT_LIMIT CPU_USAGE_SCORE AFFECTED_TABLES UNSPLITTABLE_REASONS
Threads(10) Threads(10, "aa") 100 Nachrichten,Threads [UNISOLATABLE_HOT_ROW]
Messages(631, "abc", 1) Messages(631, "abc", 3) 100 Nachrichten [HOT_ROW]
Nutzer(620) <end> 100 Nachrichten,Nutzer,Unterhaltungen [MOVING_HOT_SPOT]
Nutzer(101) Nutzer(102) 90 Nachrichten,Nutzer,Unterhaltungen [HOT_ROW]
Nutzer(13) Nutzer(76) 82 Nachrichten,Nutzer,Unterhaltungen [LARGE_SCAN_HOT_SPOT]
Threads(12, "zebra") Nutzer(14) 76 Nachrichten,Nutzer,Unterhaltungen []

Aus diesen Ergebnissen lassen sich die folgenden Probleme ableiten:

  • Threads(10) bis Threads(10, "aa"): Heiß bei 100% mit [UNISOLATABLE_HOT_ROW]. Ein einzelner Schlüssel, ein Schlüsselbereichspräfix in der Tabelle Threads oder eine verschachtelte Tabelle ist ein Hotspot und Spanner kann den Bereich nicht weiter aufteilen.
  • Messages(631, "abc", 1) bis Messages(631, "abc", 3): Heiß bei 100% mit [HOT_ROW]. Die Last konzentriert sich für diesen Nutzer und Thread auf MessageId 1 und 2.
  • Nutzer(620) bis <end>:Heiß bei 100% mit [MOVING_HOT_SPOT]. Dies deutet häufig auf ein Muster von Einfügungen mit monoton steigenden oder fallenden Nutzer-IDs hin, wodurch das Ende des Schlüsselbereichs dauerhaft überlastet ist.
  • Nutzer(101) bis Nutzer(102): Heiß bei 90% mit [HOT_ROW]. Die Last konzentriert sich auf die einzelne Zeile „Users“ (Nutzer) mit „UserId“ = 101 und die verschachtelten untergeordneten Elemente.
  • Nutzer(13) bis Nutzer(76): Heiß mit 82% bei [LARGE_SCAN_HOT_SPOT]. Das deutet auf häufige oder teure Scans in diesem Bereich von Nutzer-IDs hin.
  • Threads(12, "zebra") to Users(14): Warm at 76% usage. In diesem Zeitraum wurden keine Gründe für nicht aufteilbare Segmente erkannt. Spanner kann die Aufteilung möglicherweise trotzdem vornehmen, wenn die Last bestehen bleibt oder zunimmt.

Fehlerbehebung bei Hotspots mithilfe von Statistiken zu stark genutzten Splits

In diesem Abschnitt wird beschrieben, wie Sie Hotspots erkennen und Fehler beheben.

Zeitraum für die Untersuchung auswählen

Sehen Sie sich die Latenzmesswerte für Ihre Spanner-Datenbank an, um den Zeitraum zu ermitteln, in dem Ihre Anwendung eine hohe Latenz und CPU-Auslastung aufwies. Beispiel: Ein Problem trat am 18. Mai 2072 um 22:50 Uhr auf.

Nach Gründen für Nichtaufteilbarkeit suchen

Da Spanner die Last mit lastbasierter Aufteilung ausgleicht, empfehlen wir, Hotspots zu untersuchen, die länger als 10 Minuten anhalten, insbesondere wenn sie UNSPLITTABLE_REASONS haben. Das Vorhandensein von UNSPLITTABLE_REASONS weist darauf hin, dass Spanner den Hot-Split nicht aufteilen kann. Möglicherweise sind Schema- oder Arbeitslaständerungen erforderlich, um den Hotspot zu beheben.

Sie können UNSPLITTABLE_REASONS abfragen, wie im folgenden Beispiel gezeigt:

SELECT
  reason,
  COUNT(*) AS occurrences
FROM
  SPANNER_SYS.SPLIT_STATS_TOP_MINUTE AS t,
  UNNEST(t.unsplittable_reasons) AS reason
WHERE
  t.cpu_usage_score >= 50
  AND ARRAY_LENGTH(t.unsplittable_reasons) > 0
  AND t.interval_end >= "2072-05-18T17:40:00Z"  -- Start of window
  AND t.interval_end <= "2072-05-18T17:50:00Z"  -- End of window
GROUP BY
  reason
ORDER BY
  occurrences DESC;

Das Vorhandensein von UNSPLITTABLE_REASONS weist darauf hin, dass weitere Fehlerbehebungen erforderlich sind.

Sie können auch nicht aufteilbare Gründe mit Cloud Monitoring überwachen. Der zu verwendende Messwert ist unsplittable_reason_count. Weitere Informationen finden Sie unter Spanner-Messwerte.

Suche die Splits mit dem höchsten CPU_USAGE_SCORE und dem zugehörigen UNSPLITTABLE_REASONS.

In diesem Beispiel führen wir den folgenden SQL-Befehl aus, um die Zeilenbereiche mit dem höchsten CPU_USAGE_SCORE-Wert und dem entsprechenden UNSPLITTABLE_REASONS zu ermitteln:

GoogleSQL

SELECT t.split_start,
     t.split_limit,
     t.cpu_usage_score,
     t.affected_tables,
     t.unsplittable_reasons
FROM   SPANNER_SYS.SPLIT_STATS_TOP_MINUTE t
WHERE  t.cpu_usage_score >= 50
AND  t.interval_end = "interval_end_date_time";

Ersetzen Sie interval_end_date_time durch das Datum und die Uhrzeit für das Intervall im Format JJJJ-MM-TTTHH:MM:SSZ. Beispiel: 2072-05-18T17:40:00Z

PostgreSQL

SELECT t.split_start,
     t.split_limit,
     t.cpu_usage_score,
     t.affected_tables,
     t.unsplittable_reasons
FROM   spanner_sys.split_stats_top_minute t
WHERE  t.cpu_usage_score >= 50
AND  t.interval_end = 'interval_end_date_time'::timestamptz;

Ersetzen Sie interval_end_date_time durch das Datum und die Uhrzeit für das Intervall im Format JJJJ-MM-TTTHH:MM:SSZ. Beispiel: 2072-05-18T17:40:00Z

Der vorherige SQL-Code gibt Folgendes aus:

SPLIT_START SPLIT_LIMIT CPU_USAGE_SCORE AFFECTED_TABLES UNSPLITTABLE_REASONS
Users(180) <end> 85 Messages,Users,Threads [MOVING_HOT_SPOT]
Users(24) Users(76) 76 Messages,Users,Threads [HOT_ROW, LARGE_SCAN_HOT_SPOT]
Threads(10) UsersByFirstName("abc") 100 UsersByFirstName, Users, Threads, Messages, MessagesIdx []

In dieser Ergebnistabelle sehen Sie, dass es drei Hot Splits gibt und zwei davon nicht aufteilbar sind. Hotspots mit UNSPLITTABLE_REASONS, die über einen längeren Zeitraum bestehen, sollten genauer untersucht werden. Informationen zur Bedeutung der einzelnen Gründe und zur Behebung der Probleme finden Sie unter UNSPLITTABLE_REASONS-Typen.

Best Practices zur Vermeidung von Hotspots

Hinweis:Wenn die Last zugenommen hat und Sie die Instanz vor Kurzem skaliert haben, kann es einige Minuten dauern, bis Spanner die Load-Balancing-Vorgänge ausführt und die Latenz sinkt.

Wenn die Latenz durch den Lastenausgleich nicht verringert wird, müssen Sie als Nächstes die Ursache der Hotspots ermitteln. Danach haben Sie die Möglichkeit, die Hotspot-Arbeitslast zu reduzieren oder das Anwendungsschema und die Anwendungslogik zu optimieren, um Hotspots zu vermeiden.

Ursache ermitteln

  • Verwenden Sie Lock & Transaction Insights, um nach Transaktionen mit einer hohen Wartezeit für Sperren zu suchen, bei denen der Startschlüssel des Zeilenbereichs innerhalb des Hot-Splits liegt.
  • Verwenden Sie Abfragestatistiken, um nach Abfragen zu suchen, die Daten aus der Tabelle mit dem Hot Split lesen und bei denen die Latenz in letzter Zeit gestiegen ist oder das Verhältnis von Latenz zu CPU höher ist.
  • Suchen Sie mit älteste aktive Abfragen nach Abfragen, die Daten aus der Tabelle mit dem Hot Split lesen und eine höhere als erwartete Latenz aufweisen.

Einige Sonderfälle, auf die Sie achten sollten:

  • Prüfen Sie, ob die Gültigkeitsdauer (TTL) vor Kurzem aktiviert wurde. Wenn es viele Splits aus alten Daten gibt, kann die TTL bei Massenlöschungen zu einem Anstieg der CPU_USAGE_SCORE-Werte führen. In diesem Fall sollte sich das Problem automatisch beheben, sobald die ursprünglichen Löschvorgänge abgeschlossen sind.

Arbeitslast optimieren

  • Best Practices für SQL Erwägen Sie, veraltete Lesevorgänge, Schreibvorgänge ohne vorherige Lesevorgänge oder das Hinzufügen von Indexen zu verwenden.
  • Orientieren Sie sich an den Best Practices für Schemas. Achten Sie darauf, dass Ihr Schema für das Load-Balancing ausgelegt ist und Hotspots vermieden werden.

Nächste Schritte