System Buffer Tuning - TCP and Network Performance Optimization

Tuning de tampons système: le culprit caché derrière "problèmes de réseau"

Résumé

Les ingénieurs du réseau rencontrent fréquemment des situations où la performance de la fenêtre ou de l'application TCP est imputée à l'infrastructure du réseau. Après avoir effectué de vastes captures de paquets, des tcprumps et une analyse de réseau, le vrai goulot d'étranglement est souvent découvert: NIC épuisé (Network Interface Card) ou tampons de niveau OS sur les systèmes client ou serveur.

Cet article fournit à la fois l'héritage (vers 2009) et les configurations de tampons actuelles (2025-2026) pour Linux, Windows et macOS, ainsi que des techniques de diagnostic pour identifier l'épuisement du tampon avant qu'il ne devienne un problème critique.

Symptômes fréquents d'échappement des tampons

  • TCP Zero Window événements dans les captures de paquets
  • Taux de retransmission élevés malgré une faible latence du réseau
  • Débit d'application nettement inférieur à la bande passante disponible
  • Dégradation des performances sous charge qui s'améliore lorsque la charge diminue
  • Performances incohérentes dans des configurations matérielles similaires
  • Erreurs de socket ou messages "Resource temporairement indisponibles"

Comprendre le problème

Le mécanisme d'élargissement de la fenêtre TCP

TCP utilise un mécanisme de contrôle de flux où le récepteur annonce une « taille de fenêtre » indiquant la quantité de données qu'il peut accepter. Lorsque les tampons système se remplissent, cette fenêtre se rétrécit à zéro, forçant l'expéditeur à attendre. Cela apparaît comme un problème de réseau, mais est en fait un problème de ressource hôte.

Où les tampons comptent

  • Les tampons à chaussettes (SO SNDBUF/SO RCVBUF): Envoyer et recevoir des tampons par poche
  • Buffers de fenêtre TCP : Taille maximale de fenêtre TCP pour les connexions
  • Buffers pour périphériques réseau : tampons NIC pour la file d'attente des paquets
  • Mémoire à l'échelle du système : Mémoire globale allouée au réseautage

Commandes diagnostiques

Diagnostics Linux

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

Diagnostics 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"

diagnostics macOS

# 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

Tuning de tampon Linux

Paramètres Linux hérités (Circa 2009)

Paramètres Valeur historique (2009) Désignation des marchandises
net.core.rmem default 124928 (122 Ko) Taille du tampon de réception par défaut
N.R.M.S.M. 131071 (128Ko) Taille maximale du tampon de la prise de réception
net.core.wmem default 124928 (122KB) Taille du tampon d'envoi par défaut
net.core.wmem max 131071 (128KB) Taille maximale du tampon d'envoi
Net.ipv4.tcp rmem 4096 87380 174760 TCP recevoir le tampon : min, par défaut, max (en octets)
Net.ipv4.tcp wmem 4096 16384 131072 TCP envoie le tampon : min, par défaut, max (en octets)
Net.ipv4.tcp mem 196608 262144 393216 Pages de mémoire TCP : basse, pression, haute
net.core.netdev max backlog 1 000 Nombre maximal de paquets en attente d'entrée
Le nombre d'heures de travail est le plus élevé. 10240 (10Ko) Taille maximale du tampon auxiliaire par socket

Paramètres Linux actuels (2025-2026)

Parameter Valeur actuelle recommandée Description
net.core.rmem_default 16777216 (16MB) Default receive socket buffer size
net.core.rmem_max 134217728 (128Mo) 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 recevoir le tampon: min, par défaut, max (128 Mo max)
net.ipv4.tcp_wmem 4096 65536 134217728 TCP envoie le tampon : min, par défaut, max (128 Mo max)
net.ipv4.tcp_mem 8388608 12582912 16777216 Pages de mémoire TCP : basse, pression, haute (système 64GB)
net.core.netdev_max_backlog 250000 Nombre maximal de paquets en file d'attente (10GbE+)
net.core.optmem_max 65536 (64Ko) Maximum ancillary buffer size per socket
net.ipv4.tcp congestion control bbr Utiliser le contrôle de congestion BBR (algorithme de Google)
net.ipv4.tcp window scaling 1 Activer l'échelle de fenêtre TCP (RFC 1323)
net.ipv4.tcp timestamps 1 Activer les timestamps TCP pour une meilleure estimation RTT
Net.ipv4.tcp sack 1 Activer la reconnaissance sélective
net.ipv4.tcp no metrics save 1 Désactiver la mise en cache des mesures TCP

Application de configuration Linux

Ajouter ces paramètres à /etc/sysctl.conf ou créer un nouveau fichier /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

