System Buffer Tuning - TCP and Network Performance Optimization

Tuning systémového pufru: skrytý bulprit za "Problémy siete"

Zhrnutie

Sieťoví inžinieri sa často stretávajú s situáciami, keď TCP okenný alebo aplikačný výkon je zodpovedný za sieťovú infraštruktúru. Po vykonaní rozsiahleho pakety zachytáva, tcpdumps, a sieťovej analýzy, je často objavený skutočný problém: vyčerpaný NIC (Karta sieťového rozhrania) alebo OS-level nárazníky na klientskom alebo serverovom systéme.

Tento článok poskytuje odkaz (okolo roku 2009) aj súčasné (2025-2026) konfigurácie nárazníkov pre Linux, Windows a macOS, spolu s diagnostickými technikami na identifikáciu vyčerpania nárazníka pred tým, než sa stane kritickým problémom.

Bežné príznaky pufrového vyčerpania

  • Udalosti TCP Zero Window v paketoch
  • Vysoká miera retransmisie napriek nízkej latencii siete
  • Priepustnosť aplikácie výrazne pod dostupnou šírkou pásma
  • Degradácia výkonu pri zaťažení, ktorá sa zlepšuje pri znižovaní zaťaženia
  • Nejednotný výkon v podobných konfiguráciách hardvéru
  • Chyby soketu alebo správy "Resource dočasne nedostupné"

Pochopenie problému

Mechanizmus skĺbenia okien TCP

TCP používa mechanizmus regulácie prietoku, v ktorom prijímač inzeruje "veľkosť okna" označujúci, koľko dát môže prijať. Keď sa systémové nárazníky naplnia, toto okno sa zmenšuje na nulu a núti odosielateľa čakať. Zdá sa to ako problém siete, ale v skutočnosti je to problém hostiteľských zdrojov.

Kde záleží na nárazníkoch

  • Socket Buffers (SO SNDBUF/SO RCVBUF): Na-socket odosielať a prijímať nárazníky
  • TCP nárazníky okien: Maximálna veľkosť okna TCP pre pripojenie
  • Pufrátory sieťového zariadenia: NIC krúžkové nárazníky pre balíčky queuing
  • Systémová pamäť: Celková pamäť pridelená na vytváranie sietí

Diagnostické príkazy

Linux Diagnostika

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

Diagnostika okien

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

# 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

Nastavenie Legacy Linux (Circa 2009)

Parameter Hodnota odkazu (2009) Opis
netting.core.rmem default 124928 (122KB) Štandardná veľkosť zásuvkového pufra
netting.core.rmem max 131071 (128KB) Maximálna veľkosť zásuvkového pufra
net.core.wmem default 124928 (122KB) Štandardná veľkosť zásuvkového pufra
unit description in lists 131071 (128KB) Maximálna veľkosť send zásuvkového pufra
net.ipv4.tcp rmem 4096 87380 174760 TCP receive puffer: min, default, max (in bajtes)
net.ipv4.tcp wmem 4096 16384 131072 TCP poslať pufer: min, default, max (v bajtoch)
net.ipv4.tcp mem 196608 262144 393216 Pamäťové stránky TCP: nízka, tlak, vysoká
net.core.netdev max backlog 1000 Maximálne pakety vo vstupnom fronte
net.core.optmem max 10240 (10KB) Maximálna doplnková veľkosť nárazníka na zásuvku

Aktuálne nastavenia Linuxu (2025-2026)

Parameter Aktuálna odporúčaná hodnota 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 receive puffer: min, default, max (128MB max)
net.ipv4.tcp_wmem 4096 65536 134217728 TCP odoslať pufer: min, default, max (128MB max)
net.ipv4.tcp_mem 8388608 12582912 16777216 Pamäťové stránky TCP: nízka, tlak, vysoký (64GB systém)
net.core.netdev_max_backlog 250000 Maximálne pakety vo vstupnom fronte (10GbE+)
net.core.optmem_max 65536 (64KB) Maximum ancillary buffer size per socket
net.ipv4.tcp congestion control bbr Použiť kontrolu preťaženia BBR (Googleov algoritmus)
net.ipv4.tcp window scaling 1 Povoliť nastavenie okna TCP (RFC 1323)
net.ipv4.tcp timestamps 1 Povoliť časové značky TCP pre lepší odhad RTT
net.ipv4.tcp sack 1 Povoliť selektívne uznanie
net.ipv4.tcp no metrics save 1 Zakázať caching TCP metriky

Konfiguračná aplikácia Linux

Pridať tieto nastavenia do /etc/sysctl.conf alebo vytvoriť nový súbor /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

