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
- 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)
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 <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 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
- Ezarri oinarri-lerroa: Neurtu uneko errendimendua iperf3 edo antzeko tresnekin
- Kapturatu paketeak: Erabili tcpdump/Wireshark TCP leihoen portaera identifikatzeko
- Egiaztatu sistemaren estatistikak: Bilatu tantak, bufferraren nekea, itzulpenak
- Kalkulatu BDP: Zehaztu bufferraren tamaina teoriko optimoak
- Aplikatu gehikuntza-aldaketak: Ez aldatu dena batera.
- Probatu eta balioztatu: Neurtu benetako errendimendua
- 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