System Buffer Tuning - TCP and Network Performance Optimization

# 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-diagnostikk

# 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-diagnostikk

# 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

Eldre Linux-innstillinger (cirka 2009)

Parameter Legacy Value (2009) Beskrivelse
net.core.rmem_default 124928 (122KB) Standard bufferstørrelse for mottakssocket
net.core.rmem_max 131071 (128KB) Maksimal bufferstørrelse for mottakssocket
net.core.wmem_default 124928 (122KB) Standard sendesocket-bufferstørrelse
net.core.wmem_max 131071 (128KB) Maksimal sendesocketbufferstørrelse
net.ipv4.tcp_rmem 4096 87380 174760 TCP-mottaksbuffer: min, standard, maks (i byte)
net.ipv4.tcp_wmem 4096 16384 131072 TCP sendebuffer: min, standard, maks (i byte)
net.ipv4.tcp_mem 196608 262144 393216 TCP-minnesider: lavt, trykk, høyt
net.core.netdev_max_backlog 1000 Maksimalt antall pakker i inndatakø
net.core.optmem_max 10240 (10 kB) Maksimal størrelse på tilleggsbuffer per stikkontakt

Gjeldende Linux-innstillinger (2025–2026)

Parameter Gjeldende anbefalt verdi Beskrivelse
net.core.rmem_default 16777216 (16 MB) Standard bufferstørrelse for mottakssocket
net.core.rmem_max 134217728 (128 MB) Maksimal bufferstørrelse for mottakssocket
net.core.wmem_default 16777216 (16 MB) Standard sendesocket-bufferstørrelse
net.core.wmem_max 134217728 (128 MB) Maksimal sendesocketbufferstørrelse
net.ipv4.tcp_rmem 4096 87380 134217728 TCP-mottaksbuffer: min, standard, maks (128 MB maks)
net.ipv4.tcp_wmem 4096 65536 134217728 TCP sendebuffer: min, standard, maks (128 MB maks)
net.ipv4.tcp_mem 8388608 12582912 16777216 TCP-minnesider: lavt, trykk, høyt (64GB system)
net.core.netdev_max_backlog 250000 Maksimalt antall pakker i inngangskø (10GbE+)
net.core.optmem_max 65536 (64KB) Maksimal størrelse på tilleggsbuffer per stikkontakt
net.ipv4.tcp_congestion_control bbr Bruk BBR overbelastningskontroll (Googles algoritme)
net.ipv4.tcp_window_scaling 1 Aktiver TCP-vinduskalering (RFC 1323)
net.ipv4.tcp_timestamps 1 Aktiver TCP-tidsstempler for bedre RTT-estimering
net.ipv4.tcp_sack 1 Aktiver selektiv bekreftelse
net.ipv4.tcp_no_metrics_save 1 Deaktiver hurtigbufring av TCP-beregninger

Linux-konfigurasjonsapplikasjon

Legg til disse innstillingene til/etc/sysctl.confeller opprett en ny fil/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
Kritisk advarsel - Minneforbruk:tcp_mem-verdiene er på minnesider (vanligvis 4KB). Store bufferstørrelser kan forårsake alvorlig minnepress:
  • Minne per tilkobling:Hver tilkobling kan bruke opptil rmem_max + wmem_max (256 MB med 128 MB buffere)
  • Total systempåvirkning:1000 tilkoblinger × 256 MB = 256 GB potensiell bruk
  • Sikkert estimat:Maks samtidige tilkoblinger × 256 MB bør ikke overstige 50 % av system-RAM
  • Eksempel:En 64 GB server bør begrense maksimale tilkoblinger til ~125 samtidige høykapasitetstilkoblinger med 128 MB buffere
  • Anbefaling for servere med <16 GB RAM:Reduser buffere til 16-32MB maks og juster tcp_mem proporsjonalt

Windows-bufferjustering

Eldre Windows-innstillinger (Circa 2009 - Windows Vista/7/Server 2008)

Parameter Legacy Value (2009) Sted
TcpWindowSize 65535 (64KB) Register: HKLM\System\CurrentControlSet\Services\Tcpip\Parameters
Tcp1323Opts 0 (deaktivert) Vindusskalering er deaktivert som standard
Default ReceiveWindow 8192 (8KB) Standard mottaksvindu
DefaultSendWindow 8192 (8KB) Standard sendevindu
GlobalMaxTcpWindowSize 65535 (64KB) Maksimal TCP-vindusstørrelse
TcpNumConnections 16777214 Maksimal TCP-tilkoblinger