Nice 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
Kritická výstraha - spotreba pamäte: Hodnoty tcp mem sú na pamäťových stránkach (zvyčajne 4KB). Veľké veľkosti pufra môžu spôsobiť silný tlak pamäti:
  • Pamäť na pripojenie: Každé pripojenie môže využiť až do rmem max + wmem max (256MB s 128MB nárazníkmi)
  • Celkový vplyv systému: 1000 pripojení × 256MB = 256GB potenciálne využitie
  • Bezpečný odhad: Maximálne súbežné pripojenia × 256MB by nemali prekročiť 50% systémovej RAM
  • Príklad: 64GB server by mal obmedziť maximálne pripojenie na ~125 súbežné high-priepustné pripojenie s 128MB nárazníkmi
  • Odporúčanie pre servery s <16GB RAM: Zníženie vankúšov na 16-32MB max a proporcionálne upraviť tcp mem

Vyrovnávanie okien

Legacy Windows Nastavenia (Circa 2009 - Windows Vista/7/Server 2008)

Parameter Legacy Value (2009) Umiestnenie
TcpWindowSize 65535 (64KB) Register: HKLM\System\CurrentControlSet\Services\Tcpip\Parametre
Tcp1323Opts 0 (vypnuté) Štandardne vypnuté nastavenie okna
ŠtandardneprimeranéWindow 8192 (8KB) Štandardné prijímacie okno
Štandardne SendWindow 8192 (8KB) Štandardné okno odosielania
GlobalMaxTcpWindowSize 65535 (64KB) Maximálna veľkosť okna TCP
TcpNumConnections 16777214 Maximálne spojenia TCP

Aktuálne nastavenia Windows (Windows 10/11/Server 2019-2025)

Moderné okná používajú Automatické ovládanie okna funkcie, ktoré dynamicky upravuje prijíma nárazníky na základe sieťových podmienok.

Funkcia Aktuálne odporúčané nastavenie Description
Úroveň automatického cvičenia normálne (alebo vysoko experimentálne na 10GbE+) Nastavenie dynamického prijímacieho okna
Príjmové rozpätie (RSS) povolené Distribuovať sieť spracovanie cez procesory
Komney Offload automatické (alebo vypnuté na moderných NIC) TCP vylodenie do hardvéru NIC
NetDMA vypnuté Priamy prístup k pamäti (deprekovaný)
TCP globálne parametre Pozri nižšie uvedené príkazy Systémové nastavenia TCP
Poskytovateľ kongescie CUBIC (alebo NewReno fallback) Algoritmus regulácie preťaženia TCP

Name

# 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

