System Buffer Tuning - TCP and Network Performance Optimization
Systembufferttuning: Den dolda synden bakom "Network Problems"
Verkställande Sammanfattning
Nätverksingenjörer möter ofta situationer där TCP-fönster eller applikationsprestanda skylls på nätverksinfrastruktur. Efter att ha utfört omfattande paketfångster, tcpdumps och nätverksanalys, är den sanna flaskhalsen ofta upptäckt: utmattad NIC (Network Interface Card) eller OS-nivå buffertar på klienten eller serversystemen.
Denna artikel ger både arv (cirka 2009) och nuvarande (2025-2026) buffertkonfigurationer för Linux, Windows och macOS, tillsammans med diagnostiska tekniker för att identifiera buffertutmattning innan det blir en kritisk fråga.
Vanliga symtom på buffertutmattning
- TCP Zero Window händelser i paketfångster
- Hög retransmission priser trots lågt nätverk latens
- Applikation genomströmning signifikant under tillgänglig bandbredd
- Prestanda nedbrytning under belastning som förbättras när belastningen minskar
- Inkonsekvent prestanda över liknande hårdvarukonfigurationer
- Socketfel eller "Resurs tillfälligt otillgängliga" meddelanden
Förstå problemet
TCP fönsterskala Mechanism
TCP använder en flödeskontrollmekanism där mottagaren annonserar en "fönsterstorlek" som anger hur mycket data den kan acceptera. När systembuffertar fyller upp, krymper detta fönster till noll, vilket tvingar avsändaren att vänta. Detta verkar som ett nätverksproblem men är faktiskt en värdresursfråga.
Där buffertar materia
- Socket Buffers (SO SNDBUF/SO RCVBUF): Per-socket skicka och ta emot buffertar
- TCP fönsterbuffertar: Maximal TCP fönsterstorlek för anslutningar
- Network Device Buffers: NIC ring buffertar för paket kö
- Systemomfattande minne: Övergripande minne allokerat för nätverkande
Diagnostiska kommandon
Linux Diagnostics
# 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"
Windows Diagnostics
# 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 Diagnostics
# 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 Inställningar (Circa 2009)
| Parameter | Legacy Value (2009) | Beskrivning |
|---|---|---|
| net.core.rmem default | 124928 (122KB) | Standard får socket buffert storlek |
| net.core.rmem max | 131071 (128KB) | Maximalt får socket buffert storlek |
| net.core.wmem default | 124928 (122KB) | Standard skickar socket buffert storlek |
| net.core.wmem max | 131071 (128KB) | Maximum skicka socket buffert storlek |
| net.ipv4.tcp rmem | 4096 87380 174760 | TCP får buffert: min, standard, max (i byte) |
| net.ipv4.tcp wmem | 4096 16384 131072 | TCP skickar buffert: min, standard, max (i byte) |
| net.ipv4.tcp mem | 196608 262144 393216 | TCP minnessidor: lågt, tryck, högt |
| net.core.netdev max backlog | 1000 1000 1000 | Maximala paket i ingångskö |
| net.core.optmem max | 10240 (10KB) | Maximal ancillär buffertstorlek per socket |
Nuvarande Linux Inställningar (2025-2026)
| Parameter | Nuvarande rekommenderat värde | Description |
|---|---|---|
| net.core.rmem_default | 16777216 (16MB) | Default receive socket buffer size |
| net.core.rmem_max | 134217728 (128 MB) | 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 får buffert: min, standard, max (128 MB max) |
| net.ipv4.tcp_wmem | 4096 65536 134217728 | TCP skickar buffert: min, standard, max (128 MB max) |
| net.ipv4.tcp_mem | 8388608 12582912 16777216 | TCP-minnessidor: lågt, tryck, högt (64 GB-system) |
| net.core.netdev_max_backlog | 2500 | Maximala paket i ingångskö (10GbE +) |
| net.core.optmem_max | 65536 (64KB) | Maximum ancillary buffer size per socket |
| net.ipv4.tcp congestion control | bbr | Använd BBR trängsel kontroll (Google algoritm) |
| net.ipv4.tcp window scaling | 1 1 | Aktivera TCP fönsterskala (RFC 1323) |
| net.ipv4.tcp timestamps | 1 | Aktivera TCP-tidsstämplar för bättre RTT-uppskattning |
| net.ipv4.tcp sack | 1 | Aktivera selektiv erkännande |
| net.ipv4.tcp no metrics save | 1 | Inaktivera cachning av TCP mätvärden |
Linux Configuration Application
Lägg till dessa inställningar för att /etc/sysctl.conf eller skapa en ny fil /etc/sysctl.d/99-network-tuning.confFrån:
# 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-connection minne: Varje anslutning kan använda upp till rmem max + wmem max (256 MB med 128 MB buffertar)
- Total systempåverkan: 1000 anslutningar × 256 MB = 256 GB potentiell användning
- Säker uppskattning: Max samtidiga anslutningar × 256 MB bör inte överstiga 50% av systemet RAM
- Exempel: En 64GB-server bör begränsa maxanslutningar till ~ 125 samtidiga hög genomströmningsanslutningar med 128 MB-buffertar
- Rekommendation för servrar med <16 GB RAM: Minska buffertar till 16-32 MB max och justera tcp mem proportionellt
Windows Buffer Tuning
Legacy Windows Inställningar (Circa 2009 - Windows Vista / 7 / Server 2008)
| Parameter | Legacy Value (2009) | Plats |
|---|---|---|
| TcpWindowSize | 65535 (64KB) | Registrering: HKLM\System\CurrentControlSet\Services\Tcpip\Parametrar |
| Tcp1323Opts | 0 (inaktiverad) | Fönsterskalning inaktiverad som standard |
| DefaultReceiveWindow | 8192 (8KB) | Standard får fönster |
| DefaultSendWindow | 8192 (8KB) | Standard skicka fönster |
| GlobalMaxTcpWindowSize | 65535 (64KB) | Maximal TCP fönsterstorlek |
| TcpNumConnections | 16777214 | Maximala TCP-anslutningar |
Nuvarande Windows Inställningar (Windows 10/11/Server 2019-2025)
Modern Windows använder Få fönster Auto-Tuning funktion, som dynamiskt justerar får buffertar baserat på nätverksförhållanden.
| Funktion | Nuvarande rekommenderad inställning | Description |
|---|---|---|
| Auto-Tuning nivå | normalt (eller mycket experimentellt för 10GbE +) | Dynamisk får fönsterjustering |
| Receive-Side Scaling (RSS) | aktiverad | Distribuera nätverksbehandling över CPU: er |
| Chimney Offload | automatisk (eller inaktiverad på moderna NIC) | TCP offload till NIC hårdvara |
| NetDMA | Inaktiverad | Direct Memory Access (förhindrad) |
| TCP globala parametrar | Se kommandon nedan | Systemomfattande TCP-inställningar |
| Överbelastningsleverantör | CUBIC (eller NewReno fallback) | TCP trängsel kontroll algoritm |
Windows Configuration Commands
# 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
Avancerade NIC Buffer Inställningar (via Device Manager eller 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 (Avancerad - Använd med försiktighet)
# 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 Inställningar (Circa 2009 - Mac OS X 10.5/10.6)
| Parameter | Legacy Value (2009) | Description |
|---|---|---|
| kern.ipc.maxsockbuf | 262144 (256KB) | Maximal socket buffertstorlek |
| net.inet.tcp.sendspace | 32768 (32KB) | Standard TCP skickar buffert |
| net.inet.tcp.recvspace | 32768 (32KB) | Standard TCP får buffert |
| net.inet.tcp.autorcvbufmax | 131072 (128KB) | Maximal auto-tuned får buffert |
| net.inet.tcp.autosndbufmax | 131072 (128KB) | Maximal auto-tuned skicka buffert |
| net.inet.tcp.rfc1323 | 0 (disabled) | TCP fönster skalning |
Nuvarande macOS-inställningar (macOS 12-15 Monterey genom Sequoia)
| Parameter | Current Recommended Value | Description |
|---|---|---|
| kern.ipc.maxsockbuf | 8388608 (8 MB) | 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 (aktiverad) | Aktivera TCP fönster skalning |
| net.inet.tcp.sack | 1 (enabled) | Enable Selective Acknowledgment |
| net.inet.tcp.mssdflt | 1440 | Standard TCP Maximal Segment Size |
| net.inet.tcp.delayed ack | 3 3 3 3 3 | Försenat ACK beteende |
macOS Configuration Application
# 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 <Skapa en LaunchDaemon för ihållande inställningar
# 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 Varning: macOS Ventura (13) och senare har System Integrity Protection (SIP) restriktioner. Vissa kärnparametrar kanske inte kan ändras även med sudo. Testinställningar i din specifika miljö.
Prestandatestning och validering
Verktyg för att testa buffertprestanda
iperf3 - Nätverksprestandatestning
# 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 - Fånga TCP fönsterstorlekar
# 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 analys
Leta efter dessa indikatorer på buffertproblem:
- TCP Zero Window-meddelanden
- TCP Window Update paket
- TCP fönster fullständiga meddelanden
- Hög retransmission med låg RTT
Systemövervakning
# 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
Bandwidth-Delay Product (BDP) Beräkning
För att bestämma optimala buffertstorlekar för ditt nätverk, beräkna 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.
Workload-Specific rekommendationer
| Workload Type | Rekommenderad buffertstorlek | Nyckelparametrar |
|---|---|---|
| Web Server (Låg latens) | 4-16 MB | Lägre buffertar, fler anslutningar, snabb respons |
| Databas Server | 16-32 MB | Måttliga buffertar, konsekvent genomströmning |
| Filöverföring / Backup | 64-128 MB | Maximal buffert, hög genomströmsprioritet |
| Video Streaming | 32-64 MB | Stora buffertar, konsekvent leveranshastighet |
| HPC / Data Center | 128-256 MB | Maximal buffert, specialiserad trängselkontroll |
| Trådlös / Mobil | 2-8 MB | Konservativa buffertar, variabel latenshantering |
Vanliga misstag och fallgropar
Misstag att undvika
- Överbuffring: Överdrivet stora buffertar kan orsaka bufferbloat, ökad latens
- Ignorera minnesbegränsningar: Stora buffertar multiplicerar genom anslutningsräkning; en server med 10 000 anslutningar och 128 MB buffertar behöver 1,25 TB RAM
- Inaktivera auto-tuning utan anledning: Modern OS auto-tuning är vanligtvis bättre än statiska inställningar
- Testa inte efter förändringar: Alltid validera prestandaförbättringar med riktiga arbetsbelastningar
- Glöm NIC buffers: Ring buffertutmattning kan uppstå oberoende av socketbuffertar
- Inkonsekventa inställningar: Kund och server bör ha kompatibla buffertkonfigurationer
- Ignorera trängselkontroll: BBR och CUBIC är betydligt bättre än äldre algoritmer
Felsökning arbetsflöde
- Etablera baslinjen: Mät nuvarande prestanda med iperf3 eller liknande verktyg
- Fånga paket: Använd tcpdump/Wireshark för att identifiera TCP-fönsterbeteende
- Kontrollera systemstatistik: Leta efter droppar, buffertutmattning, retransmissioner
- Beräkna BDP: Bestäm teoretiskt optimala buffertstorlekar
- Applicera stegvisa förändringar: Ändra inte allt på en gång
- Test och validering: Mät faktisk prestandaförbättring
- Övervaka över tid: Se till att inställningarna förblir optimala under olika belastningar
Referenser och vidare läsning
- RFC 1323 - TCP-förlängningar för hög prestanda (Window Scaling)
- RFC 2018 - TCP Selective Acknowledgment Options
- RFC 6928 - Öka TCP:s första fönster
- RFC 8312 - CUBIC Congestion Control Algoritm
- BBR Congestion Control (Google) - https://research.google/pub/pub45646/
- Linux Kernel Documentation - Nätverk/ip-sysctl.txt
- Windows TCP/IP Performance Tuning Guide (Microsoft)
- ESnet Network Tuning Guide - https://fasterdata.es.net/
Slutsats
Buffertutmattning är en vanlig orsak till prestandaproblem som verkar vara nätverksrelaterade. Genom att förstå utvecklingen av buffertstorlekar från 2009s 128KB-gränser till dagens 128 MB-kapacitet kan nätverksingenjörer snabbt identifiera och lösa dessa problem.
Key takeaways:
- Moderna system behöver betydligt större buffertar än äldre konfigurationer (2009)
- Kalkylera alltid BDP för dina specifika nätverksförhållanden
- Använd OS auto-tuning funktioner när tillgängliga (Windows, modern Linux)
- Övervaka och testa för att validera ändringar
- Överväga arbetsbelastningsspecifika krav när du stämmer
Kom ihåg: Ett "nätverksproblem" som avslöjas genom paketanalys för att visa TCP-nollfönster är faktiskt ett värdsystemresursproblem. Med korrekt buffertjustering kan du eliminera dessa falska diagnoser och uppnå optimal prestanda.
Senast uppdaterad: 2 februari 2026
Författare: Baud9600 Tekniskt Team