Gjeldende Windows-innstillinger (Windows 10/11/Server 2019-2025)

Moderne Windows brukerAutomatisk justering av mottaksvindufunksjon, som dynamisk justerer mottaksbuffere basert på nettverksforhold.

Trekk Gjeldende anbefalt innstilling Beskrivelse
Auto-tuning nivå normal (eller svært eksperimentell for 10GbE+) Dynamisk justering av mottaksvindu
Mottakssideskalering (RSS) aktivert Distribuer nettverksbehandling på tvers av CPUer
Avlastning av skorstein automatisk (eller deaktivert på moderne nettverkskort) TCP-avlastning til NIC-maskinvare
NetDMA funksjonshemmet Direkte minnetilgang (avviklet)
TCP globale parametere Se kommandoer nedenfor Systemomfattende TCP-innstillinger
Overbelastningsleverandør CUBIC (eller NewReno reserve) TCP overbelastningskontrollalgoritme

Windows-konfigurasjonskommandoer

# 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

Avanserte NIC-bufferinnstillinger (via Enhetsbehandling 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

Registerjusteringer (avansert – bruk med forsiktighet)

# 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)
Advarsel:På moderne Windows (10/11/Server 2019+), unngå manuelle registerendringer med mindre automatisk justering forårsaker problemer. Algoritmene for automatisk tuning er generelt bedre enn statiske innstillinger.

macOS Buffer Tuning

Eldre macOS-innstillinger (cirka 2009 - Mac OS X 10.5/10.6)

Parameter Legacy Value (2009) Beskrivelse
kern.ipc.maxsockbuf 262144 (256 kB) Maksimal socket bufferstørrelse
net.inet.tcp.sendspace 32768 (32KB) Standard TCP sendebuffer
net.inet.tcp.recvspace 32768 (32KB) Standard TCP-mottaksbuffer
net.inet.tcp.autorcvbufmax 131072 (128KB) Maksimal automatisk innstilt mottaksbuffer
net.inet.tcp.autosndbufmax 131072 (128KB) Maksimal automatisk innstilt sendebuffer
net.inet.tcp.rfc1323 0 (deaktivert) TCP-vinduskalering

Gjeldende macOS-innstillinger (macOS 12-15 Monterey gjennom Sequoia)

Parameter Gjeldende anbefalt verdi Beskrivelse
kern.ipc.maxsockbuf 8388608 (8MB) Maksimal socket bufferstørrelse
net.inet.tcp.sendspace 131072 (128KB) Standard TCP sendebuffer
net.inet.tcp.recvspace 131072 (128KB) Standard TCP-mottaksbuffer
net.inet.tcp.autorcvbufmax 16777216 (16 MB) Maksimal automatisk innstilt mottaksbuffer
net.inet.tcp.autosndbufmax 16777216 (16 MB) Maksimal automatisk innstilt sendebuffer
net.inet.tcp.rfc1323 1 (aktivert) Aktiver TCP-vinduskalering
net.inet.tcp.sekk 1 (aktivert) Aktiver selektiv bekreftelse
net.inet.tcp.mssdflt 1440 Standard TCP maksimal segmentstørrelse
net.inet.tcp.delayed_ack 3 Forsinket ACK-adferd

macOS-konfigurasjonsapplikasjon

# 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

Opprette en LaunchDaemon for vedvarende innstillinger

# 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
Advarsel:macOS Ventura (13) og senere har System Integrity Protection (SIP)-begrensninger. Noen kjerneparametere er kanskje ikke modifiserbare selv med sudo. Test innstillinger i ditt spesifikke miljø.

Ytelsestesting og validering

Verktøy for testing av bufferytelse

iperf3 - Testing av nettverksytelse

# 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 - Ta opp TCP-vindustørrelser

# 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

Se etter disse indikatorene på bufferproblemer:

  • TCP Zero Window-meldinger
  • TCP-vinduoppdateringspakker
  • TCP-vinduet Fullstendige varsler
  • Høye reoverføringshastigheter med lav RTT

Systemovervåking

# 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

Beregning av båndbreddeforsinkelsesprodukt (BDP).

For å bestemme optimale bufferstørrelser for nettverket ditt, kalkuler båndbreddeforsinkelsesproduktet:

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.

Arbeidsbelastningsspesifikke anbefalinger

Type arbeidsbelastning Anbefalt bufferstørrelse Nøkkelparametere
Nettserver (lav ventetid) 4-16 MB Lavere buffere, flere tilkoblinger, rask respons
Database server 16-32 MB Moderate buffere, konsistent gjennomstrømning
Filoverføring / Sikkerhetskopiering 64-128 MB Maksimale buffere, høy gjennomstrømningsprioritet
Videostreaming 32-64 MB Store buffere, jevn leveringshastighet
HPC / Datasenter 128-256 MB Maksimal buffere, spesialisert overbelastningskontroll
Trådløs / mobil 2-8 MB Konservative buffere, håndtering av variabel ventetid

Vanlige feil og fallgruver

Feil å unngå

  • Overbuffering:For store buffere kan forårsake bufferbloat, noe som øker ventetiden
  • Ignorer minnebegrensninger:Store buffere multipliseres med antall tilkoblinger; en server med 10 000 tilkoblinger og 128 MB buffere trenger 1,25 TB RAM
  • Deaktivering av automatisk justering uten grunn:Moderne OS-autoinnstilling er vanligvis bedre enn statiske innstillinger
  • Tester ikke etter endringer:Valider alltid ytelsesforbedringer med reelle arbeidsbelastninger
  • Glem NIC-buffere:Ringbufferutmatting kan oppstå uavhengig av socketbuffere
  • Inkonsekvente innstillinger:Klient og server bør ha kompatible bufferkonfigurasjoner
  • Ignorer overbelastningskontroll:BBR og CUBIC er betydelig bedre enn eldre algoritmer

Feilsøking av arbeidsflyt

  1. Etabler grunnlinje:Mål gjeldende ytelse med iperf3 eller lignende verktøy
  2. Ta opp pakker:Bruk tcpdump/Wireshark for å identifisere TCP-vinduets virkemåte
  3. Sjekk systemstatistikk:Se etter fall, bufferutmattelse, retransmissioner
  4. Beregn BDP:Bestem teoretisk optimale bufferstørrelser
  5. Bruk inkrementelle endringer:Ikke endre alt på en gang
  6. Test og valider:Mål faktisk ytelsesforbedring
  7. Overvåk over tid:Sørg for at innstillingene forblir optimale under varierende belastning

Referanser og videre lesning

  • RFC 1323 - TCP-utvidelser for høy ytelse (vinduskalering)
  • RFC 2018 - TCP-selektive bekreftelsesalternativer
  • RFC 6928 - Øker TCPs innledende vindu
  • RFC 8312 - CUBIC Congestion Control Algoritme
  • BBR Congestion Control (Google) - https://research.google/pubs/pub45646/
  • Linux Kernel Documentation - nettverk/ip-sysctl.txt
  • Windows TCP/IP ytelsesjusteringsveiledning (Microsoft)
  • ESnet Network Tuning Guide - https://fasterdata.es.net/

Konklusjon

Bufferutmattelse er en vanlig årsak til ytelsesproblemer som ser ut til å være nettverksrelaterte. Ved å forstå utviklingen av bufferstørrelse fra 2009s 128KB-grenser til dagens 128MB-kapasiteter, kan nettverksingeniører raskt identifisere og løse disse problemene.

Viktige takeaways:

  • Moderne systemer trenger betydelig større buffere enn eldre (2009) konfigurasjoner
  • Beregn alltid BDP for dine spesifikke nettverksforhold
  • Bruk OS auto-tuning funksjoner når tilgjengelig (Windows, moderne Linux)
  • Overvåk og test for å validere endringer
  • Vurder arbeidsbelastningsspesifikke krav ved innstilling

Husk: Et "nettverksproblem" avslørt ved pakkeanalyse for å vise TCP null vinduer er faktisk et ressursproblem i vertssystemet. Med riktig bufferinnstilling kan du eliminere disse falske diagnosene og oppnå optimal ytelse.


Sist oppdatert: 2. februar 2026

Forfatter: Baud9600 Technical Team