System Buffer Tuning - TCP and Network Performance Optimization

# Check NIC ring buffer sizes ethtool -g eth0 # Monitor socket buffer usage ss -tm # Check for TCP zero window events tcpdump -i any 'tcp[tcpflags] & tcp-push != 0' -vv # Check network statistics for buffer issues netstat -s | grep -i "buffer\|queue\|drop"

Windows-Diagnose

# Check TCP parameters
netsh interface tcp show global

# View network adapter buffer settings
Get-NetAdapterAdvancedProperty -Name "Ethernet" | Where-Object {$_.DisplayName -like "*buffer*"}

# Monitor TCP statistics
netstat -s -p tcp

# Check receive window auto-tuning
netsh interface tcp show global | findstr "Receive Window"

macOS-Diagnose

# Check current buffer settings
sysctl kern.ipc.maxsockbuf
sysctl net.inet.tcp.sendspace
sysctl net.inet.tcp.recvspace

# View network statistics
netstat -s -p tcp

# Monitor socket buffers
netstat -an -p tcp

Linux-Pufferoptimierung

Ältere Linux-Einstellungen (ca. 2009)

Parameter Legacy Value (2009) Beschreibung
net.core.rmem_default 124928 (122 KB) Standardgröße des Empfangs-Socket-Puffers
net.core.rmem_max 131071 (128 KB) Maximale Größe des Empfangs-Socket-Puffers
net.core.wmem_default 124928 (122 KB) Standardgröße des Sende-Socket-Puffers
net.core.wmem_max 131071 (128 KB) Maximale Größe des Sende-Socket-Puffers
net.ipv4.tcp_rmem 4096 87380 174760 TCP-Empfangspuffer: Min., Standard, Max. (in Bytes)
net.ipv4.tcp_wmem 4096 16384 131072 TCP-Sendepuffer: Min., Standard, Max. (in Bytes)
net.ipv4.tcp_mem 196608 262144 393216 TCP-Speicherseiten: niedrig, Druck, hoch
net.core.netdev_max_backlog 1000 Maximale Pakete in der Eingabewarteschlange
net.core.optmem_max 10240 (10 KB) Maximale zusätzliche Puffergröße pro Socket

Aktuelle Linux-Einstellungen (2025–2026)

Parameter Aktueller empfohlener Wert Beschreibung
net.core.rmem_default 16777216 (16 MB) Standardgröße des Empfangs-Socket-Puffers
net.core.rmem_max 134217728 (128 MB) Maximale Größe des Empfangs-Socket-Puffers
net.core.wmem_default 16777216 (16 MB) Standardgröße des Sende-Socket-Puffers
net.core.wmem_max 134217728 (128 MB) Maximale Größe des Sende-Socket-Puffers
net.ipv4.tcp_rmem 4096 87380 134217728 TCP-Empfangspuffer: Min., Standard, Max. (max. 128 MB)
net.ipv4.tcp_wmem 4096 65536 134217728 TCP-Sendepuffer: Min., Standard, Max. (max. 128 MB)
net.ipv4.tcp_mem 8388608 12582912 16777216 TCP-Speicherseiten: niedrig, Druck, hoch (64-GB-System)
net.core.netdev_max_backlog 250000 Maximale Pakete in der Eingabewarteschlange (10GbE+)
net.core.optmem_max 65536 (64 KB) Maximale zusätzliche Puffergröße pro Socket
net.ipv4.tcp_congestion_control bbr Verwenden Sie die BBR-Überlastungskontrolle (Googles Algorithmus).
net.ipv4.tcp_window_scaling 1 TCP-Fensterskalierung aktivieren (RFC 1323)
net.ipv4.tcp_timestamps 1 Aktivieren Sie TCP-Zeitstempel für eine bessere RTT-Schätzung
net.ipv4.tcp_sack 1 Aktivieren Sie die selektive Bestätigung
net.ipv4.tcp_no_metrics_save 1 Deaktivieren Sie das Caching von TCP-Metriken

Linux-Konfigurationsanwendung

Fügen Sie diese Einstellungen hinzu/etc/sysctl.confoder eine neue Datei erstellen/etc/sysctl.d/99-network-tuning.conf:

# Network Buffer Tuning for High-Performance Applications
# Optimized for 10GbE+ networks with RTT up to 300ms

# Core socket buffer settings
net.core.rmem_default = 16777216
net.core.rmem_max = 134217728
net.core.wmem_default = 16777216
net.core.wmem_max = 134217728