Tuning de tampons 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
Avertissement critique - Consommation de mémoire : Les valeurs tcp mem sont dans les pages de mémoire (généralement 4KB). De grandes tailles de tampon peuvent causer une pression mémoire sévère:
  • Mémoire par connexion: Chaque connexion peut utiliser jusqu'à rmem max + wmem max (256 Mo avec tampons 128 Mo)
  • Impact total du système: 1 000 connexions × 256 Mo = utilisation potentielle de 256 Go
  • Estimation sûre: Les connexions simultanées maximales × 256 Mo ne doivent pas dépasser 50 % de la mémoire vive du système
  • Exemple : Un serveur 64 Go devrait limiter les connexions max à ~125 connexions simultanées à haut débit avec tampons 128 Mo
  • Recommandation pour les serveurs avec une RAM <16GB: Réduire les tampons à 16-32 Mo max et ajuster tcp mem proportionnellement

Tuning de tampon Windows

Paramètres de Windows (Circa 2009 - Windows Vista/7/Server 2008)

Parameter Legacy Value (2009) Lieu
TcpWindowSize 65535 (64Ko) Registre: HKLM\System\CurrentControlSet\Services\Tcpip\Paramètres
Tcp1323Opts 0 (désactivé) Échelle de fenêtre désactivée par défaut
ReceiveWindow par défaut 8192 (8Ko) Fenêtre de réception par défaut
Envoi par défautWindow 8192 (8KB) Fenêtre d'envoi par défaut
GlobalMaxTcpWindowSize 65535 (64KB) Taille maximale de la fenêtre TCP
Connexions TcpNum 16777214 Connexions TCP maximales

Paramètres actuels de Windows (Windows 10/11/Server 2019-2025)

Windows moderne utilise le Receive Fenêtre Auto-Tuning caractéristique, qui s'ajuste dynamiquement recevoir des tampons en fonction des conditions du réseau.

Fonctionnalité Réglage actuel recommandé Description
Niveau de tuning automatique normale (ou très expérimentale pour 10GbE+) Réglage dynamique des fenêtres de réception
Étalonnage du côté de réception (RSS) activé Distribuer le traitement réseau entre les processeurs
Chimney Décharge automatique (ou désactivé sur les NIC modernes) Décharge TCP vers le matériel NIC
DMA net handicapés Accès direct à la mémoire (déprécié)
Paramètres mondiaux TCP Voir les commandes ci-dessous Paramètres TCP à l ' échelle du système
Fournisseur de congestion CUBIC (ou recul de NewReno) Algorithme de contrôle de la congestion TCP

Commandes de configuration de 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

