System Buffer Tuning - TCP and Network Performance Optimization
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
- 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)
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
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
- Basislinie festlegen:Messen Sie die aktuelle Leistung mit iperf3 oder ähnlichen Tools
- Pakete erfassen:Verwenden Sie tcpdump/Wireshark, um das TCP-Fensterverhalten zu identifizieren
- Systemstatistiken prüfen:Suchen Sie nach Ausfällen, Puffererschöpfung und erneuten Übertragungen
- BDP berechnen:Bestimmen Sie theoretisch optimale Puffergrößen
- Inkrementelle Änderungen anwenden:Ändern Sie nicht alles auf einmal
- Testen und validieren:Messen Sie die tatsächliche Leistungsverbesserung
- Ü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