Inżynierowie sieci często napotykają sytuacje, w których na infrastrukturę sieciową obwinia się działanie systemu TCP przy pomocy okien lub aplikacji. Po wykonaniu obszernych przechwytywania pakietów, tcpdumpy i analizy sieci, często odkrywane są prawdziwe wąskie gardła: wyczerpane NIC (Karta interfejsu sieciowego) lub bufory poziomu OS- na systemie klienta lub serwera.
Ten artykuł zawiera zarówno dotychczasowe (ok. 2009) jak i aktualne (2025- 2026) konfiguracje bufora dla Linuksa, Windows i MacOS, wraz z technikami diagnostycznymi w celu identyfikacji wyczerpania bufora, zanim stanie się to kwestią krytyczną.
TCP używa mechanizmu kontroli przepływu, w którym odbiornik reklamuje "rozmiar okna", wskazując ile danych może zaakceptować. Kiedy bufory systemu wypełniają się, to okno kurczy się do zera, zmuszając nadawcę do oczekiwania. Wydaje się to problemem sieciowym, ale w rzeczywistości jest to kwestia zasobów hosta.
# 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"
# 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"
# 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
| Parametr | Wartość spadkowa (2009 r.) | Opis |
|---|---|---|
| net.core.rmem _ default | 124928 (122KB) | Domyślny rozmiar bufora gniazda odbioru |
| net.core.rmem _ max | 131071 (128KB) | Maksymalny rozmiar bufora gniazda odbioru |
| net.core.wmem _ default | 124928 (122KB) | Domyślny rozmiar bufora gniazda |
| net.core.wmem _ max | 131071 (128KB) | Maksymalny rozmiar bufora gniazda wysyłania |
| net.ipv4.tcp _ rmem | 4096 87380 174760 | TCP otrzymuje bufor: min, domyślnie, max (w bajtach) |
| net.ipv4.tcp _ wmem | 4096 16384 131072 | Bufor wysyłania TCP: min, domyślnie, max (w bajtach) |
| net.ipv4.tcp _ mem | 196608 262144 393216 | Strony pamięci TCP: niskie ciśnienie, wysokie |
| net.core.netdev _ max _ backlog | 1000 | Maksymalne pakiety w kolejce wejściowej |
| net.core.optmem _ max | 10240 (10KB) | Maksymalny dodatkowy rozmiar bufora na gniazdo |
| Parameter | Bieżąca zalecana wartość | 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 otrzymuje bufor: min, domyślnie, max (128MB max) |
| net.ipv4.tcp_wmem | 4096 65536 134217728 | Bufor wysyłania TCP: min, domyślnie, max (128MB max) |
| net.ipv4.tcp_mem | 8388608 12582912 16777216 | Strony pamięci TCP: niskie ciśnienie, wysokie (system 64GB) |
| net.core.netdev_max_backlog | 250000 | Maksymalne pakiety w kolejce wejściowej (10GbE +) |
| net.core.optmem_max | 65536 (64KB) | Maximum ancillary buffer size per socket |
| net.ipv4.tcp _ currence _ control | bbr | Użyj kontroli zatorów BBR (algorytm Google) |
| net.ipv4.tcp _ window _ skaling | 1 | Włącz skalowanie okien TCP (RFC 1323) |
| net.ipv4.tcp _ timestags | 1 | Włącz znaczniki czasu TCP dla lepszej oceny RTT |
| net.ipv4.tcp _ sack | 1 | Włącz selektywne potwierdzenie |
| net.ipv4.tcp _ no _ metrics _ save | 1 | Wyłącz buforowanie mierników TCP |
Dodaj te ustawienia do /etc/sysctl.conf lub utworzyć nowy plik /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
# 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
| Parameter | Legacy Value (2009) | Lokalizacja |
|---|---|---|
| TcpWindowSize | 65535 (64KB) | Rejestr: HKLM\ System\ CurrentControlSet\ Services\ Tcpip\ Parametry |
| Tcp1323Opts | 0 (wyłączone) | Domyślnie wyłączono skalowanie okien |
| DefaultReceiveWindow | 8192 (8KB) | Domyślne okno odbioru |
| DefaultSendOkno | 8192 (8KB) | Domyślne okno wysyłania |
| GlobalMaxTcpWindowSize | 65535 (64KB) | Maksymalny rozmiar okna TCP |
| TcpNumConnections | 16777214 | Maksymalne połączenia TCP |
Nowoczesne Windows wykorzystuje Otrzymuj automatyczne strojenie okna funkcja, która dynamicznie dostosowuje odbieranie buforów na podstawie warunków sieciowych.
| Cecha | Aktualne zalecane ustawienia | Description |
|---|---|---|
| Automatyczny poziom dostrajania | normalny (lub wysoce eksperymentalny dla 10GbE +) | Dynamiczna regulacja odbiornika |
| Skalowanie boczne odbiornika (RSS) | włączone | Rozpowszechnianie przetwarzania sieci w ramach CPU |
| Komin | automatyczne (lub wyłączone w nowoczesnych WWiI) | TCP wyładowywanie na sprzęcie NIC |
| NetDMA | wyłączone | Bezpośredni dostęp do pamięci (zdeprecjonowany) |
| Parametry globalne TCP | Patrz polecenia poniżej | Ustawienia TCP o szerokim zakresie systemowym |
| Dostawca zatorów | CUBIC (lub NewReno asfalt) | Algorytm kontroli przekrwienia TCP |
# 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
# 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
# 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)
| Parameter | Legacy Value (2009) | Description |
|---|---|---|
| kern.ipc.maxsockbuf | 262144 (256KB) | Maksymalny rozmiar bufora gniazda |
| net.inet.tcp.sendspace | 32768 (32KB) | Domyślny bufor wysyłania TCP |
| net.inet.tcp.recvspace | 32768 (32KB) | Domyślny bufor odbioru TCP |
| net.inet.tcp.autorcvbufmax | 131072 (128KB) | Maksymalny automatyczny bufor odbiorczy |
| net.inet.tcp.autosndbufmax | 131072 (128KB) | Maksymalny automatyczny bufor wysyłania |
| net.inet.tcp.rfc1323 | 0 (disabled) | skalowanie okien TCP |
| Parameter | Current Recommended Value | Description |
|---|---|---|
| kern.ipc.maxsockbuf | 8388608 (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 (włączone) | Włącz skalowanie okien TCP |
| net.inet.tcp.sack | 1 (enabled) | Enable Selective Acknowledgment |
| net.inet.tcp.mssdflt | 1440 | Domyślny maksymalny rozmiar segmentu TCP |
| net.inet.tcp.related _ ack | 3 | Opóźnione zachowanie ACK |
# 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 <Tworzenie LaunchDaemon dla trwałych ustawień
# 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 Ostrzeżenie: MacOS Ventura (13) i późniejsze ograniczenia ochrony integralności systemu (SIP). Niektóre parametry jądra mogą nie być modyfikowalne nawet z sudo. Ustawienia testowe w danym środowisku.
# 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
# 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'
Poszukaj tych wskaźników dotyczących kwestii związanych z buforem:
# 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
Aby określić optymalne rozmiary bufora dla sieci, obliczyć produkt Bandwidth- Delay:
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.
| Typ obciążenia roboczego | Zalecany rozmiar bufora | Parametry kluczowe |
|---|---|---|
| Web Server (niskie opóźnienie) | 4- 16 MB | Niższe bufory, więcej połączeń, szybka reakcja |
| Serwer baz danych | 16- 32 MB | Zderzaki umiarkowane, równomierna przepustowość |
| Transfer pliku / kopia zapasowa | 64- 128 MB | Maksymalne zderzaki o dużej przepustowości |
| Strumieniowanie wideo | 32- 64 MB | Duże zderzaki, stała szybkość dostaw |
| HPC / Centrum danych | 128- 256 MB | Maksymalne bufory, specjalistyczna kontrola zatorów |
| Bezprzewodowe / mobilne | 2- 8 MB | Konserwatywne bufory, obsługa zmiennego opóźnienia |
Wyczerpanie buforowe jest powszechną przyczyną problemów z wydajnością, które wydają się być związane z siecią. Dzięki zrozumieniu ewolucji wielkości bufora z 2009 r. do dzisiejszych możliwości 128MB, inżynierowie sieci mogą szybko zidentyfikować i rozwiązać te problemy.
Kluczowe wyjścia:
Pamiętaj: "problem sieciowy" ujawniony przez analizę pakietów, aby pokazać TCP zero okien jest rzeczywiście problem z zasobami systemu hosta. Dzięki właściwemu dostrojeniu bufora można wyeliminować te fałszywe diagnozy i osiągnąć optymalną wydajność.
Ostatnia aktualizacja: 2 lutego 2026
Autor: Zespół techniczny BUD9600