Advanced NIC Buffer Nastavenia (prostredníctvom správcu zariadenia alebo 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

Vylepšenia registra (Advanced - Použitie opatrne)

# 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)
Varovanie: Na modernom systéme Windows (10/11/Server 2019+) sa vyhýbajte manuálnym úpravám registra, ak auto-ladenie nespôsobuje problémy. Automatické dolaďovacie algoritmy sú vo všeobecnosti lepšie ako statické nastavenia.

macOS Buffer Tuning

Legacy macOS Nastavenia (Circa 2009 - Mac OS X 10.5/10.6)

Parameter Legacy Value (2009) Description
kern.ipc.maxsockbuf 262144 (256KB) Maximálna veľkosť zásuvkového pufra
net.inet.tcp.sendspace 32768 (32KB) Štandardný TCP odosielací vankúš
net.inet.tcp.recvspace 32768 (32KB) Štandardný TCP prijímací vankúš
net.inet.tcp.autorcvbufmax 131072 (128KB) Maximálny automatický prijímací vankúš
net.inet.tcp.autosndbufmax 131072 (128KB) Maximálna automatická vyrovnávacia pamäť
net.inet.tcp.rfc1323 0 (disabled) TCP škálovanie okien

Aktuálne nastavenia macOS (macOS 12-15 Monterey cez Sequoia)

Parameter Current Recommended Value Description
kern.ipc.maxsockbuf 83886008 (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 (povolené) Povoliť nastavenie okna TCP
net.inet.tcp.sack 1 (enabled) Enable Selective Acknowledgment
net.inet.tcp.mssdflt 1440 Štandardná maximálna veľkosť segmentu TCP
net.inet.tcp.delayed ack 3 Oneskorené správanie SPÄŤ

konfiguračná aplikácia macOS

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

Vytvorenie spúšťacieho démona pre trvalé nastavenia

# 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
Varovanie: macOS Ventura (13) a neskôr majú obmedzenia ochrany integrity systému (SIP). Niektoré parametre jadra nemusia byť modifikovateľné ani sudo. Skúšobné nastavenia vo vašom konkrétnom prostredí.

Testovanie a overovanie účinnosti

Nástroje na testovanie výkonu pufru

iperf3 - Testovanie výkonnosti siete

# 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 - Zachytiť veľkosť okna TCP

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

Analýza wireshark

Pozrite sa na tieto ukazovatele problémov s vankúšmi:

  • TCP Zero Window správy
  • TCP Window Update pakety
  • TCP Window Celé oznámenia
  • Vysoká miera retransmisie s nízkou RTT

Monitorovanie systému

# 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

Výpočet výrobku so šírkou pásma (BDP)

Pre určenie optimálnej veľkosti nárazníka pre vašu sieť, vypočítajte Bandwidth-Delay Produkt:

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.

Osobitné odporúčania pre pracovné zaťaženie

Typ pracovného zaťaženia Odporúčaná veľkosť pufru Kľúčové parametre
Web server (malá latencia) 4-16 MB Dolné nárazníky, viac spojení, rýchla reakcia
Databáza Server 16-32 MB Mierne nárazníky, konzistentná priepustnosť
Prenos súborov / Zálohovanie 64-128 MB Maximálne vankúše, vysoká priepustná priorita
Streamovanie videa 32-64 MB Veľké rezervy, konzistentná miera dodania
HPC / Data Center 128-256 MB Maximálne nárazníky, špecializovaná kontrola preťaženia
Wireless / Mobile 2-8 MB Konzervatívne nárazníky, variabilná latencia

Časté chyby a pády

Chyby, ktorým sa treba vyhnúť

  • Nadmerná ponuka: Nadmerne veľké nárazníky môžu spôsobiť pufru, čo zvyšuje latenciu
  • Ignorovanie obmedzenia pamäte: Veľké nárazníky sa násobia počtom pripojení; server s 10 000 pripojeniami a 128MB nárazníky potrebuje 1.25TB RAM
  • Zakázať automatické ladenie bez dôvodu: Moderné automatické ladenie OS je zvyčajne lepšie ako statické nastavenie
  • Neskúmané po zmenách: Vždy potvrdiť zlepšenie výkonnosti so skutočným pracovným zaťažením
  • Zabudnutie nárazníkov NIC: K vyčerpaniu kruhového pufra môže dôjsť nezávisle od zásuvkových pufrov
  • Nejednotné nastavenia: Klient a server by mali mať kompatibilné konfigurácie nárazníkov
  • Ignorovanie kontroly preťaženia: BBR a CUBIC sú podstatne lepšie ako staršie algoritmy

Odstraňovanie problémov - pracovný tok

  1. Stanoviť východiskovú hodnotu: Meranie výkonu prúdu pomocou iperf3 alebo podobných nástrojov
  2. Zachytiť balíčky: Použite tcpdump/Wireshark na identifikáciu správania okna TCP
  3. Kontrolná štatistika systému: Hľadajte kvapky, vyčerpanie pufru, retransmisie
  4. Vypočítajte BDP: Určiť teoreticky optimálnu veľkosť nárazníka
  5. Použiť prírastkové zmeny: Nemeň všetko naraz.
  6. Test a potvrdenie: Meranie skutočného zlepšenia výkonnosti
  7. Postupne sledujte: Zaistiť, aby nastavenie zostalo optimálne pri rôznom zaťažení

Odkazy a ďalšie čítanie

  • RFC 1323 - TCP rozšírenie pre vysoký výkon (Window Scaling)
  • RFC 2018 - Výberové možnosti uznania TCP
  • RFC 6928 - Zvýšenie počiatočného okna TCP
  • RFC 8312 - CUBIC Congestion Control Algorithm
  • BBR Congestion Control (Google) - https://research.google/pubs/pub45646/
  • Linux Kernel Dokumentácia - vytváranie sietí/ip-sysctl.txt
  • Windows TCP/IP Performance Tuning Guide (Microsoft)
  • ESnet Network Tuning Guide - https://fasterdata.es.net/

Záver

Vyčerpávanie pufru je bežnou základnou príčinou problémov s výkonom, ktoré sa javia ako súvisiace so sieťou. Pochopením vývoja nárazníkovej veľkosti od hraníc 128KB v roku 2009 až po dnešné 128MB schopnosti, sieťoví inžinieri môžu rýchlo identifikovať a vyriešiť tieto problémy.

Kľúče:

  • Moderné systémy potrebujú podstatne väčšie nárazníky ako pôvodné konfigurácie (2009)
  • Vždy vypočítať BDP pre vaše špecifické sieťové podmienky
  • Používajte funkcie automatického ladenia OS (Windows, moderný Linux)
  • Monitorovanie a testovanie na overenie zmien
  • Zvážiť požiadavky špecifické pre pracovnú záťaž pri dolaďovaní

Pamätajte: "Problém siete" odhalený analýzou paketov na zobrazenie TCP nuly windows je vlastne problém s hostiteľským systémom. S správne nastavenie nárazníka, môžete odstrániť tieto falošné diagnózy a dosiahnuť optimálny výkon.


Posledná úprava: február 2, 2026

Autor: Baud9600 Technický tím