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

Game-Lag-Whitepaper › L11 Datenträger

Synchrones Schreiben von Logs Synchronous logging

Ursachen-ID dk-sync-log · Hauptzuständig Server-Entwicklung (Entwicklungsteam) · Beteiligt Server-Infrastruktur (Infrastrukturteam)

In der interaktiven Fassung mit Grafiken und Experimenten öffnen →

Wartet der Game-Thread bei jeder Logzeile, bis der Datenträger fertig ist, bleibt bei ausgelastetem Datenträger auch das Spielgeschehen stehen.

Warum Kampf- und Handelslogs werden direkt aus dem Game-Thread in eine Datei geschrieben → Folge Wird sicheres Speichern (fsync) verlangt oder ist der Schreibpuffer des OS (Page Cache) am Limit, dauert bei ausgelastetem Datenträger ein einzelner Schreibvorgang einige Dutzend ms → Auf dem Bildschirm Kurzes Stocken in Kämpfen mit vielen Logeinträgen

Symptome
Ruckeln, Freeze
Faktoren
Stillstand
Wer ist betroffen
Bestimmter Ort oder Kanal, Ganzer Server
Wann
Bei großem Andrang
Zuständigkeit
Hauptzuständig Server-Entwicklung (Entwicklungsteam) · Beteiligt Server-Infrastruktur (Infrastrukturteam)
Aufgaben Entwicklungsteam
Asynchron loggen (Puffer im Speicher + eigener Thread), Logmenge reduzieren, im Game-Thread kein fsync aufrufen.
Aufgaben Infrastrukturteam
Log-Rotation und -Komprimierung mit niedriger I/O-Priorität ausführen, Logs auf einem anderen Datenträger als die Daten ablegen, Disk-Schreiblatenz überwachen.
Im Graphen
Vereinzelte Spitzen ohne Muster · Server-Tick-Zeit, Disk-Schreiblatenz
Wo nachsehen
w_await und aqu-sz aus iostat -x 1 über die Tick-Zeit legen, mit perf trace -p PID --duration 10 write- und fsync-Aufrufe im Spielserver finden, die länger als 10 ms dauerten, samt zugehörigem Thread
Spricht dafür
Zu den Tick-Spitzen dauern write- und fsync-Aufrufe des Game-Threads einige Dutzend ms, im selben Moment schießt die Disk-Schreiblatenz hoch. Fällt oft mit Log-Rotation oder -Komprimierung zusammen
Spricht dagegen
Keine langsamen Systemaufrufe im Game-Thread, Tick schlägt trotzdem aus: andere Ursache wie GC, Locks oder überschrittenes Tick-Budget. Nur der eigene Log-Thread ist langsam: kein Einfluss auf das Spielgeschehen
Prüfmittel
Mit Infrastruktur-Tools prüfbar (ohne Spielcode)
Mehr dazu
Normalerweise nimmt das OS Schreibvorgänge zuerst im Arbeitsspeicher (Page Cache) an und schreibt sie später auf den Datenträger. Eine Logzeile ist daher meist sofort erledigt. Stillstand entsteht, wenn fsync sicheres Speichern verlangt, wenn aufgestaute Schreibvorgänge ein Limit überschreiten und das OS den Schreibaufruf blockiert oder wenn Logdateien rotiert oder komprimiert werden. Deshalb ist meist alles unauffällig, und Spitzen gibt es nur in Momenten, in denen der Datenträger ausgelastet ist.

Quellen

  1. fsync(2) — Linux manual page Linux man-pages
    fsync schreibt geänderte Daten bis auf den Datenträger (einschließlich Disk-Cache) und blockiert, bis das Gerät den Abschluss meldet
  2. Documentation for /proc/sys/vm/ Linux kernel
    Erreichen aufgestaute Schreibvorgänge (dirty) dirty_ratio, muss der schreibende Prozess das Zurückschreiben auf den Datenträger selbst übernehmen
  3. ionice(1) — Linux manual page util-linux
    Ein Job mit I/O-Priorität idle bekommt nur dann Zeit auf dem Datenträger, wenn kein anderes Programm ihn nutzt
  4. iostat(1) — Linux manual page sysstat
    -x: w_await (durchschnittliche Bearbeitungszeit von Schreibanfragen einschließlich Wartezeit in der Warteschlange), aqu-sz (durchschnittliche Warteschlangenlänge, früher avgqu-sz)
  5. perf-trace(1) — Linux manual page perf
    -p verfolgt die Systemaufrufe eines laufenden Prozesses, --duration zeigt nur Aufrufe, die länger als die angegebenen ms dauerten

Verwandte Ursachen

Gleiche Schicht: L11 Datenträger

Ursachen aus anderen Schichten mit demselben Symptom (Ruckeln)

Karte in der interaktiven Fassung mit Grafiken und Experimenten ansehen