Laufen weit mehr Threads als Kerne, verbraucht das OS CPU-Zeit allein damit, sie abwechselnd auszuführen.
Warum Hunderte bis Tausende Threads, etwa ein eigener Thread pro Verbindung → Folge Mehr Aufwand für Kontextwechsel (Wechsel des laufenden Threads) und mehr Cache-Misses → Auf dem Bildschirm CPU ausgelastet, aber geringer Durchsatz und unregelmäßige Ticks: Ruckeln und Zeitlupe
Thread-Zahl an die Kernzahl anpassen, asynchrone I/O (epoll, IOCP).
Aufgaben Infrastrukturteam
Zahl der Kontextwechsel und der auf CPU-Zeit wartenden Threads überwachen (cs und r in vmstat).
Größenordnungen
Ein Kontextwechsel kostet einige µs, mit den anschließenden Cache-Misses noch mehr.
Im Graphen
Steigt mit Spielerzahl und Last · Kontextwechsel pro Sekunde, auf CPU-Zeit wartende Threads
Wo nachsehen
In vmstat 1 cs (Kontextwechsel pro Sekunde) und r (laufende oder auf CPU-Zeit wartende Prozesse) mit der Kernzahl vergleichen, mit pidstat -w -t freiwillige (cswch/s) und unfreiwillige (nvcswch/s) Kontextwechsel pro Thread des Spielservers prüfen
Spricht dafür
Mit steigender Spielerzahl wächst r weit über die Kernzahl, cs schießt mit hoch, und Hunderte Threads haben viele unfreiwillige Kontextwechsel
Spricht dagegen
r bleibt höchstens bei der Kernzahl: diese Ursache scheidet aus. Nur viele freiwillige Wechsel: Threads warten auf Locks oder I/O („Lock-Contention“, „Blockierende I/O-Architektur“)
Prüfmittel
Mit Infrastruktur-Tools prüfbar (ohne Spielcode)
Quellen
Quantifying The Cost of Context Switch (ExpCS 2007)ACM Direkte Kosten eines Kontextwechsels ca. 3,8 µs, indirekte Kosten einschließlich Cache-Effekten von einigen µs bis über 1.000 µs (in der Messumgebung)
vmstat(8) — Linux manual pageprocps-ng Spalten cs (Kontextwechsel pro Sekunde) und r (Zahl der laufenden oder auf Ausführung wartenden Prozesse)
I/O Completion PortsMicrosoft Viele asynchrone I/O-Vorgänge mit einem vorab erzeugten Thread-Pool und IOCP abwickeln, Zahl gleichzeitig laufender Threads an die Parallelität der CPU anpassen
pidstat(1) — Linux manual pagesysstat cswch/s bei -w: freiwillige Kontextwechsel, bei denen ein Thread beim Warten auf Ressourcen selbst anhält, nvcswch/s: unfreiwillige Kontextwechsel, erzwungen nach Ablauf der Zeitscheibe, -t: pro Thread