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

Game-Lag-Whitepaper › L7 Server-OS (Kernel)

Zu kleine Socket-Puffer im Kernel Small socket buffers

Ursachen-ID so-sockbuf · Hauptzuständig Server-Infrastruktur (Infrastrukturteam) · Beteiligt Server-Entwicklung (Entwicklungsteam)

In der interaktiven Fassung mit Grafiken und Experimenten öffnen →

Sind Sende- und Empfangspuffer zu klein, werden bei Burst-Traffic per UDP empfangene Pakete verworfen, und das Senden per TCP blockiert, weil im Puffer kein Platz mehr ist.

Warum SO_SNDBUF und SO_RCVBUF auf Standardwert oder zu klein → Folge Bei einem Burst oder während der Empfangs-Thread kurz stillsteht, läuft der UDP-Empfangspuffer über, und Pakete werden verworfen. TCP wartet, weil im Sendepuffer kein Platz ist → Auf dem Bildschirm Teleportieren (UDP-Paketverlust) oder Zeitraffer (TCP wartet)

Symptome
Teleportieren, Zeitraffer
Faktoren
Paketverlust, Stillstand
Wer ist betroffen
Ganzer Server
Wann
Bei großem Andrang
Zuständigkeit
Hauptzuständig Server-Infrastruktur (Infrastrukturteam) · Beteiligt Server-Entwicklung (Entwicklungsteam)
Aufgaben Entwicklungsteam
Puffergrößen (SO_SNDBUF, SO_RCVBUF) im Code passend zum Traffic setzen, bei TCP beachten, dass eine fest gesetzte Größe das automatische Tuning von Linux abschaltet, Puffer nicht zu groß wählen, weil sich sonst veraltete Daten stauen und die Latenz steigt, Empfangs-Thread nicht blockieren lassen.
Aufgaben Infrastrukturteam
Kernel-Obergrenzen (rmem_max, wmem_max; auch im Code gesetzte Puffergrößen können sie nicht überschreiten) und Standardwert (rmem_default) anpassen, Zähler für Pufferüberläufe (RcvbufErrors) überwachen.
Größenordnungen
Der Standard-Empfangspuffer für UDP liegt unter Linux bei etwa 208 KB. Selbst ein kleines Paket belegt deutlich mehr Kernelspeicher als seine eigentliche Größe, deshalb ist der Puffer schon nach einigen Dutzend bis einigen hundert Paketen voll. Bei einem Server, der 100.000 Pakete pro Sekunde empfängt, reicht ein Stillstand des Empfangs-Threads von wenigen Millisekunden für einen Überlauf.
Im Graphen
Vereinzelte Spitzen ohne Muster · Überläufe des UDP-Empfangspuffers (UdpRcvbufErrors)
Wo nachsehen
Zuwachs von UdpRcvbufErrors in nstat -az und skmem in ss -uamn prüfen (rb: Größe des Empfangspuffers, d: Pakete, die verworfen wurden, weil sie nicht mehr in den Socket passten), bei TCP in skmem von ss -tm prüfen, ob der Sendepuffer-Speicher (w) die Größe des Sendepuffers (tb) erreicht
Spricht dafür
Bei einem Burst oder Stillstand des Empfangs-Threads steigt UdpRcvbufErrors (oder d am Socket), rb liegt nahe am Standardwert (ca. 208 KB). Bei TCP klebt w an tb, und send blockiert
Spricht dagegen
Zähler unverändert, trotzdem Paketverlust: NIC-Ebene („Zu kleiner Ringpuffer“) oder Netzwerkstrecke
Prüfmittel
Mit Infrastruktur-Tools prüfbar (ohne Spielcode)

Quellen

  1. socket(7) — Linux manual page Linux man-pages
    Standardwerte von SO_RCVBUF und SO_SNDBUF sind rmem_default und wmem_default, Obergrenzen rmem_max und wmem_max, der Kernel verdoppelt den gesetzten Wert
  2. include/net/sock.h (Linux v6.18) Linux kernel
    Standard-Socket-Puffer definiert als 256 Pakete zu 256 Byte einschließlich sk_buff-Overhead (SKB_TRUESIZE(256)×256), auch kleine Frames zählen mit sk_buff+MTU (die ca. 208 KB sind ein für x86-64 berechneter Wert)
  3. IP Sysctl Linux kernel
    tcp_rmem, tcp_wmem: Wer SO_RCVBUF oder SO_SNDBUF selbst setzt, schaltet das automatische Tuning für diesen Socket ab
  4. net/ipv4/udp.c (Linux v6.12) Linux kernel
    Übersteigt die UDP-Empfangswarteschlange die Größe des Socket-Puffers, werden Pakete sofort verworfen, und RcvbufErrors steigt
  5. net/ipv4/proc.c (Linux v6.12) Linux kernel
    Von nstat angezeigte Zählernamen: RcvbufErrors und SndbufErrors der Gruppe Udp
  6. ss(8) — Linux manual page iproute2
    skmem bei -m: rb Größe des Empfangspuffers, tb Größe des Sendepuffers, w Sendepuffer-Speicher, d Pakete, die vor dem Einreihen in den Socket verworfen wurden

Verwandte Ursachen

Gleiche Schicht: L7 Server-OS (Kernel)

Ursachen aus anderen Schichten mit demselben Symptom (Teleportieren)

Karte in der interaktiven Fassung mit Grafiken und Experimenten ansehen