System Buffer Tuning - TCP and Network Performance Optimization
Systeembuffer Tuning: De verborgen culprit achter "Netwerkproblemen"
Samenvatting
Netwerkengineers ondervinden vaak situaties waarin TCP windowing of applicatieprestaties de schuld krijgen van netwerkinfrastructuur. Na het uitvoeren van uitgebreide pakket vangt, tcpdumps, en netwerkanalyse, wordt de ware bottleneck vaak ontdekt: uitgeputte NIC (Network Interface Card) of OS-level buffers op de client of server systemen.
Dit artikel biedt zowel legacy (circa 2009) als huidige (2025-2026) buffer configuraties voor Linux, Windows en macOS, samen met kenmerkende technieken om buffer uitputting te identificeren voordat het een cruciaal probleem wordt.
Vaak voorkomende symptomen van bufferuitputting
- TCP Zero Window gebeurtenissen in pakketopnames
- Hoge doorgiftepercentages ondanks lage netwerklatentie
- Toepassingsdoorvoer aanzienlijk onder de beschikbare bandbreedte
- Prestatiedegradatie onder belasting die verbetert wanneer de belasting afneemt
- Inconsistente prestaties in vergelijkbare hardwareconfiguraties
- Socket fouten of "Resource tijdelijk niet beschikbaar" berichten
Het probleem begrijpen
Het TCP vensterschaalmechanisme
TCP maakt gebruik van een flow control mechanisme waarbij de ontvanger adverteert een "venster grootte" aangeven hoeveel gegevens het kan accepteren. Wanneer systeembuffers opvullen, krimpt dit venster naar nul, waardoor de afzender moet wachten. Dit lijkt een netwerkprobleem, maar is eigenlijk een host resource probleem.
Waar Buffers Matter
- Socketbuffers (SO SNDBUF/SO RCVBUF): Per-socket verzenden en ontvangen buffers
- TCP-vensterbuffers: Maximale TCP-venstergrootte voor verbindingen
- Netwerkapparaatbuffers: NIC ringbuffers voor pakketwachtrij
- Systeembreed geheugen: Totaal geheugen toegewezen voor netwerken
Diagnostische commando's
Linux Diagnostica
# Check current TCP buffer settings sysctl net.ipv4.tcp_rmem sysctl net.ipv4.tcp_wmem sysctl net.core.rmem_max sysctl net.core.wmem_max # 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"
Venstersdiagnostiek
# 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 Buffer Tuning
Legacy Linux-instellingen (Circa 2009)
| Parameter | Legacy Value (2009) | Omschrijving |
|---|---|---|
| net.core.rmem default | 124928 (122KB) | Standaard socket buffer grootte ontvangen |
| net.core.rmem max | 131071 (128KB) | Maximale socket buffergrootte ontvangen |
| net.core.wmem default | 124928 (122KB) | Standaard socket buffergrootte versturen |
| net.core.wmem max | 131071 (128KB) | Maximale socket buffergrootte versturen |
| net.ipv4.tcp rmem | 4096 87380 174760 | TCP-buffer ontvangen: min, standaard, max (in bytes) |
| net.ipv4.tcp wmem | 4096 16384 131072 | TCP-buffer versturen: min, standaard, max (in bytes) |
| net.ipv4.tcp mem | 196608 262144 393216 | TCP geheugenpagina's: laag, druk, hoog |
| net.core.netdev max backlog | 1000 | Maximale pakketten in invoerwachtrij |
| net.core.optmem max | 10240 (10KB) | Maximale bijkomende buffergrootte per socket |
Huidige Linux-instellingen (2025-2026)
| Parameter | Huidige aanbevolen waarde | Description |
|---|---|---|
| net.core.rmem_default | 16777216 (16MB) | Default receive socket buffer size |
| net.core.rmem_max | 134217728 (128MB) | Maximum receive socket buffer size |
| net.core.wmem_default | 16777216 (16MB) | Default send socket buffer size |
| net.core.wmem_max | 134217728 (128MB) | Maximum send socket buffer size |
| net.ipv4.tcp_rmem | 4096 87380 134217728 | TCP ontvangt buffer: min, standaard, max (128MB max) |
| net.ipv4.tcp_wmem | 4096 65536 134217728 | TCP verzendbuffer: min, standaard, max (128MB max) |
| net.ipv4.tcp_mem | 8388608 12582912 16777216 | TCP geheugen pagina's: laag, druk, hoog (64GB systeem) |
| net.core.netdev_max_backlog | 250000 | Maximale pakketten in invoerwachtrij (10GbE+) |
| net.core.optmem_max | 65536 (64KB) | Maximum ancillary buffer size per socket |
| net.ipv4.tcp congestion control | bbr | Gebruik BBR-congestieregeling (algoritme van Google) |
| net.ipv4.tcp venster schaling | 1 | TCP-vensterschaling inschakelen (RFC 1323) |
| net.ipv4.tcp timestamps | 1 | TCP tijdstempels inschakelen voor een betere RTT-schatting |
| net.ipv4.tcp sack | 1 | Selectieve erkenning inschakelen |
| net.ipv4.tcp no metrics save | 1 | Caching van TCP-metrics uitschakelen |
Linux configuratietoepassing
Voeg deze instellingen toe aan /etc/sysctl.conf of maak een nieuw bestand aan /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 Ring Buffer 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
- Per-verbinding geheugen: Elke verbinding kan gebruikt worden tot rmem max + wmem max (256MB met 128MB buffers)
- Totale systeemimpact: 1.000 verbindingen × 256MB = 256GB potentieel gebruik
- Veilige schatting: Maximale gelijktijdige verbindingen × 256MB mogen niet meer bedragen dan 50% van systeemRAM
- Voorbeeld: Een 64GB server moet max verbindingen beperken tot ~125 gelijktijdige hoge-doorvoer verbindingen met 128MB buffers
- Aanbeveling voor servers met <16GB RAM: Buffers verlagen tot 16-32MB max en tcp mem proportioneel aanpassen
Windows Buffer Tuning
Legacy Windows-instellingen (Circa 2009 - Windows Vista/7/Server 2008)
| Parameter | Legacy Value (2009) | Locatie |
|---|---|---|
| TcpWindowSize | 65535 (64KB) | Register: HKLM\System\CurrentControlSet\Services\Tcpip\Parameters |
| Tcp1323Opts | 0 (uitgeschakeld) | Vensterschalen standaard uitgeschakeld |
| StandaardReceiveWindow | 8192 (8KB) | Standaard ontvangen venster |
| StandaardSendWindow | 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 gebruikt de Venster Auto-Tuning ontvangen functie, die dynamisch aanpast ontvangen buffers op basis van netwerkomstandigheden.
| Functie | Huidige aanbevolen instelling | Description |
|---|---|---|
| Automatisch afstellen | normaal (of zeer experimenteel voor 10GbE+) | Dynamische vensteraanpassing ontvangen |
| Ontvangstzijdeschaal (RSS) | ingeschakeld | Netwerkverwerking verdelen over CPU's |
| Chimney Offload | automatisch (of uitgeschakeld op moderne NIC's) | TCP uitladen naar NIC hardware |
| NetDMA | uitgeschakeld | Directe geheugentoegang (achterhaald) |
| TCP Global Parameters | Zie onderstaande commando's | Systeembrede TCP-instellingen |
| Congestieprovider | CUBIC (of NewReno fallback) | TCP-congestiecontrolealgoritme |
Windows configuratie commando's
# 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
Registry Tweaks (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 Buffer Tuning
Legacy macOS-instellingen (Circa 2009 - Mac OS X 10.5/10.6)
| Parameter | Legacy Value (2009) | Description |
|---|---|---|
| Kern.ipc.maxsockbuf | 262144 (256KB) | Maximale socket buffergrootte |
| net.inet.tcp.sendspace | 32768 (32KB) | Standaard TCP-verzendbuffer |
| net.inet.tcp.recvspace | 32768 (32KB) | Standaard TCP-buffer ontvangen |
| net.inet.tcp.autorcvbufmax | 131072 (128KB) | Maximale automatisch ingestelde ontvangbuffer |
| net.inet.tcp.autosndbufmax | 131072 (128KB) | Maximale automatisch ingestelde verzendbuffer |
| net.inet.tcp.rfc1323 | 0 (disabled) | TCP-vensterschalen |
Huidige macOS-instellingen (macOS 12-15 Monterey door Sequoia)
| Parameter | Current Recommended Value | Description |
|---|---|---|
| kern.ipc.maxsockbuf | 8388608 (8MB) | Maximum socket buffer size |
| net.inet.tcp.sendspace | 131072 (128KB) | Default TCP send buffer |
| net.inet.tcp.recvspace | 131072 (128KB) | Default TCP receive buffer |
| net.inet.tcp.autorcvbufmax | 16777216 (16MB) | Maximum auto-tuned receive buffer |
| net.inet.tcp.autosndbufmax | 16777216 (16MB) | Maximum auto-tuned send buffer |
| net.inet.tcp.rfc1323 | 1 (ingeschakeld) | TCP-vensterschalen inschakelen |
| net.inet.tcp.sack | 1 (enabled) | Enable Selective Acknowledgment |
| net.inet.tcp.mssdflt | 1440 | Standaard TCP Maximale segmentgrootte |
| net.inet.tcp.delayed ack | 3 | Vertraagd ACK gedrag |
macOS configuratieprogramma
# 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 <Een lanceerDaemon aanmaken voor persistente instellingen
# Create /Library/LaunchDaemons/com.local.sysctl.plist sudo tee /Library/LaunchDaemons/com.local.sysctl.plist <EOF sudo chmod 644 /Library/LaunchDaemons/com.local.sysctl.plist sudo launchctl load /Library/LaunchDaemons/com.local.sysctl.plist Label com.local.sysctl ProgramArguments /usr/sbin/sysctl -w kern.ipc.maxsockbuf=8388608 RunAtLoad Waarschuwing: macOS Ventura (13) en later hebben System Integrity Protection (SIP) beperkingen. Sommige kernelparameters kunnen zelfs met sudo niet aangepast worden. Testinstellingen in uw specifieke omgeving.
Prestatietest en -validatie
Hulpmiddelen voor het testen van bufferprestaties
iperf3 - Netwerkprestatietest
# 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-venstergroottes vastleggen
# 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
Kijk voor deze indicatoren van bufferproblemen:
- TCP Zero Window berichten
- TCP Window Update pakketten
- TCP-venster Volledige meldingen
- Hoge doorgiftetarieven 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 Bandbreedte-Delay Product (BDP)
Om optimale buffermaten voor uw netwerk te bepalen, berekent u het Bandbreedte-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
| Werkbelastingtype | Aanbevolen buffergrootte | Sleutelparameters |
|---|---|---|
| Webserver (lage latentie) | 4-16 MB | Lagere buffers, meer verbindingen, snelle respons |
| Databaseserver | 16-32 MB | Matige buffers, consistente doorvoer |
| Bestandsoverdracht / back-up | 64-128 MB | Maximale buffers, hoge doorvoerprioriteit |
| Video streamen | 32-64 MB | Grote buffers, consistente leveringssnelheid |
| HPC / datacenter | 128-256 MB | Maximale buffers, gespecialiseerde congestiebeheersing |
| Draadloos / mobiel | 2-8 MB | Conservatieve buffers, variabele latentie behandeling |
Veel voorkomende fouten en valkuilen
Fouten om te vermijden
- Overbufferen: Overmatige grote buffers kunnen bufferblaas veroorzaken, toenemende latentie
- Geheugenbeperkingen negeren: Grote buffers vermenigvuldigen met aantal verbindingen; een server met 10.000 verbindingen en 128MB buffers heeft 1,25 TB RAM nodig
- Auto-tuning zonder reden uitschakelen: Moderne OS auto-tuning is meestal beter dan statische instellingen
- Niet testen na wijzigingen: Altijd prestatieverbeteringen valideren met echte werkbelasting
- NIC-buffers vergeten: Ring buffer uitputting kan optreden onafhankelijk van socket buffers
- Inconsistente instellingen: Client en server moeten compatibele bufferconfiguraties hebben
- Negeer congestiebestrijding: BBR en CUBIC zijn significant beter dan oudere algoritmen
Problemen met de werkstroom oplossen
- Vaststelling van de uitgangswaarde: Meet de huidige prestaties met iperf3 of soortgelijk gereedschap
- Pakketten vastleggen: Tcpdump/Wireshark gebruiken om TCP-venstergedrag te identificeren
- Systeemstatistieken controleren: Zoek naar druppels, buffer uitputting, doorgiftes
- Bereken BDP: Theoretisch optimale buffermaten bepalen
- Incrementele wijzigingen toepassen: Verander niet alles tegelijk.
- Testen en valideren: Meet de werkelijke prestatieverbetering
- Monitor na verloop van tijd: Zorg ervoor dat de instellingen optimaal blijven onder verschillende belastingen
Referenties en verdere lezing
- RFC 1323 - TCP Extensions for High Performance (Window Scaling)
- RFC 2018 - TCP Selectieve erkenningsopties
- RFC 6928 - Initiële venster van TCP verhogen
- RFC 8312 - CUBIC Congestie Controle Algorithm
- BBR Congestiecontrole (Google) - https://research.google/pubs/pub45646/
- Linux Kernel Documentatie - netwerken/ip-sysctl.txt
- Windows TCP/IP Performance Tuning Guide (Microsoft)
- ESnet Network Tuning Guide - https://fasterdata.es.net/
Conclusie
Buffer uitputting is een veel voorkomende oorzaak van prestatie problemen die lijken te zijn netwerk-gerelateerd. Door inzicht te krijgen in de evolutie van buffers van de 128KB grenzen van 2009 tot de 128MB mogelijkheden van vandaag, kunnen netwerkingenieurs deze problemen snel identificeren en oplossen.
Sleutelafhaalmogelijkheden:
- Moderne systemen hebben aanzienlijk grotere buffers nodig dan oude (2009) configuraties
- Bereken altijd BDP voor uw specifieke netwerkvoorwaarden
- Gebruik OS auto-tuning functies wanneer beschikbaar (Windows, moderne Linux)
- Controleer en test om wijzigingen te valideren
- Beschouw arbeidsspecifieke eisen bij het afstemmen
Vergeet niet: Een "netwerkprobleem" onthuld door pakketanalyse om te laten zien dat TCP nul vensters is eigenlijk een host systeem resource probleem. Met de juiste buffer tuning kunt u deze valse diagnoses elimineren en optimale prestaties bereiken.
Laatst aangepast: 2 februari 2026
Auteur: Baud9600 Technisch Team