System Buffer Tuning - TCP and Network Performance Optimization

Sistema-bufferra sintonizatzen: "Sareko arazoen atzean ezkutatzen den Culprit"

Laburpen exekutiboa

Sareko ingeniariek sarritan aurkitzen dituzte TCPren leiho edo aplikazioen errendimendua sareko azpiegiturei egozten zaien egoerak. Paketeen kaptura, tcpdumps eta sareko analisia egin ondoren, benetako botila-lepoa aurkitu ohi da: NIC agortua (Network Interface Card) edo OS mailako bufferrak bezeroaren edo zerbitzari-sistemetan.

Artikulu honek ondare (2009 inguruan) eta uneko (2025-2026) buffer-konfigurazioak eskaintzen ditu Linux, Windows eta macOSentzat, baita diagnostiko-teknikak ere, bufferraren nekea identifikatzeko arazo larria izan aurretik.

Bufferraren itzaltzearen ohiko sintomak

  • TCP Zero Window gertaerak paketeen kapturan
  • Itzulpen-tasa altuak, sareko latentzia baxua izan arren
  • Aplikazioaren errendimendua banda zabalera erabilgarriaren azpitik nabarmen
  • Errendimenduaren degradazioa, karga jaistean hobetzen dena
  • Antzeko hardware-konfigurazioen bidez koherentziarik gabeko errendimendua.
  • Socket erroreak edo 'Resource aldi baterako ez dago erabilgarri' mezuak

Arazoa ulertzea

TCP leihoa eskalatzeko mekanismoa

TCPk fluxu-kontrolaren mekanismo bat erabiltzen du, non hartzaileak "leiho-tamaina" iragartzen duen, zenbat datu onartzen dituen adieraziz. Sistemaren bufferrak betetzen direnean, leiho hau zerorantz jaisten da, bidaltzaileak itxaron dezan. Sareko arazoa dirudi, baina ostalari-baliabideen arazoa da.

Bufferrak zer diren

  • Socket Buffers (SO SNDBUF/SO RCVBUF): Bidali eta jaso bufferrak
  • TCP leihoko bufferrak: TCP leihoen gehienezko tamaina konexioetarako
  • Sareko gailuen bufferrak: NIC ring bufferrak paketeen kontsultarako
  • Sistema osoko memoria: Memoria orokorra sarean esleituta

Komando diagnostikoak

Linux diagnostikoa

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

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

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

Legacy Linux Settings (Circa 2009)

Parametroa Ondarearen balioa (2009) Azalpena
net.core.rmem default 124928 (122KB) Onartutakoen bufferraren tamaina lehenetsia
net.core.rmem max 131071 (128KB) Jaso gehienezko bufferraren tamaina
net.core.wmem default 124928 (122KB) Bidali socket bufferraren tamaina lehenetsia
net.core.wmem max 131071 (128KB) Bidali socket bufferraren gehienezko tamaina
net.ipv4.tcp rmem 4096 87380 174760 TCPk bufferra jasotzen du: min, default, max (bytetan)
net.ipv4.tcp wmem 4096 16384 131072 TCPk bufferra bidaltzen du: min, default, max (bytetan)
net.ipv4.tcp mem 196608 262144 393216 TCP memoria orriak: baxua, presioa, altua
net.core.netdev max backlog 1000 Gehienezko paketeak sarrerako ilaran
net.core.optmem max 10240 (10KB) Bufferraren gehienezko tamaina socket bakoitzeko

Uneko Linux ezarpenak (2025-2026)

Parameter Uneko gomendatutako balioa 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 TCPk bufferra jasotzen du: min, default, max (128MB gehienez)
net.ipv4.tcp_wmem 4096 65536 134217728 TCPk bufferra bidaltzen du: min, default, max (128MB gehienez)
net.ipv4.tcp_mem 8388608 12582912 16777216 TCP memoria orriak: baxua, presioa, altua (64GB sistema)
net.core.netdev_max_backlog 250000 Gehienezko paketeak sarrerako ilaran (10GbE+)
net.core.optmem_max 65536 (64KB) Maximum ancillary buffer size per socket
net.ipv4.tcp congestion control bbr Erabili BBR kongestioaren kontrola (Googleren algoritmoa)
net.ipv4.tcp window scaling 1 Gaitu TCP leihoen eskalatzea (RFC 1323)
net.ipv4.tcp timestamps 1 Gaitu TCP ordu-zigiluak RTT estimatzeko
net.ipv4.tcp sack 1 Gaitu aitortza selektiboa
net.ipv4.tcp no metrics save 1 Desgaitu TCP metriken cachea

Linux konfiguratzeko aplikazioa

