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
- 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)
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 <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 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
- Stanoviť východiskovú hodnotu: Meranie výkonu prúdu pomocou iperf3 alebo podobných nástrojov
- Zachytiť balíčky: Použite tcpdump/Wireshark na identifikáciu správania okna TCP
- Kontrolná štatistika systému: Hľadajte kvapky, vyčerpanie pufru, retransmisie
- Vypočítajte BDP: Určiť teoreticky optimálnu veľkosť nárazníka
- Použiť prírastkové zmeny: Nemeň všetko naraz.
- Test a potvrdenie: Meranie skutočného zlepšenia výkonnosti
- 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