# TCP buffer settings
net.ipv4.tcp_rmem = 4096 87380 134217728
net.ipv4.tcp_wmem = 4096 65536 134217728
net.ipv4.tcp_mem = 8388608 12582912 16777216

# Device buffer settings
net.core.netdev_max_backlog = 250000
net.core.netdev_budget = 50000
net.core.netdev_budget_usecs = 5000
net.core.optmem_max = 65536

# TCP optimizations
net.ipv4.tcp_congestion_control = bbr
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_sack = 1
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.tcp_moderate_rcvbuf = 1

# Apply with: sysctl -p /etc/sysctl.d/99-network-tuning.conf

NIC-Ringpuffer-Tuning

# Check current ring buffer sizes
ethtool -g eth0

# Set maximum ring buffer sizes (adjust based on NIC capabilities)
ethtool -G eth0 rx 4096 tx 4096

# Make persistent by adding to /etc/network/interfaces or systemd service
Kritische Warnung – Speicherverbrauch:Die tcp_mem-Werte befinden sich in Speicherseiten (normalerweise 4 KB). Große Puffergrößen können zu einer starken Speicherbelastung führen:
  • Speicher pro Verbindung:Jede Verbindung kann bis zu rmem_max + wmem_max (256 MB mit 128 MB Puffern) verwenden.
  • Gesamtauswirkungen auf das System:1.000 Verbindungen × 256 MB = 256 GB potenzielle Nutzung
  • Sichere Schätzung:Die maximalen gleichzeitigen Verbindungen × 256 MB sollten 50 % des System-RAM nicht überschreiten
  • Beispiel:Ein 64-GB-Server sollte die maximale Anzahl an Verbindungen auf etwa 125 gleichzeitige Verbindungen mit hohem Durchsatz und 128-MB-Puffer beschränken
  • Empfehlung für Server mit <16GB RAM:Reduzieren Sie die Puffer auf maximal 16–32 MB und passen Sie tcp_mem proportional an

Windows-Pufferoptimierung

Ältere Windows-Einstellungen (ca. 2009 – Windows Vista/7/Server 2008)

Parameter Legacy Value (2009) Standort
TcpWindowSize 65535 (64 KB) Registrierung: HKLM\System\CurrentControlSet\Services\Tcpip\Parameters
Tcp1323Opts 0 (deaktiviert) Die Fensterskalierung ist standardmäßig deaktiviert
DefaultReceiveWindow 8192 (8 KB) Standard-Empfangsfenster
DefaultSendWindow 8192 (8 KB) Standard-Sendefenster
GlobalMaxTcpWindowSize 65535 (64 KB) Maximale TCP-Fenstergröße
TcpNumConnections 16777214 Maximale TCP-Verbindungen

Aktuelle Windows-Einstellungen (Windows 10/11/Server 2019–2025)

Modernes Windows verwendet dasFenster-Autotuning empfangenFunktion, die Empfangspuffer basierend auf den Netzwerkbedingungen dynamisch anpasst.

Besonderheit Aktuelle empfohlene Einstellung Beschreibung
Auto-Tuning-Ebene normal (oder sehr experimentell für 10GbE+) Dynamische Anpassung des Empfangsfensters
Empfangsseitige Skalierung (RSS) ermöglicht Verteilen Sie die Netzwerkverarbeitung auf CPUs
Schornsteinentladung automatisch (oder auf modernen Netzwerkkarten deaktiviert) TCP-Offload auf NIC-Hardware
NetDMA deaktiviert Direkter Speicherzugriff (veraltet)
Globale TCP-Parameter Siehe Befehle unten Systemweite TCP-Einstellungen
Überlastungsanbieter CUBIC (oder NewReno-Fallback) Algorithmus zur TCP-Überlastungskontrolle

Windows-Konfigurationsbefehle

# Check current auto-tuning level
netsh interface tcp show global

# Enable auto-tuning (normal mode - default for most scenarios)
netsh interface tcp set global autotuninglevel=normal

# For high-bandwidth, high-latency networks (10GbE+, data center environments)
netsh interface tcp set global autotuninglevel=experimental

# For conservative tuning (if experimental causes issues)
netsh interface tcp set global autotuninglevel=restricted

# For very conservative tuning (not recommended for high-performance networks)
netsh interface tcp set global autotuninglevel=highlyrestricted

# Enable CUBIC congestion provider (Windows Server 2022/Windows 11+ only)
netsh interface tcp set supplemental template=Internet congestionprovider=cubic

# Note: Windows 10 and Server 2019 use Compound TCP or NewReno by default
# CUBIC is not available on these older versions

