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
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
fsync(2) — Linux manual pageLinux 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
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
ionice(1) — Linux manual pageutil-linux Ein Job mit I/O-Priorität idle bekommt nur dann Zeit auf dem Datenträger, wenn kein anderes Programm ihn nutzt
iostat(1) — Linux manual pagesysstat -x: w_await (durchschnittliche Bearbeitungszeit von Schreibanfragen einschließlich Wartezeit in der Warteschlange), aqu-sz (durchschnittliche Warteschlangenlänge, früher avgqu-sz)
perf-trace(1) — Linux manual pageperf -p verfolgt die Systemaufrufe eines laufenden Prozesses, --duration zeigt nur Aufrufe, die länger als die angegebenen ms dauerten