System Buffer Tuning - TCP and Network Performance Optimization
Dostrajanie buforowe systemu: Ukryty Culprit Za "Problemy sieciowe"
Streszczenie
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ą.
Częste objawy wysięku buforowego
- Zdarzenia TCP Zero Okno w przechwytywaniu pakietów
- Wysokie wskaźniki retransmisji pomimo niskiego opóźnienia sieci
- Przepustowość aplikacji znacznie poniżej dostępnej przepustowości
- Degradacja wydajności pod obciążeniem, która poprawia się w momencie zmniejszenia obciążenia
- Niespójna wydajność w podobnych konfiguracjach sprzętowych
- Błędy gniazda lub wiadomości "tymczasowo niedostępne zasoby"
Zrozumienie problemu
Mechanizm skalowania okien TCP
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.
Gdzie znaczenie bufory
- Bufory gniazda (SO _ SNDBUF / SO _ RCVBUF): Per- gniazda wysyłaj i odbieraj bufory
- Bufory okien TCP: Maksymalny rozmiar okna TCP dla połączeń
- Bufory urządzeń sieciowych: Zderzaki pierścieniowe NIC do ustawiania pakietów
- Pamięć systemowa: Całkowita pamięć przydzielona do tworzenia sieci
Polecenia diagnostyczne
Diagnostyka Linuksa
# 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"
Diagnostyka systemu Windows
# 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 Diagnostics
# 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
Dostrajanie bufora Linuksa
Ustawienia legacy Linux (Circa 2009)
| 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 |
Aktualne ustawienia Linuksa (2025- 2026)
| 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 |
Aplikacja do konfiguracji Linuksa
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
Dostrajanie buforowe pierścienia NIC
# 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
- Pamięć przełączania: Każde połączenie może używać do rmem _ max + wmem _ max (256MB z zderzakami 128MB)
- Całkowity wpływ systemu: 1000 połączeń × 256MB = 256GB potencjalne wykorzystanie
- Bezpieczne oszacowanie: Maksymalne równoległe połączenia × 256MB nie powinny przekraczać 50% RAM systemu
- Przykład: Serwer 64GB powinien ograniczyć maksimum połączeń do ~ 125 równoczesnych połączeń o dużej przepustowości z buforami 128MB
- Zalecenie dla serwerów o pamięci RAM < 16GB: Zredukuj zderzaki do maksimum 16- 32MB i ustaw proporcjonalnie tcp _ mem
Dostrajanie bufora systemu Windows
Legacy Windows Settings (Circa 2009 - Windows Vista / 7 / Server 2008)
| 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 |
Aktualne ustawienia systemu Windows (Windows 10 / 11 / Server 2019- 2025)
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 |
Polecenia konfiguracji systemu Windows
# 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
Zaawansowane ustawienia bufora NIC (poprzez menedżera urządzeń lub 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
Rejestr Tweaks (Advanced - Użyj z ostrożnością)
# 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 Settings (Circa 2009 - Mac OS X 10.5 / 10.6)
| 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 |
Aktualne ustawienia MacOS (MacOS 12- 15 Monterey przez Sequoia)
| 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 |
Aplikacja do konfiguracji 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 <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.
Badanie i walidacja skuteczności działania
Narzędzia do testowania wydajności bufora
iperf3 - Badanie wydajności sieci
# 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 - Rozmiar 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'
Analiza wirererekina
Poszukaj tych wskaźników dotyczących kwestii związanych z buforem:
- Komunikaty TCP Zero Okno
- Pakiety aktualizacji okna TCP
- Okno TCP Pełne powiadomienia
- Wysokie wskaźniki retransmisji przy niskim RTT
Monitorowanie systemu
# 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
Obliczanie produktu opóźnionego (BDP)
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.
Zalecenia szczególne dotyczące obciążenia
| 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 |
Wspólne błędy i Pitfalls
Błędy do uniknięcia
- Nadmierne buforowanie: Nadmierne duże bufory mogą powodować bufferbloat, zwiększając opóźnienie
- Ignorowanie ograniczeń pamięci: Duże bufory mnożą się przez liczbę połączeń; serwer z 10,000 połączeń i 128MB buforów potrzebuje 1,25TB pamięci RAM
- Wyłączenie autostrojenia bez powodu: Modern OS auto- tuning jest zazwyczaj lepszy niż ustawienia statyczne
- Brak badań po zmianach: Zawsze potwierdzaj poprawę wydajności przy użyciu prawdziwych obciążeń roboczych
- Zapominanie buforów NIC: Wyczerpanie bufora pierścienia może wystąpić niezależnie od buforów gniazd
- Niespójne ustawienia: Klient i serwer powinni mieć kompatybilne konfiguracje bufora
- Ignorowanie kontroli zatorów: BBR i CUBIC są znacznie lepsze niż starsze algorytmy
Rozwiązywanie problemów
- Ustalić punkt odniesienia: Mierz bieżącą wydajność przy użyciu narzędzi iperf3 lub podobnych
- Przechwytywanie pakietów: Użyj tcpdump / Wirererequin do identyfikacji zachowania okna TCP
- Sprawdź statystyki systemowe: Szukaj kropli, wyczerpania bufora, retransmisji
- Oblicz BDP: Określić teoretycznie optymalne rozmiary bufora
- Zastosuj zmiany przyrostowe: Nie zmieniaj wszystkiego naraz.
- Badanie i walidacja: Pomiar rzeczywistej poprawy wyników
- Monitor w czasie: Upewnij się, że ustawienia pozostają optymalne przy różnych obciążeniach
Odniesienia i dalsze czytanie
- RFC 1323 - Rozszerzenia TCP dla wysokiej wydajności (skalowanie okien)
- RFC 2018 - Opcje selektywnego potwierdzenia TCP
- RFC 6928 - Zwiększenie początkowego okna TCP
- RFC 8312 - Algorytm kontroli zatorów CUBIC
- BBR Control (Google) - https: / / research ch.google / pubs / pub45646 /
- Dokumentacja jądra Linuksa - tworzenie sieci / ip- sysctl.txt
- Windows TCP / IP Performance Tuning Guide (Microsoft)
- ESnet Network Tuning Guide - https: / / fasterdata.es.net /
Wniosek
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:
- Nowoczesne systemy potrzebują znacznie większych buforów niż dotychczasowe konfiguracje (2009)
- Zawsze kalkuluj BDP dla określonych warunków sieciowych
- Użyj funkcji automatycznego strojenia systemu operacyjnego, gdy jest dostępna (Windows, nowoczesny Linux)
- Monitorowanie i testowanie w celu zatwierdzenia zmian
- Podczas strojenia należy uwzględnić specyficzne wymagania dotyczące obciążenia roboczego
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