Gehitu ezarpen hauek /etc/sysctl.conf edo fitxategi berria sortu /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
Abisu kritikoa - Memoria-kontsumoa: Tcp mem balioak memoria-orrietan daude (normalean 4KB). Buffer-tamaina handiek memoria-presio larria eragin dezakete:
  • Konexio-memoria: Konexio bakoitzak rmem max + wmem max (256MB 128MBko bufferrekin) erabil dezake.
  • Sistemaren erabateko eragina: 1.000 konexio x 256MB = 256GB erabilera potentziala
  • Estimazio segurua: Konexio konkurrente maximoak × 256MB ez luke sistemaren RAMaren %50 gainditu behar
  • Adibidea: 64GBko zerbitzari batek konexio maximoak mugatu beharko lituzke ~125 konkurrente handiko konexioetara 128MB bufferrekin
  • <16GB RAM duten zerbitzarientzako gomendioa: Murriztu bufferrak 16-32MB gehienez eta egokitu tcp mem proportzionalki

Windows bufferra sintonizatzen

Leiho zaharren ezarpenak (Circa 2009 - Windows Vista/7/Server 2008)

Parameter Legacy Value (2009) Kokalekua
TcpWindowSize 65535 (64KB) Erregistroa: HKLM\System\CurrentControlSet\Services\Tcpip\Parametroak
Tcp1323Opts 0 (desgaituta) Leihoaren eskala desgaituta lehenespenez
Leiho lehenetsia 8192 (8KB) Jasotzeko leiho lehenetsia
Lehenetsitako leihoa 8192 (8KB) Bidaltzeko leiho lehenetsia
GlobalMaxTcpWindowSize 65535 (64KB) TCP leihoaren gehienezko tamaina
TcpNumConnections 16777214 TCP konexio maximoak

Uneko Windows ezarpenak (Windows 10/11/Server 2019-2025)

Leiho modernoek erabiltzen dute Jaso leihoa automatikoki elkartzea Ezaugarri horrek, dinamikoki doitzen denak, bufferrak jasotzen ditu sare-baldintzen arabera.

Eginbidea Gomendatutako ezarpenak Description
Elkartze maila automatikoa normala (edo oso esperimentala 10GbE+erako) Jaso leihoa doitzea
Jaso-Side Scaling (RSS) gaituta Banatu sareko prozesamendua PUZetan zehar
Chimney Offload automatikoa (edo desgaitu NIC modernoetan) TCP deskargatu hardware NIC-ra
NetDMA desgaituta Zuzeneko Memoria Sarbidea (zaharkitua)
TCP parametro orokorrak Komandoak behean Sistema osoko TCP ezarpenak
Congestion hornitzailea CUBIC (edo NewRenoko jaitsiera) TCP kongestio-kontrolaren algoritmoa

Windows konfiguratzeko komandoak

# 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

NIC-en bufferraren ezarpen aurreratuak (gailu-kudeatzailearen edo PowerShell-en bidez)

# 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

Erregistroko Tweaks (aurreratua - Kontuz erabili)

# 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)
Abisua: Windows modernoan (10/11/Server 2019+), saihestu eskuzko erregistro-aldaketak, ez bada automatikoki doitzeak arazoak sortzen baditu. Automatikoki sintonizatzen diren algoritmoak ezarpen estatikoak baino hobeak dira.

macOS bufferra sintonizatzen

MacOS Ezarpenak (Circa 2009 - Mac OS X 10.5/10.6)

Parameter Legacy Value (2009) Description
kern.ipc.maxsockbuf 262144 (256KB) Socket-aren bufferraren gehienezko tamaina
net.inet.tcp.sendspace 32768 (32KB) TCPren buffer lehenetsia
net.inet.tcp.recvspace 32768 (32KB) TCP lehenetsiaren bufferra
net.inet.tcp.autorcvbufmax 131072 (128KB) Automatikoki doitutako gehienezko bufferra
net.inet.tcp.autosndbufmax 131072 (128KB) Bidalitako gehienezko bufferra
net.inet.tcp.rfc1323 0 (disabled) TCP leihoa eskalatzea

MacOS-en uneko ezarpenak (macOS 12-15 Monterey-tik Sequoia-ra)

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 (gaituta) Gaitu TCP leihoa eskalatzea
net.inet.tcp.sack 1 (enabled) Enable Selective Acknowledgment
net.inet.tcp.msdflt 1440 TCPren gehienezko segmentuaren tamaina lehenetsia
net.inet.tcp.delayed ack 3 Atzeratutako ACK portaera

macOS konfigurazio-aplikazioa

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

Ezarpen iraunkorretarako daemon-a sortzea

# 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
Abisua: macOS Ventura (13) eta gero Sistema Osotasunaren Babesa (SIP) murriztapenak ditu. Nukleoaren parametro batzuk ezin dira aldatu sudoarekin ere. Proba-ezarpenak ingurune jakin batean.

Errendimendu-probak eta balidazioa

Tresnak bufferraren errendimendua probatzeko

iperf3 - Sareko errendimenduaren probak

# 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 - Kapturatu TCP leihoen tamainak

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