Paramètres avancés du tampon NIC (via le gestionnaire de périphériques ou 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

Typologie du registre (Advanced - Utilisation avec prudence)

# 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)
Avertissement : Sur Windows moderne (10/11/Server 2019+), évitez les modifications manuelles du registre à moins que le réglage automatique ne cause des problèmes. Les algorithmes de réglage automatique sont généralement supérieurs aux paramètres statiques.

accord de tampon macOS

Paramètres macOS (Circa 2009 - Mac OS X 10.5/10.6)

Parameter Legacy Value (2009) Description
kern.ipc.maxsockbuf 262144 (256 Ko) Taille maximale du tampon de prise
Net.inet.tcp.sendspace 32768 (32Ko) Par défaut TCP envoie le tampon
l'espace net.inet.tcp.recvspace 32768 (32KB) Par défaut, TCP reçoit le tampon
Le nombre d'heures de travail est égal à celui des heures de travail. 131072 (128Ko) Maximum auto-tuné recevoir tampon
Le taux d'utilisation de l'eau de mer dans le secteur de l'alimentation humaine est de 5 %. 131072 (128KB) tampon d'envoi automatique maximal
Pour le calcul de la valeur de référence, voir le tableau 1. 0 (disabled) Échelle de la fenêtre TCP

Paramètres macOS actuels (macOS 12-15 Monterey par 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 (activé) Activer l'échelle des fenêtres TCP
Sack net.inet.tcp. 1 (enabled) Enable Selective Acknowledgment
C'est la raison pour laquelle il n'y a pas d'écart entre les taux de change et les taux de change. 1440 Taille maximale du segment par défaut TCP
net.inet.tcp.relayed ack 3 Comportement d'ACK retardé

application de configuration 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 <

Création d'un LaunchDaemon pour les paramètres persistants

# 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
Avertissement : macOS Ventura (13) et plus tard ont des restrictions de protection de l'intégrité du système (SIP). Certains paramètres du noyau peuvent ne pas être modifiables même avec sudo. Testez les paramètres dans votre environnement spécifique.

Essais de performance et validation

Outils pour tester la performance du tampon

iperf3 - Essai de performance du réseau

# 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 - Capturer les tailles de fenêtre 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'

Analyse de Wireshark

Recherchez ces indicateurs de problèmes tampons :

  • Messages de la fenêtre zéro TCP
  • Mise à jour des paquets de fenêtres TCP
  • Fenêtre TCP Notifications complètes
  • Taux de retransmission élevés avec faible TLR

Surveillance du système

# 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

Calcul de la largeur de bande du produit relais (BDP)

Pour déterminer les tailles de tampon optimales pour votre réseau, calculez le produit 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.

Recommandations spécifiques concernant la charge de travail

Type de charge Taille recommandée du tampon Paramètres clés
Serveur Web (faible latence) 4-16 Mo Moins de tampons, plus de connexions, réponse rapide
Serveur de base de données 16-32 Mo tampons modérés, débit constant
Transfert de fichiers / Sauvegarde 64 à 128 Mo Des tampons maximums, une priorité de débit élevée
Diffusion vidéo 32-64 MB Grands tampons, taux de livraison uniforme
HPC / Centre de données 128-256 Mo Des tampons maximaux, un contrôle spécialisé de la congestion
Sans fil / Mobile 2-8 Mo tampons conservateurs, manipulation variable de latence

Erreurs et pièges courants

Erreurs à éviter

  • Suralimentation: Des tampons trop grands peuvent provoquer des ballonnements tampons, augmentant la latence
  • Ignorer les contraintes de mémoire: Les grands tampons se multiplient par le nombre de connexions; un serveur avec 10 000 connexions et 128 Mo de tampons a besoin de 1,25 To de RAM
  • Désactivation du réglage automatique sans raison: Modern OS auto-tuning est généralement mieux que les paramètres statiques
  • Non testé après les modifications: Toujours valider les améliorations de performance avec des charges de travail réelles
  • Oublier les tampons NIC : L'épuisement du tampon d'anneau peut survenir indépendamment des tampons de socket
  • Paramètres incompatibles: Le client et le serveur doivent avoir des configurations tampons compatibles
  • Ignorer le contrôle de la congestion: BBR et CUBIC sont significativement mieux que les algorithmes plus anciens

Dépannage du flux de travail

  1. Établir le niveau de référence : Mesurer les performances actuelles avec iperf3 ou des outils similaires
  2. Capturer les paquets & #160;: Utilisez tcpdump/Wireshark pour identifier le comportement de la fenêtre TCP
  3. Statistiques du système de contrôle: Rechercher les gouttes, l'épuisement du tampon, les retransmissions
  4. Calculer BDP: Déterminer théoriquement les tailles optimales du tampon
  5. Appliquer des modifications progressives & #160;: Ne changez pas tout à la fois.
  6. Tester et valider: Mesurer l ' amélioration des résultats
  7. Surveiller avec le temps : Veiller à ce que les réglages restent optimaux sous différentes charges

Références et lectures complémentaires

  • RFC 1323 - Extensions TCP pour haute performance
  • RFC 2018 - Options de reconnaissance sélective TCP
  • RFC 6928 - Augmentation de la fenêtre initiale de TCP
  • RFC 8312 - Algorithme CUBIC de contrôle de la congestion
  • BBR Contrôle de la congestion (Google) - https://research.google/pubs/pub45646/
  • Documentation sur le noyau Linux - networking/ip-sysctl.txt
  • Guide d'analyse des performances de Windows TCP/IP (Microsoft)
  • ESnet Network Tuning Guide - https://fasterdata.es.net/

Conclusion

L'épuisement des tampons est une cause principale de problèmes de performance qui semblent être liés au réseau. En comprenant l'évolution du calibrage du tampon des limites de 128 Ko de 2009 aux capacités de 128 Mo d'aujourd'hui, les ingénieurs réseau peuvent rapidement identifier et résoudre ces problèmes.

À emporter :

  • Les systèmes modernes ont besoin de tampons beaucoup plus grands que les configurations anciennes (2009)
  • Calculez toujours BDP pour vos conditions réseau spécifiques
  • Utiliser les fonctions de réglage automatique du système d'exploitation lorsque disponible (Windows, Linux moderne)
  • Surveiller et tester pour valider les changements
  • Considérer les besoins spécifiques à la charge de travail lors de l'ajustement

Rappelez-vous : Un "problème réseau" révélé par l'analyse de paquets pour montrer TCP 0 windows est en fait un problème de ressources système hôte. Avec un réglage tampon approprié, vous pouvez éliminer ces faux diagnostics et atteindre des performances optimales.


Dernière mise à jour: février 2, 2026

Auteur: Baud9600 Équipe technique