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

Game-Lag-Whitepaper › L9 Spielprozess auf dem Server

Synchrone Aufrufe im Game-Thread Synchronous DB / file I/O on the game loop

Ursachen-ID sp-sync-call · Hauptzuständig Server-Entwicklung (Entwicklungsteam)

In der interaktiven Fassung mit Grafiken und Experimenten öffnen →

Wartet der Server mitten im Tick auf eine DB-Antwort oder einen Schreibvorgang, steht das gesamte Spielgeschehen für genau diese Zeit still.

Warum Innerhalb des Ticks wird auf DB-Abfragen und -Speichervorgänge, Log-Schreibvorgänge und externe API-Aufrufe gewartet → Folge Braucht die DB 100 ms, steht auch der Tick 100 ms still → Auf dem Bildschirm Bei jeder Verlangsamung von DB oder Datenträger stockt das ganze Gebiet kurz

Symptome
Freeze, Ruckeln
Faktoren
Stillstand
Wer ist betroffen
Bestimmter Ort oder Kanal, Ganzer Server
Wann
Bei bestimmten Aktionen, Gelegentlich, zufällig
Zuständigkeit
Hauptzuständig Server-Entwicklung (Entwicklungsteam)
Aufgaben Entwicklungsteam
Langsame Vorgänge (DB-Abfragen und -Speichervorgänge, Log-Schreibvorgänge, externe API-Aufrufe) vollständig asynchron auslagern und das Ergebnis im nächsten Tick übernehmen (mit nur einem Timeout steht der Tick während der Wartezeit weiterhin still).
Größenordnungen
Selbst ein DB-Round-Trip von 0,5 ms im selben Rechenzentrum summiert sich bei 100 Aufrufen pro Tick auf 50 ms. Das verbraucht allein das komplette Budget eines Servers mit 20 Ticks pro Sekunde.
Im Graphen
Vereinzelte Spitzen ohne Muster · Server-Tick-Zeit, DB-Query-Latenz
Wo nachsehen
Graph der Tick-Zeit, DB-Query-Latenz (slow query log u. a.) und Disk-Latenz auf derselben Zeitachse darstellen. Ohne Tick-Metriken mit bcc offcputime -p ermitteln, wo der Game-Thread wartet
Spricht dafür
Tick-Spitzen fallen zeitlich mit Spitzen der DB- oder Dateilatenz zusammen, und die Wartezeit des Game-Threads entfällt auf Call-Stacks für den Empfang von DB-Antworten oder das Schreiben von Dateien
Spricht dagegen
DB- und Disk-Latenz unauffällig, Tick schlägt trotzdem aus: eher GC-Pause oder Lock-Contention
Prüfmittel
Logs oder Metriken aus Spielserver bzw. Client nötig

Quellen

  1. Designs, Lessons and Advice from Building Large Distributed Systems Google
    Keynote auf der LADIS 2009 (Jeff Dean). Round Trip innerhalb desselben Rechenzentrums etwa 0,5 ms (500.000 ns)
  2. ASP.NET Core Best Practices Microsoft
    Datenzugriffe, I/O und langlaufende Operationen asynchron aufrufen, synchron blockierende Aufrufe führen zur Erschöpfung des Thread-Pools und zu verzögerten Antworten
  3. Demonstrations of offcputime, the Linux eBPF/bcc version IO Visor
    Summiert die Zeit, in der Threads angehalten waren und die CPU verlassen hatten (off-CPU), pro Call-Stack, -p wählt den Prozess

Verwandte Ursachen

Gleiche Schicht: L9 Spielprozess auf dem Server

Ursachen aus anderen Schichten mit demselben Symptom (Freeze)

Karte in der interaktiven Fassung mit Grafiken und Experimenten ansehen