.. titel: System Buffer Tuning - TCP og Network Performance Optimization .. slug: system-buffer-tuning .. dato: 2026-02-02 10:00:00 UTC .. tags: netværk, ydeevne, tuning, tcp, buffere .. kategori: artikler .. link: .. beskrivelse: Forståelse og optimering af systembuffere for at løse problemer med TCP-ydelse, ofte fejldiagnosticeret som netværksproblemer .. type: tekst

Systembufferjustering: Den skjulte synder bag "netværksproblemer"

Executive Summary

Netværksingeniører støder ofte på situationer, hvor TCP-vinduer eller applikationsydelse er skyld i netværksinfrastrukturen. Efter at have udført omfattende pakkefangst, tcpdumps og netværksanalyse, opdages den sande flaskehals ofte: opbrugte NIC (Network Interface Card) eller OS-niveau buffere på klient- eller serversystemer.

Denne artikel giver både ældre (ca. 2009) og nuværende (2025-2026) bufferkonfigurationer til Linux, Windows og macOS sammen med diagnostiske teknikker til at identificere bufferudtømning, før det bliver et kritisk problem.

Almindelige symptomer på bufferudmattelse

Forståelse af problemet

TCP-vinduesskaleringsmekanismen

TCP bruger en flowkontrolmekanisme, hvor modtageren annoncerer en "vinduesstørrelse", der angiver, hvor meget data den kan acceptere. Når systembuffere fyldes op, krymper dette vindue til nul, hvilket tvinger afsenderen til at vente. Dette ser ud som et netværksproblem, men er faktisk et problem med værtsressourcer.

Hvor buffere betyder noget

Diagnostiske kommandoer

Linux-diagnostik

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

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

# 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

Ældre Linux-indstillinger (omkring 2009)

Parameter Ældre værdi (2009) Beskrivelse
net.core.rmem_default 124928 (122KB) Standard modtagesocket bufferstørrelse
net.core.rmem_max 131071 (128KB) Maksimal modtagersockets bufferstørrelse
net.core.wmem_default 124928 (122KB) Standard sende socket buffer størrelse
net.core.wmem_max 131071 (128KB) Maksimal sendesocket-bufferstørrelse
net.ipv4.tcp_rmem 4096 87380 174760 TCP-modtagelsesbuffer: min, standard, max (i bytes)
net.ipv4.tcp_wmem 4096 16384 131072 TCP sendebuffer: min, standard, max (i bytes)
net.ipv4.tcp_mem 196608 262144 393216 TCP-hukommelsessider: lav, tryk, høj
net.core.netdev_max_backlog 1000 Maksimalt antal pakker i inputkø
net.core.optmem_max 10240 (10 KB) Maksimal ekstra bufferstørrelse pr. sokkel

Aktuelle Linux-indstillinger (2025-2026)

