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
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
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)