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

Game-Lag-Whitepaper › Grundursachen von TCP-Retransmissions

Überlauf flacher Puffer durch Sende-Bursts Sender bursts overflow shallow buffers

Ursachen-ID rt-burst · Hauptzuständig Server-Entwicklung (Entwicklungsteam) · Beteiligt Server-Infrastruktur (Infrastrukturteam), Netzwerk-Infrastruktur (Infrastrukturteam)

In der interaktiven Fassung mit Grafiken und Experimenten öffnen →

Sendet der Server in jedem Tick die Updates für Tausende Spieler im selben Augenblick, laufen kleine Switch-Puffer oder kurzfristige Limits in der Cloud in weniger als 1 ms über, und ein Teil der Pakete wird verworfen.

Warum Zu Beginn jedes Ticks gehen die Pakete für alle Spieler auf einmal raus → Folge Switch-Port-Puffer, in denen der Traffic mehrerer Server zusammenläuft (einige hundert KB bis einige MB pro Port), oder Limits der Cloud-Instanz laufen kurzzeitig über (durchschnittliche Auslastung niedrig) → Auf dem Bildschirm Teleportieren oder kurzer Freeze bei mehreren Spielern gleichzeitig, Durchschnittsmetriken zeigen die Ursache nicht

Symptome
Teleportieren, Freeze, Zeitraffer
Faktoren
Paketverlust
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), Netzwerk-Infrastruktur (Infrastrukturteam)
Aufgaben Entwicklungsteam
Die Sendungen eines Ticks über den Tick verteilen (Tausende Verbindungen, die zu Tickbeginn gleichzeitig senden, lassen sich mit Pacing pro Verbindung kaum entzerren), Tickstartzeiten der Server gegeneinander versetzen, Verbindungen mit großen Datenmengen per SO_MAX_PACING_RATE auf eine Höchstrate begrenzen.
Aufgaben Infrastrukturteam
Server/OS: Senderate des ganzen Servers begrenzen (Shaper im Server-OS, Linux tc), Bursts einzelner Verbindungen per Pacing glätten (Linux-fq-Queue, BBR). Netzwerk: Switches mit großen Puffern einsetzen, Zähler für verworfene ausgehende Pakete an den Switch-Ports in kurzen Abständen prüfen (in der durchschnittlichen Auslastung unsichtbar).
Größenordnungen
Ein 10-Gbps-Port überträgt in 1 ms etwa 1,25 MB. Treffen die Ticks mehrerer Server zusammen und laufen über einen Port, ist der Puffer im Nu voll.
Im Graphen
Steigt mit Spielerzahl und Last · Verworfene ausgehende Pakete pro Switch-Port, Retransmission-Rate
Wo nachsehen
Verworfene ausgehende Pakete (ifOutDiscards) am Switch-Port des Servers und am übergeordneten Port im Abstand weniger Sekunden erfassen, in der Cloud bw_out_allowance_exceeded und pps_allowance_exceeded in ethtool -S prüfen. Retransmissions zum selben Zeitpunkt mit bcc tcpretrans sammeln und abgleichen
Spricht dafür
Auslastung im Minutenmittel niedrig, trotzdem steigen verworfene ausgehende Pakete oder allowance-Überschreitungen, und ihre Zahl wächst mit den gleichzeitigen Verbindungen und mit der Zahl der Spieler an einem Ort. Die Retransmissions häufen sich in keinem bestimmten IP-Bereich von Spielern (Provider, Region) und treten im selben Moment auf vielen Verbindungen dieses Servers auf
Spricht dagegen
Am selben Port steigen auch CRC- und Eingangsfehler: „Physische Fehler“. Steigen beim empfangenden Server die Drop-Zähler der NIC oder softnet dropped: „Verworfene Pakete auf dem empfangenden Server-Host“
Prüfmittel
Mit Infrastruktur-Tools prüfbar (ohne Spielcode)
Mehr dazu
Pacing wirkt für jede Verbindung einzeln. Senden Tausende Verbindungen zu Tickbeginn je ein, zwei Pakete, lässt sich dieser Andrang mit Pacing pro Verbindung kaum entzerren: Der Spielserver muss die Sendezeitpunkte selbst verteilen. Sendet dagegen eine einzelne Verbindung große Datenmengen, zerlegt die NIC einige Dutzend KB in Pakete und schickt sie direkt hintereinander hinaus (TSO). Solche Bursts verteilt Pacing gut.

Quellen

  1. High-Resolution Measurement of Data Center Microbursts Meta
    Über 70 % der Bursts an Rack-Switches im Rechenzentrum enden innerhalb einiger Dutzend µs, der Zusammenhang zwischen Auslastung im Minutenmittel und Drops ist schwach (IMC 2017)
  2. tc-fq(8) — Linux manual page iproute2
    Die fq-Queue führt Pacing pro Socket (Verbindung) durch, SO_MAX_PACING_RATE legt die Höchstrate pro Verbindung fest
  3. net/ipv4/tcp_bbr.c Linux kernel
    BBR legt pacing_rate anhand der geschätzten Engpass-Bandbreite fest und sendet danach
  4. IP Sysctl Linux kernel
    TCP passt die Größe der TSO-Frames an die Rate des Flows an (maximal 64 KB, tcp_min_tso_segs)
  5. Monitor network performance for ENA settings on your EC2 instance AWS
    bw_out_allowance_exceeded und pps_allowance_exceeded: Zahl der Pakete, die wegen Überschreitung des Bandbreiten- oder PPS-Limits der Instanz in die Warteschlange gestellt oder verworfen wurden
  6. RFC 2863: The Interfaces Group MIB IETF
    ifOutDiscards: Zahl ausgehender Pakete, die verworfen wurden, obwohl kein Fehler vorlag, etwa um Pufferplatz freizumachen
  7. Demonstrations of tcpretrans, the Linux eBPF/bcc version IO Visor
    Zeigt pro Retransmission eine Zeile mit Adresse und Port der Gegenseite und dem Verbindungszustand

Verwandte Ursachen

Gleiche Schicht: Grundursachen von TCP-Retransmissions

Ursachen aus anderen Schichten mit demselben Symptom (Teleportieren)

Karte in der interaktiven Fassung mit Grafiken und Experimenten ansehen