Bilatu bufferreko arazoen adierazle hauek:

  • TCP Zero Window mezuak
  • TCP Window Update paketeak
  • TCP Window jakinarazpen guztiak
  • Erretransmisio-tasa altuak RTT baxuarekin

Sistemaren monitorizazioa

# 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

Bandwidth-Delay Produktua (BDP) Kalkulua

Sarearen bufferraren tamaina optimoa zehazteko, kalkulatu Bandwidth-Delay Produktua:

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.

Lan-kargarako gomendio espezifikoak

Lan-karga mota Gomendatutako bufferraren tamaina Gakoaren parametroak
Web zerbitzaria (latentzia baxua) 4-16 MB Jaitsi bufferrak, konexio gehiago, erantzun azkarra
Datu-basearen zerbitzaria 16-32 MB Buffer moderatuak, irteera koherentea
Fitxategi-transferentzia / babeskopia 64-128 MB Gehienezko bufferrak, irteera handiko lehentasuna
Bideo-korrontea 32-64 MB buffer handiak, entrega-tasa konstantea
HPC / Datuen Zentroa 128-256 MB Gehienezko bufferrak, kongestioaren kontrol espezializatua
Haririk gabekoa / mugikorra 2-8 MB Buffer kontserbadoreak, latentzien kudeaketa aldakorra

Akats eta hutsegite arruntak

Saihestu beharreko akatsak

  • Gehiegikeria: Buffer handi gehiegik Buffer-bloat eragin dezakete, latentzia handituz
  • Memoriaren murriztapenei ezikusi egiten: Buffer handiak konexio-kopuruaren arabera ugaltzen dira; 10.000 konexio eta 128 MB buffer dituen zerbitzariak 1,25TB RAM behar du
  • Auto-jotzea arrazoirik gabe desaktibatzea: OS sistema automatikoa ezarpen estatikoak baino hobea izan ohi da
  • Ez da probarik egin aldaketen ondoren: Beti balioztatu errendimenduaren hobekuntzak lan-karga errealekin
  • NICeko bufferrak ahaztuz: Eraztunaren bufferraren ihesa gerta daiteke socket bufferretatik independenteki
  • Inkoherentearen ezarpenak: Bezeroak eta zerbitzariak buffer-konfigurazio bateragarriak izan beharko lituzkete.
  • Ezikusi egiten kongestioaren kontrolari: BBR eta CUBIC algoritmo zaharrak baino askoz hobeak dira.

Arazoak laneko fluxua konpontzeko

  1. Ezarri oinarri-lerroa: Neurtu uneko errendimendua iperf3 edo antzeko tresnekin
  2. Kapturatu paketeak: Erabili tcpdump/Wireshark TCP leihoen portaera identifikatzeko
  3. Egiaztatu sistemaren estatistikak: Bilatu tantak, bufferraren nekea, itzulpenak
  4. Kalkulatu BDP: Zehaztu bufferraren tamaina teoriko optimoak
  5. Aplikatu gehikuntza-aldaketak: Ez aldatu dena batera.
  6. Probatu eta balioztatu: Neurtu benetako errendimendua
  7. Monitorea denboran zehar: Ziurtatu ezarpenak optimoak izaten jarraitzen dutela karga desberdinetan

Erreferentziak eta irakurketa gehiago

  • RFC 1323 - TCP hedapenak Errendimendu Handian (Leihoa eskalatzea)
  • RFC 2018 - TCP Selective Recognition Options
  • RFC 6928 - TCPren hasierako leihoa handituz
  • RFC 8312 - CUBIC Congestion Control Algorithm
  • BBR Congestion Control (Google) - https://research.google/pubs/pub45646/
  • Linux Kernel Dokumentazioa - networking/ip-sysctl.txt
  • Windows TCP/IP Performance Tuning Guide (Microsoft)
  • ESnet Network Tuning Guide - https://fasterdata.es/

Ondorioa

Bufferraren nekea sareko arazoen erro-kausa da. 2009ko 128KB-tik 128MB-ra bitarteko bufferraren bilakaera ulertuz, sareko ingeniariek berehala identifikatu eta ebatzi ditzakete arazo horiek.

Gako-iruzkinak:

  • Sistema modernoek ondareak baino buffer handiagoak behar dituzte (2009) konfigurazioak
  • Kalkulatu beti BDP sare-baldintza jakinetarako
  • Erabili OS automatikoki doitzeko ezaugarriak erabilgarri daudenean (Windows, Linux modernoa)
  • Monitorea eta proba aldaketak balioztatzeko
  • Kontuan izan lan kargaren baldintza espezifikoak doikuntza egitean

Gogoratu: paketeen analisiak TCP zero leihoak erakusteko "sare-arazoa" ostalari-sistemaren baliabideen arazoa da. Bufferraren doikuntza egokiarekin, diagnostiko faltsu horiek ezabatu eta errendimendu optimoa lor dezakezu.


Azken eguneraketa: otsailak 2, 2026

Egilea: Baud9600 Talde teknikoa