한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

Game-Lag-Whitepaper › L12 Datenbank

Login-Ansturm und N+1-Queries Login storm, N+1 queries

Ursachen-ID db-login-storm · Hauptzuständig Server-Entwicklung (Entwicklungsteam) · Beteiligt DB-Infrastruktur (Infrastrukturteam)

In der interaktiven Fassung mit Grafiken und Experimenten öffnen →

Fragt das Laden eines einzigen Charakters die DB einige Dutzend Mal einzeln ab, werden aus Zehntausenden gleichzeitigen Logins Millionen von Queries.

Warum Beim Laden des Charakters werden Items, Skills und Quests jeweils einzeln abgefragt → Folge Gleichzeitige Logins direkt nach der Wartung lassen die Query-Zahl explodieren → Auf dem Bildschirm Endlos-Laden beim Login, selbst das Speichern von Spielern im laufenden Spiel stockt

Symptome
Kein Login / Endlos-Laden, Input-Lag
Faktoren
Stillstand, Latenz
Wer ist betroffen
Ganzer Server
Wann
Direkt nach Login oder Wartung
Zuständigkeit
Hauptzuständig Server-Entwicklung (Entwicklungsteam) · Beteiligt DB-Infrastruktur (Infrastrukturteam)
Aufgaben Entwicklungsteam
Daten gebündelt abfragen, Login-Warteschlange einsetzen, cachen, die durch Lazy Loading im ORM erzeugte Zahl der Abfragen prüfen.
Aufgaben Infrastrukturteam
Rangliste der am häufigsten aufgerufenen Queries erstellen und weitergeben, Query- und Verbindungszahl im Login-Zeitraum direkt nach der Wartung überwachen.
Im Graphen
Ansturm direkt nach Login oder Wartung · DB-Queries pro Sekunde, Logins
Wo nachsehen
Logins direkt nach der Wartung und DB-Queries pro Sekunde (bei MySQL Zuwachs von Questions) übereinanderlegen, Queries pro Login berechnen. Die am häufigsten aufgerufenen Queries über COUNT_STAR in MySQL events_statements_summary_by_digest bzw. calls in PostgreSQL pg_stat_statements ermitteln
Spricht dafür
Einige Dutzend Queries pro Login, die Top-Queries sind kurze, gleich aufgebaute Abfragen über eine einzelne Charakter-ID. Ist die Query-Zahl pro Login nach einem Patch gestiegen, ist dieser Patch der Ausgangspunkt
Spricht dagegen
Wenige Queries pro Login, aber jede einzelne langsam: kalter Cache (db-cold-cache) oder Index (db-no-index)
Prüfmittel
Mit Infrastruktur-Tools prüfbar (ohne Spielcode)
Mehr dazu
Lazy Loading im ORM (einer Bibliothek, die DB-Abfragen automatisch erzeugt) produziert solche Abfragen, ohne dass es den Entwicklern auffällt. Auf dem Entwicklungsserver mit wenigen Charakteren merkt man nichts davon. Sichtbar wird es erst bei gleichzeitigen Logins im Live-Betrieb.

Quellen

  1. Efficient Querying .NET
    Lazy Loading im ORM erzeugt das N+1-Problem, bei dem für jedes Element eine weitere Query gesendet wird, und verschlechtert die Performance stark; empfohlen wird gebündeltes Laden (Eager Loading)
  2. pg_stat_statements — track statistics of SQL planning and execution PostgreSQL
    Sammelt Ausführungsanzahl (calls) und Gesamtlaufzeit je Anweisung und liefert so eine Rangliste der am häufigsten aufgerufenen Queries
  3. Performance Schema Statement Digests and Sampling MySQL
    events_statements_summary_by_digest fasst gleich aufgebaute Queries zusammen und aggregiert Anzahl und Zeit
  4. Statement Summary Tables MySQL
    COUNT_STAR (Anzahl der Ausführungen) und SUM_TIMER_WAIT (Gesamtzeit) in den Summary-Tabellen
  5. Server Status Variables MySQL
    Questions: Anzahl der vom Client gesendeten Anweisungen

Verwandte Ursachen

Gleiche Schicht: L12 Datenbank

Ursachen aus anderen Schichten mit demselben Symptom (Kein Login / Endlos-Laden)

Karte in der interaktiven Fassung mit Grafiken und Experimenten ansehen