# Enable Receive-Side Scaling (RSS)
netsh interface tcp set global rss=enabled

# Set chimney offload (automatic is recommended)
netsh interface tcp set global chimney=automatic

# Disable NetDMA (recommended for modern systems)
netsh interface tcp set global netdma=disabled

# Enable Direct Cache Access (if supported)
netsh interface tcp set global dca=enabled

# Enable ECN (Explicit Congestion Notification)
netsh interface tcp set global ecncapability=enabled

# Set initial congestion window to 10 (RFC 6928)
netsh interface tcp set global initialRto=3000

Erweiterte NIC-Puffereinstellungen (über Geräte-Manager oder PowerShell)

# View current adapter settings
Get-NetAdapterAdvancedProperty -Name "Ethernet"

# Increase receive buffers (adjust based on NIC)
Set-NetAdapterAdvancedProperty -Name "Ethernet" -DisplayName "Receive Buffers" -DisplayValue 2048

# Increase transmit buffers
Set-NetAdapterAdvancedProperty -Name "Ethernet" -DisplayName "Transmit Buffers" -DisplayValue 2048

# Enable Jumbo Frames (if network supports it)
Set-NetAdapterAdvancedProperty -Name "Ethernet" -DisplayName "Jumbo Packet" -DisplayValue 9014

# Enable Large Send Offload (LSO)
Set-NetAdapterAdvancedProperty -Name "Ethernet" -DisplayName "Large Send Offload V2 (IPv4)" -DisplayValue Enabled
Set-NetAdapterAdvancedProperty -Name "Ethernet" -DisplayName "Large Send Offload V2 (IPv6)" -DisplayValue Enabled

Registrierungsoptimierungen (Erweitert – mit Vorsicht verwenden)

# These settings are typically NOT needed on Windows 10/11 due to auto-tuning
# Only modify if auto-tuning is disabled or problematic

# Registry path: HKLM\System\CurrentControlSet\Services\Tcpip\Parameters

# Maximum TCP window size (if auto-tuning disabled)
# TcpWindowSize = 16777216 (16MB) - REG_DWORD

# Enable window scaling (enabled by default on modern Windows)
# Tcp1323Opts = 3 - REG_DWORD

# Number of TCP Timed Wait Delay
# TcpTimedWaitDelay = 30 - REG_DWORD (default 240)
Warnung:Vermeiden Sie unter modernem Windows (10/11/Server 2019+) manuelle Registrierungsänderungen, es sei denn, die automatische Optimierung verursacht Probleme. Die Auto-Tuning-Algorithmen sind im Allgemeinen den statischen Einstellungen überlegen.

macOS-Pufferoptimierung

Ältere macOS-Einstellungen (ca. 2009 – Mac OS X 10.5/10.6)

Parameter Legacy Value (2009) Beschreibung
kern.ipc.maxsockbuf 262144 (256 KB) Maximale Socket-Puffergröße
net.inet.tcp.sendspace 32768 (32 KB) Standard-TCP-Sendepuffer
net.inet.tcp.recvspace 32768 (32 KB) Standard-TCP-Empfangspuffer
net.inet.tcp.autorcvbufmax 131072 (128 KB) Maximaler automatisch abgestimmter Empfangspuffer
net.inet.tcp.autosndbufmax 131072 (128 KB) Maximaler automatisch abgestimmter Sendepuffer
net.inet.tcp.rfc1323 0 (deaktiviert) TCP-Fensterskalierung

Aktuelle macOS-Einstellungen (macOS 12–15 Monterey bis Sequoia)

Parameter Aktueller empfohlener Wert Beschreibung
kern.ipc.maxsockbuf 8388608 (8 MB) Maximale Socket-Puffergröße
net.inet.tcp.sendspace 131072 (128 KB) Standard-TCP-Sendepuffer
net.inet.tcp.recvspace 131072 (128 KB) Standard-TCP-Empfangspuffer
net.inet.tcp.autorcvbufmax 16777216 (16 MB) Maximaler automatisch abgestimmter Empfangspuffer
net.inet.tcp.autosndbufmax 16777216 (16 MB) Maximaler automatisch abgestimmter Sendepuffer
net.inet.tcp.rfc1323 1 (aktiviert) Aktivieren Sie die TCP-Fensterskalierung
net.inet.tcp.sack 1 (aktiviert) Aktivieren Sie die selektive Bestätigung
net.inet.tcp.mssdflt 1440 Standardmäßige maximale TCP-Segmentgröße
net.inet.tcp.delayed_ack 3 Verzögertes ACK-Verhalten

macOS-Konfigurationsanwendung