Parameter Aktuel anbefalet værdi Beskrivelse
net.core.rmem_default 16777216 (16 MB) Standard modtagesocket bufferstørrelse
net.core.rmem_max 134217728 (128 MB) Maksimal modtagersockets bufferstørrelse
net.core.wmem_default 16777216 (16 MB) Standard sende socket buffer størrelse
net.core.wmem_max 134217728 (128 MB) Maksimal sendesocket-bufferstørrelse
net.ipv4.tcp_rmem 4096 87380 134217728 TCP-modtagelsesbuffer: min, standard, max (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-hukommelsessider: lav, tryk, høj (64GB system)
net.core.netdev_max_backlog 250000 Maksimalt antal pakker i inputkø (10GbE+)
net.core.optmem_max 65536 (64KB) Maksimal ekstra bufferstørrelse pr. sokkel
net.ipv4.tcp_congestion_control bbr Brug BBR overbelastningskontrol (Googles algoritme)
net.ipv4.tcp_window_scaling 1 Aktiver TCP-vindueskalering (RFC 1323)
net.ipv4.tcp_timestamps 1 Aktiver TCP-tidsstempler for bedre RTT-estimering
net.ipv4.tcp_sack 1 Aktiver selektiv bekræftelse
net.ipv4.tcp_no_metrics_save 1 Deaktiver cachelagring af TCP-metrics

Linux-konfigurationsapplikation

Tilføj disse indstillinger til/etc/sysctl.confeller opret 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 - Hukommelsesforbrug:tcp_mem-værdierne er på hukommelsessider (typisk 4KB). Store bufferstørrelser kan forårsage alvorligt hukommelsestryk:

Windows Buffer Tuning

Ældre Windows-indstillinger (omkring 2009 - Windows Vista/7/Server 2008)

Parameter Ældre værdi (2009) Beliggenhed
TcpWindowSize 65535 (64 KB) Registrering: HKLM\System\CurrentControlSet\Services\Tcpip\Parameters
Tcp1323Opts 0 (deaktiveret) Vinduesskalering deaktiveret som standard
DefaultReceiveWindow 8192 (8KB) Standard modtagevindue
DefaultSendWindow 8192 (8KB) Standard sendevindue
GlobalMaxTcpWindowSize 65535 (64 KB) Maksimal TCP-vinduestørrelse
TcpNumConnections 16777214 Maksimal TCP-forbindelser

Aktuelle Windows-indstillinger (Windows 10/11/Server 2019-2025)

Moderne Windows brugerAutomatisk tuning af vinduetfunktion, som dynamisk justerer modtagebuffere baseret på netværksforhold.

Feature Aktuel anbefalet indstilling Beskrivelse
Auto-tuning niveau normal (eller meget eksperimenterende for 10GbE+) Dynamisk justering af modtagevindue
Modtage-sideskalering (RSS) aktiveret Fordel netværksbehandling på tværs af CPU'er
Aflastning af skorsten automatisk (eller deaktiveret på moderne NIC'er) TCP-aflastning til NIC-hardware
NetDMA handicappet Direkte hukommelsesadgang (forældet)
TCP globale parametre Se kommandoer nedenfor Systemdækkende TCP-indstillinger
Trængselsudbyder CUBIC (eller NewReno fallback) TCP overbelastningskontrolalgoritme

Windows-konfigurationskommandoer

# 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

Avancerede NIC-bufferindstillinger (via Enhedshåndtering 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 (avanceret - brug med forsigtighed)

# 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+), undgå manuelle registreringsændringer, medmindre automatisk tuning forårsager problemer. Algoritmerne til automatisk tuning er generelt bedre end statiske indstillinger.

macOS Buffer Tuning

Ældre macOS-indstillinger (omkring 2009 - Mac OS X 10.5/10.6)

Parameter Ældre værdi (2009) Beskrivelse
kern.ipc.maxsockbuf 262144 (256 KB) Maksimal socket bufferstørrelse
net.inet.tcp.sendspace 32768 (32KB) Standard TCP sende buffer
net.inet.tcp.recvspace 32768 (32KB) Standard TCP-modtagebuffer
net.inet.tcp.autorcvbufmax 131072 (128KB) Maksimal auto-tunet modtagebuffer
net.inet.tcp.autosndbufmax 131072 (128KB) Maksimal auto-tunet sendebuffer
net.inet.tcp.rfc1323 0 (deaktiveret) TCP vindue skalering

Aktuelle macOS-indstillinger (macOS 12-15 Monterey gennem Sequoia)

Parameter Aktuel anbefalet værdi Beskrivelse
kern.ipc.maxsockbuf 8388608 (8 MB) Maksimal socket bufferstørrelse
net.inet.tcp.sendspace 131072 (128KB) Standard TCP sende buffer
net.inet.tcp.recvspace 131072 (128KB) Standard TCP-modtagebuffer
net.inet.tcp.autorcvbufmax 16777216 (16 MB) Maksimal auto-tunet modtagebuffer
net.inet.tcp.autosndbufmax 16777216 (16 MB) Maksimal auto-tunet sendebuffer
net.inet.tcp.rfc1323 1 (aktiveret) Aktiver TCP-vindueskalering
net.inet.tcp.sack 1 (aktiveret) Aktiver selektiv bekræftelse
net.inet.tcp.mssdflt 1440 Standard TCP maksimal segmentstørrelse
net.inet.tcp.delayed_ack 3 Forsinket ACK-adfærd

macOS-konfigurationsapplikation

# 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

Oprettelse af en LaunchDaemon til vedvarende indstillinger

# 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 nyere har begrænsninger for System Integrity Protection (SIP). Nogle kerneparametre kan muligvis ikke ændres, selv med sudo. Test indstillinger i dit specifikke miljø.

Ydelsestest og validering

Værktøjer til test af bufferydelse

iperf3 - Test af netværksydelse

# 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 - Optag TCP-vinduestø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 efter disse indikatorer for bufferproblemer:

Systemovervågning

# 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 af båndbreddeforsinkelsesprodukt (BDP).

For at bestemme optimale bufferstørrelser for dit netværk skal du beregne 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.

Arbejdsbelastningsspecifikke anbefalinger

Arbejdsbelastningstype Anbefalet bufferstørrelse Nøgleparametre
Webserver (lav latenstid) 4-16 MB Lavere buffere, flere forbindelser, hurtig respons
Database server 16-32 MB Moderate buffere, ensartet gennemløb
Filoverførsel / sikkerhedskopiering 64-128 MB Maksimale buffere, høj gennemløbsprioritet
Videostreaming 32-64 MB Store buffere, ensartet leveringshastighed
HPC / Datacenter 128-256 MB Maksimale buffere, specialiseret overbelastningskontrol
Trådløs/mobil 2-8 MB Konservative buffere, variabel latenshåndtering

Almindelige fejl og faldgruber

Fejl at undgå

Fejlfinding af arbejdsgang

  1. Etabler baseline:Mål den aktuelle ydeevne med iperf3 eller lignende værktøjer
  2. Optag pakker:Brug tcpdump/Wireshark til at identificere TCP-vinduets adfærd
  3. Tjek systemstatistik:Se efter fald, bufferudmattelse, retransmissioner
  4. Beregn BDP:Bestem teoretisk optimale bufferstørrelser
  5. Anvend trinvise ændringer:Skift ikke alt på én gang
  6. Test og valider:Mål den faktiske præstationsforbedring
  7. Overvåg over tid:Sørg for, at indstillingerne forbliver optimale under varierende belastninger

Referencer og videre læsning

Konklusion

Bufferudmattelse er en almindelig årsag til ydeevneproblemer, der ser ud til at være netværksrelaterede. Ved at forstå udviklingen af ​​bufferstørrelser fra 2009's 128KB-grænser til nutidens 128MB-kapaciteter, kan netværksingeniører hurtigt identificere og løse disse problemer.

Nøgle takeaways:

Husk: Et "netværksproblem" afsløret af pakkeanalyse for at vise TCP nul vinduer er faktisk et ressourceproblem i værtssystemet. Med korrekt buffertuning kan du eliminere disse falske diagnoser og opnå optimal ydeevne.


Sidst opdateret: 2. februar 2026

Forfatter: Baud9600 Technical Team