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)
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
socket(7) — Linux manual pageLinux 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
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)
IP SysctlLinux kernel tcp_rmem, tcp_wmem: Wer SO_RCVBUF oder SO_SNDBUF selbst setzt, schaltet das automatische Tuning für diesen Socket ab
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
net/ipv4/proc.c (Linux v6.12)Linux kernel Von nstat angezeigte Zählernamen: RcvbufErrors und SndbufErrors der Gruppe Udp
ss(8) — Linux manual pageiproute2 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