Laufen Quests, KI und Skills in einer Skriptsprache wie Lua, steht selbst auf einem C++-Server die Zone still, solange die GC der Skript-Engine läuft.
Warum Skript-Engine jeder Zone erzeugt beim Ausführen von Quests, KI und Events massenhaft temporäre Objekte → Folge Sammelt die GC der Skript-Engine viel auf einmal, bleibt der Tick dieser Zone stehen → Auf dem Bildschirm Kurzes Stocken in festen Abständen, nur in bestimmten Zonen oder während bestimmter Events
Inkrementelle oder generationelle GC einstellen, GC in jedem Tick ein Stück weiterlaufen lassen, temporäre Objekte in Skripten reduzieren.
Größenordnungen
Wächst der Skript-Heap auf mehrere hundert MB, kann eine Sammlung in einem Durchgang (bei abgeschalteter inkrementeller Sammlung oder als vollständige Sammlung im generationellen Modus) einige Dutzend bis mehrere hundert ms dauern.
Im Graphen
Spitzen in festen Abständen · Tick-Zeit pro Zone, Speicher der Skript-Engine
Wo nachsehen
Tick-Zeit pro Zone und Speicherverbrauch der Skript-Engine dieser Zone (in Lua collectgarbage("count")) in jedem Tick aufzeichnen und in einem Graphen übereinanderlegen
Spricht dafür
Momente, in denen der Skript-Speicher abrupt fällt (Sammlung in einem Durchgang), fallen mit Tick-Spitzen dieser Zone zusammen, andere Zonen sind unauffällig
Spricht dagegen
Spitzen ohne Änderung im Skript-Speicher: Last oder Locks in dieser Zone. Alle Zonen des Servers schlagen gleichzeitig aus: GC des Servers (mem-gc) oder Swap (mem-swap)
Prüfmittel
Logs oder Metriken aus Spielserver bzw. Client nötig
Quellen
Lua 5.4 Reference ManualLua.org Der inkrementelle Modus teilt die Sammlung in kleine Schritte zwischen der Programmausführung auf (große Schritte bedeuten Stop-the-World), eine Major-Sammlung im generationellen Modus ist ein Stop-the-World-Durchlauf über alle Objekte, collectgarbage("count") liefert den gesamten von Lua belegten Speicher (KB)