# Check current settings
sysctl kern.ipc.maxsockbuf
sysctl net.inet.tcp.sendspace
sysctl net.inet.tcp.recvspace
sysctl net.inet.tcp.autorcvbufmax
sysctl net.inet.tcp.autosndbufmax

# Apply settings temporarily (until reboot)
sudo sysctl -w kern.ipc.maxsockbuf=8388608
sudo sysctl -w net.inet.tcp.sendspace=131072
sudo sysctl -w net.inet.tcp.recvspace=131072
sudo sysctl -w net.inet.tcp.autorcvbufmax=16777216
sudo sysctl -w net.inet.tcp.autosndbufmax=16777216
sudo sysctl -w net.inet.tcp.rfc1323=1
sudo sysctl -w net.inet.tcp.sack=1

# Make settings persistent (create /etc/sysctl.conf)
sudo tee /etc/sysctl.conf <<EOF
kern.ipc.maxsockbuf=8388608
net.inet.tcp.sendspace=131072
net.inet.tcp.recvspace=131072
net.inet.tcp.autorcvbufmax=16777216
net.inet.tcp.autosndbufmax=16777216
net.inet.tcp.rfc1323=1
net.inet.tcp.sack=1
net.inet.tcp.mssdflt=1440
net.inet.tcp.delayed_ack=3
EOF

# Note: On recent macOS versions, /etc/sysctl.conf may not be read automatically
# Use a LaunchDaemon to apply settings at boot

Erstellen eines LaunchDaemon für persistente Einstellungen

# Create /Library/LaunchDaemons/com.local.sysctl.plist
sudo tee /Library/LaunchDaemons/com.local.sysctl.plist <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.local.sysctl</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/sbin/sysctl</string>
        <string>-w</string>
        <string>kern.ipc.maxsockbuf=8388608</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>
EOF

sudo chmod 644 /Library/LaunchDaemons/com.local.sysctl.plist
sudo launchctl load /Library/LaunchDaemons/com.local.sysctl.plist
Warnung:Für macOS Ventura (13) und höher gelten Einschränkungen für den Systemintegritätsschutz (SIP). Einige Kernel-Parameter können möglicherweise nicht einmal mit sudo geändert werden. Testen Sie die Einstellungen in Ihrer spezifischen Umgebung.

Leistungstests und Validierung

Tools zum Testen der Pufferleistung

iperf3 – Netzwerkleistungstests

# Server side
iperf3 -s

# Client side - test TCP throughput
iperf3 -c server_ip -t 60 -i 5 -w 16M

# Test with multiple parallel streams
iperf3 -c server_ip -P 10 -t 60

# Test UDP performance
iperf3 -c server_ip -u -b 1000M -t 60

tcpdump – TCP-Fenstergrößen erfassen

# Capture and display TCP window sizes
tcpdump -i any -n 'tcp' -vv | grep -i window

# Save capture for Wireshark analysis
tcpdump -i any -w /tmp/capture.pcap 'tcp port 443'

Wireshark-Analyse

Suchen Sie nach diesen Indikatoren für Pufferprobleme:

  • TCP Zero Window-Nachrichten
  • TCP-Fensteraktualisierungspakete
  • Benachrichtigungen über vollständige TCP-Fenster
  • Hohe Neuübertragungsraten bei niedrigem RTT

Systemüberwachung

# Linux - Monitor network buffer statistics
watch -n 1 'cat /proc/net/sockstat'
watch -n 1 'ss -tm | grep -i mem'

# Check for drops
netstat -s | grep -i drop

# Windows - Monitor TCP statistics
netstat -e 1

# macOS - Monitor network statistics
netstat -s -p tcp

Berechnung des Bandbreitenverzögerungsprodukts (BDP).

Um optimale Puffergrößen für Ihr Netzwerk zu ermitteln, berechnen Sie das Bandbreiten-Verzögerungsprodukt:

BDP = Bandwidth (bits/sec) × RTT (seconds)

Example for 10 Gigabit Ethernet with 50ms RTT:
BDP = 10,000,000,000 × 0.050 = 500,000,000 bits = 62.5 MB

Buffer Size = BDP × 2 (for bidirectional traffic and headroom)
Buffer Size = 62.5 MB × 2 = 125 MB

This is why modern settings recommend 128MB maximum buffers.

Workload-spezifische Empfehlungen

