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
Kritisk varning - minnesförbrukning: Tcp mem-värdena är i minnessidor (vanligtvis 4KB). Stora buffertstorlekar kan orsaka allvarligt minnestryck:
  • 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)
Varning: På moderna Windows (10/11/Server 2019+), undvik manuella registret ändringar om auto-tuning orsakar problem. Auto-tuning algoritmer är i allmänhet överlägsna statiska inställningar.

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 <Labelcom.local.sysctlProgramArguments/usr/sbin/sysctl-wkern.ipc.maxsockbuf=8388608RunAtLoad
EOF

sudo chmod 644 /Library/LaunchDaemons/com.local.sysctl.plist
sudo launchctl load /Library/LaunchDaemons/com.local.sysctl.plist
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

  1. Etablera baslinjen: Mät nuvarande prestanda med iperf3 eller liknande verktyg
  2. Fånga paket: Använd tcpdump/Wireshark för att identifiera TCP-fönsterbeteende
  3. Kontrollera systemstatistik: Leta efter droppar, buffertutmattning, retransmissioner
  4. Beräkna BDP: Bestäm teoretiskt optimala buffertstorlekar
  5. Applicera stegvisa förändringar: Ändra inte allt på en gång
  6. Test och validering: Mät faktisk prestandaförbättring
  7. Ö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