System Buffer Tuning - TCP and Network Performance Optimization
Windows-diagnostiek
# 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-diagnostiek
# 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-bufferafstemming
Legacy Linux-instellingen (circa 2009)
| Parameter | Legacy-waarde (2009) | Beschrijving |
|---|---|---|
| net.core.rmem_default | 124928 (122KB) | Standaard buffergrootte voor ontvangstsocket |
| net.core.rmem_max | 131071 (128KB) | Maximale buffergrootte voor ontvangstsocket |
| net.core.wmem_default | 124928 (122KB) | Standaard buffergrootte voor verzendsocket |
| net.core.wmem_max | 131071 (128KB) | Maximale buffergrootte voor verzendsocket |
| net.ipv4.tcp_rmem | 4096 87380 174760 | TCP-ontvangstbuffer: min, standaard, max (in bytes) |
| net.ipv4.tcp_wmem | 4096 16384 131072 | TCP-verzendbuffer: min, standaard, max (in bytes) |
| net.ipv4.tcp_mem | 196608 262144 393216 | TCP-geheugenpagina's: laag, druk, hoog |
| net.core.netdev_max_backlog | 1000 | Maximaal aantal pakketten in invoerwachtrij |
| net.core.optmem_max | 10240 (10KB) | Maximale aanvullende buffergrootte per socket |
Huidige Linux-instellingen (2025-2026)
| Parameter | Huidige aanbevolen waarde | Beschrijving |
|---|---|---|
| net.core.rmem_default | 16777216 (16MB) | Standaard buffergrootte voor ontvangstsocket |
| net.core.rmem_max | 134217728 (128MB) | Maximale buffergrootte voor ontvangstsocket |
| net.core.wmem_default | 16777216 (16MB) | Standaard buffergrootte voor verzendsocket |
| net.core.wmem_max | 134217728 (128MB) | Maximale buffergrootte voor verzendsocket |
| net.ipv4.tcp_rmem | 4096 87380 134217728 | TCP-ontvangstbuffer: min, standaard, max (max. 128 MB) |
| net.ipv4.tcp_wmem | 4096 65536 134217728 | TCP-verzendbuffer: min, standaard, max (max. 128 MB) |
| net.ipv4.tcp_mem | 8388608 12582912 16777216 | TCP-geheugenpagina's: laag, druk, hoog (64GB-systeem) |
| net.core.netdev_max_backlog | 250000 | Maximaal aantal pakketten in invoerwachtrij (10GbE+) |
| net.core.optmem_max | 65536 (64KB) | Maximale aanvullende buffergrootte per socket |
| net.ipv4.tcp_congestion_control | bbr | Gebruik BBR-congestiecontrole (het algoritme van Google) |
| net.ipv4.tcp_window_scaling | 1 | Schakel TCP-vensterschaling in (RFC 1323) |
| net.ipv4.tcp_timestamps | 1 | Schakel TCP-tijdstempels in voor een betere RTT-schatting |
| net.ipv4.tcp_sack | 1 | Schakel selectieve bevestiging in |
| net.ipv4.tcp_no_metrics_save | 1 | Schakel het cachen van TCP-statistieken uit |
Linux-configuratietoepassing
Voeg deze instellingen toe aan/etc/sysctl.confof maak een nieuw bestand/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-ringbufferafstemming
# 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
- Geheugen per verbinding:Elke verbinding kan maximaal rmem_max + wmem_max gebruiken (256 MB met 128 MB buffers)
- Totale systeemimpact:1.000 verbindingen × 256 MB = 256 GB potentieel gebruik
- Veilige schatting:Het maximale aantal gelijktijdige verbindingen × 256 MB mag niet groter zijn dan 50% van het systeem-RAM
- Voorbeeld:Een server van 64 GB moet het maximale aantal verbindingen beperken tot ~125 gelijktijdige verbindingen met hoge doorvoer met buffers van 128 MB
- Aanbeveling voor servers met <16 GB RAM:Verlaag de buffers tot maximaal 16-32 MB en pas tcp_mem proportioneel aan
Windows-bufferafstemming
Verouderde Windows-instellingen (circa 2009 - Windows Vista/7/Server 2008)
| Parameter | Legacy-waarde (2009) | Locatie |
|---|---|---|
| TcpWindowSize | 65535 (64KB) | Register: HKLM\System\CurrentControlSet\Services\Tcpip\Parameters |
| Tcp1323Opties | 0 (uitgeschakeld) | Vensterschaling is standaard uitgeschakeld |
| StandaardReceiveWindow | 8192 (8KB) | Standaard ontvangstvenster |
| StandaardVerzendvenster | 8192 (8KB) | Standaard verzendvenster |
| GlobalMaxTcpWindowSize | 65535 (64KB) | Maximale TCP-venstergrootte |
| TcpNumVerbindingen | 16777214 | Maximale TCP-verbindingen |
Huidige Windows-instellingen (Windows 10/11/Server 2019-2025)
Moderne Windows maakt gebruik van deOntvang automatisch afstemmen van venstersfunctie, die ontvangstbuffers dynamisch aanpast op basis van netwerkomstandigheden.
| Functie | Huidige aanbevolen instelling | Beschrijving |
|---|---|---|
| Niveau voor automatisch afstemmen | normaal (of zeer experimenteel voor 10GbE+) | Dynamische aanpassing van het ontvangstvenster |
| Schalen aan ontvangstzijde (RSS) | ingeschakeld | Verdeel netwerkverwerking over CPU's |
| Schoorsteen lossen | automatisch (of uitgeschakeld op moderne NIC's) | TCP-offload naar NIC-hardware |
| NetDMA | gehandicapt | Directe geheugentoegang (verouderd) |
| Globale TCP-parameters | Zie onderstaande opdrachten | Systeembrede TCP-instellingen |
| Congestieaanbieder | CUBIC (of NewReno fallback) | Algoritme voor TCP-congestiecontrole |
Windows-configuratieopdrachten
# 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
Geavanceerde NIC-bufferinstellingen (via Apparaatbeheer of 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
Registeraanpassingen (geavanceerd - gebruik met voorzichtigheid)
# 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-bufferafstemming
Oudere macOS-instellingen (circa 2009 - Mac OS X 10.5/10.6)
| Parameter | Legacy-waarde (2009) | Beschrijving |
|---|---|---|
| kern.ipc.maxsockbuf | 262144 (256KB) | Maximale socketbuffergrootte |
| net.inet.tcp.sendspace | 32768 (32KB) | Standaard TCP-verzendbuffer |
| net.inet.tcp.recvspace | 32768 (32KB) | Standaard TCP-ontvangstbuffer |
| net.inet.tcp.autorcvbufmax | 131072 (128KB) | Maximale automatisch afgestemde ontvangstbuffer |
| net.inet.tcp.autosndbufmax | 131072 (128KB) | Maximale automatisch afgestemde verzendbuffer |
| net.inet.tcp.rfc1323 | 0 (uitgeschakeld) | Schalen van TCP-vensters |
Huidige macOS-instellingen (macOS 12-15 Monterey tot Sequoia)
| Parameter | Huidige aanbevolen waarde | Beschrijving |
|---|---|---|
| kern.ipc.maxsockbuf | 8388608 (8MB) | Maximale socketbuffergrootte |
| net.inet.tcp.sendspace | 131072 (128KB) | Standaard TCP-verzendbuffer |
| net.inet.tcp.recvspace | 131072 (128KB) | Standaard TCP-ontvangstbuffer |
| net.inet.tcp.autorcvbufmax | 16777216 (16MB) | Maximale automatisch afgestemde ontvangstbuffer |
| net.inet.tcp.autosndbufmax | 16777216 (16MB) | Maximale automatisch afgestemde verzendbuffer |
| net.inet.tcp.rfc1323 | 1 (ingeschakeld) | Schakel TCP-vensterschaling in |
| net.inet.tcp.sack | 1 (ingeschakeld) | Schakel selectieve bevestiging in |
| net.inet.tcp.mssdflt | 1440 | Standaard TCP-maximale segmentgrootte |
| net.inet.tcp.delayed_ack | 3 | Vertraagd ACK-gedrag |
macOS-configuratietoepassing
# 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
Een LaunchDaemon maken voor persistente instellingen
# 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
Prestatietesten en validatie
Hulpmiddelen voor het testen van bufferprestaties
iperf3 - Testen van netwerkprestaties
# 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 - Leg TCP-venstergroottes vast
# 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
Zoek naar deze indicatoren voor bufferproblemen:
- TCP Zero Window-berichten
- TCP Window Update-pakketten
- TCP-venster Volledige meldingen
- Hoge hertransmissiesnelheden met lage RTT
Systeembewaking
# 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
Berekening van het bandbreedte-vertragingsproduct (BDP).
Om de optimale buffergroottes voor uw netwerk te bepalen, berekent u het Bandwidth-Delay Product:
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.
Werklastspecifieke aanbevelingen
| Type werklast | Aanbevolen buffergrootte | Belangrijkste parameters |
|---|---|---|
| Webserver (lage latentie) | 4-16MB | Lagere buffers, meer verbindingen, snelle respons |
| Databaseserver | 16-32MB | Matige buffers, consistente doorvoer |
| Bestandsoverdracht / back-up | 64-128MB | Maximale buffers, hoge doorvoerprioriteit |
| Videostreaming | 32-64 MB | Grote buffers, consistente leveringssnelheid |
| HPC / Datacenter | 128-256MB | Maximale buffers, gespecialiseerde congestiebestrijding |
| Draadloos / Mobiel | 2-8MB | Conservatieve buffers, verwerking van variabele latentie |
Veel voorkomende fouten en valkuilen
Fouten om te vermijden
- Overbuffering:Overmatig grote buffers kunnen bufferbloat veroorzaken, waardoor de latentie toeneemt
- Geheugenbeperkingen negeren:Grote buffers vermenigvuldigen zich met het aantal verbindingen; een server met 10.000 verbindingen en 128 MB buffers heeft 1,25 TB RAM nodig
- Automatisch afstemmen zonder reden uitschakelen:Het automatisch afstemmen van moderne besturingssystemen is meestal beter dan statische instellingen
- Niet testen na wijzigingen:Valideer prestatieverbeteringen altijd met echte werklasten
- NIC-buffers vergeten:Uitputting van de ringbuffer kan onafhankelijk van socketbuffers optreden
- Inconsistente instellingen:Client en server moeten compatibele bufferconfiguraties hebben
- Congestiecontrole negeren:BBR en CUBIC zijn aanzienlijk beter dan oudere algoritmen
Problemen met de werkstroom oplossen
- Basislijn vaststellen:Meet de huidige prestaties met iperf3 of vergelijkbare tools
- Pakketten vastleggen:Gebruik tcpdump/Wireshark om het gedrag van TCP-vensters te identificeren
- Systeemstatistieken controleren:Zoek naar druppels, bufferuitputting, hertransmissies
- Bereken BDP:Bepaal theoretisch optimale buffergroottes
- Incrementele wijzigingen toepassen:Verander niet alles in één keer
- Testen en valideren:Meet daadwerkelijke prestatieverbetering
- Monitoren in de loop van de tijd:Zorg ervoor dat de instellingen optimaal blijven onder wisselende belastingen
Referenties en verder lezen
- RFC 1323 - TCP-extensies voor hoge prestaties (vensterschaling)
- RFC 2018 - TCP-selectieve bevestigingsopties
- RFC 6928 - Het initiële venster van TCP vergroten
- RFC 8312 - CUBIC Congestiebeheersingsalgoritme
- BBR-congestiecontrole (Google) - https://research.google/pubs/pub45646/
- Linux Kernel-documentatie - netwerken/ip-sysctl.txt
- Handleiding voor Windows TCP/IP-prestaties afstemmen (Microsoft)
- ESnet netwerkafstemmingsgids - https://fasterdata.es.net/
Conclusie
Bufferuitputting is een veelvoorkomende oorzaak van prestatieproblemen die netwerkgerelateerd lijken te zijn. Door de evolutie van de buffergrootte te begrijpen, van de 128 KB-limieten uit 2009 naar de huidige 128 MB-mogelijkheden, kunnen netwerkingenieurs deze problemen snel identificeren en oplossen.
Belangrijkste afhaalrestaurants:
- Moderne systemen hebben aanzienlijk grotere buffers nodig dan oudere (2009) configuraties
- Bereken BDP altijd voor uw specifieke netwerkomstandigheden
- Gebruik functies voor automatisch afstemmen van het besturingssysteem, indien beschikbaar (Windows, moderne Linux)
- Monitor en test om wijzigingen te valideren
- Houd bij het afstemmen rekening met werkbelastingspecifieke vereisten
Onthoud: een "netwerkprobleem" dat aan het licht komt door pakketanalyse om TCP-nulvensters weer te geven, is feitelijk een probleem met de systeembronnen van het hostsysteem. Met de juiste bufferafstemming kunt u deze valse diagnoses elimineren en optimale prestaties bereiken.
Laatst bijgewerkt: 2 februari 2026
Auteur: Baud9600 Technisch team