Arbeitslasttyp Empfohlene Puffergröße Schlüsselparameter
Webserver (Geringe Latenz) 4-16 MB Weniger Puffer, mehr Verbindungen, schnelle Reaktion
Datenbankserver 16-32 MB Moderate Puffer, konsistenter Durchsatz
Dateiübertragung/Sicherung 64-128 MB Maximale Puffer, hohe Durchsatzpriorität
Video-Streaming 32-64 MB Große Puffer, konstante Lieferrate
HPC / Rechenzentrum 128-256 MB Maximale Puffer, spezielle Überlastungskontrolle
Kabellos / Mobil 2-8 MB Konservative Puffer, Handhabung variabler Latenz

Häufige Fehler und Fallstricke

Zu vermeidende Fehler

  • Überpufferung:Zu große Puffer können zu einem Bufferbloat führen und die Latenz erhöhen
  • Speicherbeschränkungen ignorieren:Große Puffer vervielfachen sich mit der Anzahl der Verbindungen; Ein Server mit 10.000 Verbindungen und 128 MB Puffern benötigt 1,25 TB RAM
  • Autotuning ohne Angabe von Gründen deaktivieren:Die automatische Optimierung moderner Betriebssysteme ist normalerweise besser als statische Einstellungen
  • Nach Änderungen nicht getestet:Validieren Sie Leistungsverbesserungen immer anhand realer Arbeitslasten
  • NIC-Puffer vergessen:Die Erschöpfung des Ringpuffers kann unabhängig von den Socket-Puffer auftreten
  • Inkonsistente Einstellungen:Client und Server sollten kompatible Pufferkonfigurationen haben
  • Staukontrolle ignorieren:BBR und CUBIC sind deutlich besser als ältere Algorithmen

Fehlerbehebungs-Workflow

  1. Basislinie festlegen:Messen Sie die aktuelle Leistung mit iperf3 oder ähnlichen Tools
  2. Pakete erfassen:Verwenden Sie tcpdump/Wireshark, um das TCP-Fensterverhalten zu identifizieren
  3. Systemstatistiken prüfen:Suchen Sie nach Ausfällen, Puffererschöpfung und erneuten Übertragungen
  4. BDP berechnen:Bestimmen Sie theoretisch optimale Puffergrößen
  5. Inkrementelle Änderungen anwenden:Ändern Sie nicht alles auf einmal
  6. Testen und validieren:Messen Sie die tatsächliche Leistungsverbesserung
  7. Überwachen Sie im Laufe der Zeit:Stellen Sie sicher, dass die Einstellungen bei unterschiedlichen Belastungen optimal bleiben

Referenzen und weiterführende Literatur

  • RFC 1323 – TCP-Erweiterungen für hohe Leistung (Fensterskalierung)
  • RFC 2018 – Optionen für selektive TCP-Bestätigung
  • RFC 6928 – Erhöhung des anfänglichen TCP-Fensters
  • RFC 8312 – CUBIC-Algorithmus zur Überlastungskontrolle
  • BBR-Überlastungskontrolle (Google) – https://research.google/pubs/pub45646/
  • Linux-Kernel-Dokumentation – networking/ip-sysctl.txt
  • Leitfaden zur Windows TCP/IP-Leistungsoptimierung (Microsoft)
  • Leitfaden zur ESnet-Netzwerkoptimierung – https://fasterdata.es.net/

Abschluss

Die Erschöpfung des Puffers ist eine häufige Ursache für Leistungsprobleme, die scheinbar mit dem Netzwerk zusammenhängen. Durch das Verständnis der Entwicklung der Puffergröße von den 128-KB-Grenzwerten im Jahr 2009 bis zu den heutigen 128-MB-Kapazitäten können Netzwerktechniker diese Probleme schnell erkennen und lösen.

Wichtige Erkenntnisse:

  • Moderne Systeme benötigen deutlich größere Puffer als ältere (2009) Konfigurationen
  • Berechnen Sie den BDP immer für Ihre spezifischen Netzwerkbedingungen
  • Verwenden Sie die Funktionen zur automatischen Optimierung des Betriebssystems, sofern verfügbar (Windows, modernes Linux).
  • Überwachen und testen Sie, um Änderungen zu validieren
  • Berücksichtigen Sie bei der Optimierung arbeitslastspezifische Anforderungen

Denken Sie daran: Ein „Netzwerkproblem“, das durch die Paketanalyse aufgedeckt wird und TCP-Nullfenster anzeigt, ist eigentlich ein Ressourcenproblem des Hostsystems. Mit der richtigen Pufferabstimmung können Sie diese Fehldiagnosen beseitigen und eine optimale Leistung erzielen.


Letzte Aktualisierung: 2. Februar 2026

Autor: Baud9600 Technisches Team