System Buffer Tuning - TCP and Network Performance Optimization

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

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

Diagnostic 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

Réglage du tampon Linux

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

Paramètre Valeur héritée (2009) Description
net.core.rmem_default 124928 (122 Ko) Taille du tampon de socket de réception par défaut
net.core.rmem_max 131071 (128 Ko) Taille maximale du tampon de socket de réception
net.core.wmem_default 124928 (122 Ko) Taille du tampon de socket d'envoi par défaut
net.core.wmem_max 131071 (128 Ko) Taille maximale du tampon de socket d'envoi
net.ipv4.tcp_rmem 4096 87380 174760 Tampon de réception TCP : min, par défaut, max (en octets)
net.ipv4.tcp_wmem 4096 16384 131072 Tampon d'envoi TCP : min, par défaut, max (en octets)
net.ipv4.tcp_mem 196608 262144 393216 Pages mémoire TCP : faible, pression, élevée
net.core.netdev_max_backlog 1000 Nombre maximum de paquets dans la file d'attente d'entrée
net.core.optmem_max 10240 (10 Ko) Taille maximale du tampon auxiliaire par socket

Paramètres Linux actuels (2025-2026)

Paramètre Valeur recommandée actuelle Description
net.core.rmem_default 16777216 (16 Mo) Taille du tampon de socket de réception par défaut
net.core.rmem_max 134217728 (128 Mo) Taille maximale du tampon de socket de réception
net.core.wmem_default 16777216 (16 Mo) Taille du tampon de socket d'envoi par défaut
net.core.wmem_max 134217728 (128 Mo) Taille maximale du tampon de socket d'envoi
net.ipv4.tcp_rmem 4096 87380 134217728 Tampon de réception TCP : min, par défaut, max (128 Mo maximum)
net.ipv4.tcp_wmem 4096 65536 134217728 Tampon d'envoi TCP : min, par défaut, max (128 Mo max)
net.ipv4.tcp_mem 8388608 12582912 16777216 Pages de mémoire TCP : faible, pression, élevée (système de 64 Go)
net.core.netdev_max_backlog 250000 Nombre maximum de paquets dans la file d'attente d'entrée (10GbE+)
net.core.optmem_max 65536 (64 Ko) Taille maximale du tampon auxiliaire par socket
net.ipv4.tcp_congestion_control bbr Utiliser le contrôle de congestion BBR (algorithme de Google)
net.ipv4.tcp_window_scaling 1 Activer la mise à l'échelle de la fenêtre TCP (RFC 1323)
net.ipv4.tcp_timestamps 1 Activer les horodatages TCP pour une meilleure estimation RTT
net.ipv4.tcp_sack 1 Activer l'accusé de réception sélectif
net.ipv4.tcp_no_metrics_save 1 Désactiver la mise en cache des métriques TCP

Application de configuration Linux

Ajoutez ces paramètres à/etc/sysctl.confou créez 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

Réglage du tampon en anneau de la carte réseau

# 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 se trouvent dans des pages mémoire (généralement 4 Ko). Les grandes tailles de mémoire tampon peuvent entraîner une grave pression sur la mémoire :
  • Mémoire par connexion :Chaque connexion peut utiliser jusqu'à rmem_max + wmem_max (256 Mo avec 128 Mo de tampon)
  • Impact total sur le système :1 000 connexions × 256 Mo = 256 Go d'utilisation potentielle
  • Estimation sûre :Le nombre maximal de connexions simultanées × 256 Mo ne doit pas dépasser 50 % de la RAM du système
  • Exemple:Un serveur de 64 Go doit limiter le nombre maximum de connexions à environ 125 connexions simultanées à haut débit avec des tampons de 128 Mo.
  • Recommandation pour les serveurs avec <16 Go de RAM :Réduisez les tampons à 16-32 Mo maximum et ajustez tcp_mem proportionnellement

Réglage du tampon Windows

Paramètres Windows hérités (vers 2009 - Windows Vista/7/Server 2008)

Paramètre Valeur héritée (2009) Emplacement
TcpWindowSize 65535 (64 Ko) Registre : HKLM\System\CurrentControlSet\Services\Tcpip\Parameters
Tcp1323Opts 0 (désactivé) Mise à l'échelle de la fenêtre désactivée par défaut
Fenêtre de réception par défaut 8192 (8 Ko) Fenêtre de réception par défaut
Fenêtre d'envoi par défaut 8192 (8 Ko) Fenêtre d'envoi par défaut
GlobalMaxTcpWindowSize 65535 (64 Ko) Taille maximale de la fenêtre TCP
TcpNumConnections 16777214 Nombre maximal de connexions TCP

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

Windows moderne utilise leRéglage automatique de la fenêtre de réceptionfonctionnalité, qui ajuste dynamiquement les tampons de réception en fonction des conditions du réseau.

Fonctionnalité Paramètre recommandé actuel Description
Niveau de réglage automatique normal (ou hautement expérimental pour 10GbE+) Ajustement dynamique de la fenêtre de réception
Mise à l'échelle côté réception (RSS) activé Répartir le traitement réseau entre les processeurs
Déchargement de la cheminée automatique (ou désactivé sur les cartes réseau modernes) Déchargement TCP vers le matériel NIC
NetDMA désactivé Accès direct à la mémoire (obsolète)
Paramètres globaux TCP Voir les commandes ci-dessous Paramètres TCP à l'échelle du système
Fournisseur de congestion CUBIC (ou solution de secours NewReno) Algorithme de contrôle de congestion TCP

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

Ajustements du registre (avancé – à utiliser 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:Sous Windows moderne (10/11/Server 2019+), évitez les modifications manuelles du registre, sauf si le réglage automatique pose des problèmes. Les algorithmes de réglage automatique sont généralement supérieurs aux paramètres statiques.

Réglage du tampon macOS

Paramètres macOS hérités (vers 2009 - Mac OS X 10.5/10.6)

Paramètre Valeur héritée (2009) Description
kern.ipc.maxsockbuf 262144 (256 Ko) Taille maximale du tampon de socket
net.inet.tcp.sendspace 32768 (32 Ko) Tampon d'envoi TCP par défaut
net.inet.tcp.recvspace 32768 (32 Ko) Tampon de réception TCP par défaut
net.inet.tcp.autorcvbufmax 131072 (128 Ko) Tampon de réception maximum réglé automatiquement
net.inet.tcp.autosndbufmax 131072 (128 Ko) Tampon d'envoi maximal réglé automatiquement
net.inet.tcp.rfc1323 0 (désactivé) Mise à l'échelle de la fenêtre TCP

Paramètres macOS actuels (macOS 12-15 Monterey via Sequoia)

Paramètre Valeur recommandée actuelle Description
kern.ipc.maxsockbuf 8388608 (8 Mo) Taille maximale du tampon de socket
net.inet.tcp.sendspace 131072 (128 Ko) Tampon d'envoi TCP par défaut
net.inet.tcp.recvspace 131072 (128 Ko) Tampon de réception TCP par défaut
net.inet.tcp.autorcvbufmax 16777216 (16 Mo) Tampon de réception maximum réglé automatiquement
net.inet.tcp.autosndbufmax 16777216 (16 Mo) Tampon d'envoi maximal réglé automatiquement
net.inet.tcp.rfc1323 1 (activé) Activer la mise à l'échelle de la fenêtre TCP
net.inet.tcp.sack 1 (activé) Activer l'accusé de réception sélectif
net.inet.tcp.mssdflt 1440 Taille maximale du segment TCP par défaut
net.inet.tcp.delayed_ack 3 Comportement 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 <<EOF
kern.ipc.maxsockbuf=8388608
net.inet.tcp.sendspace=131072
net.inet.tcp.recvspace=131072
net.inet.tcp.autorcvbufmax=16777216
net.inet.tcp.autosndbufmax=16777216
net.inet.tcp.rfc1323=1
net.inet.tcp.sack=1
net.inet.tcp.mssdflt=1440
net.inet.tcp.delayed_ack=3
EOF

# Note: On recent macOS versions, /etc/sysctl.conf may not be read automatically
# Use a LaunchDaemon to apply settings at boot

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 <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.local.sysctl</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/sbin/sysctl</string>
        <string>-w</string>
        <string>kern.ipc.maxsockbuf=8388608</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>
EOF

sudo chmod 644 /Library/LaunchDaemons/com.local.sysctl.plist
sudo launchctl load /Library/LaunchDaemons/com.local.sysctl.plist
Avertissement:macOS Ventura (13) et versions ultérieures sont soumis à des restrictions SIP (System Integrity Protection). Certains paramètres du noyau peuvent ne pas être modifiables même avec sudo. Testez les paramètres dans votre environnement spécifique.

Tests de performances et validation

Outils pour tester les performances du tampon

iperf3 - Tests de performances 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 Wireshark

Recherchez ces indicateurs de problèmes de tampon :

  • Messages de la fenêtre TCP zéro
  • Paquets de mise à jour de la fenêtre TCP
  • Notifications complètes de la fenêtre TCP
  • Taux de retransmission élevés avec un faible RTT

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 du produit bande passante-délai (BDP)

Pour déterminer les tailles de tampon optimales pour votre réseau, calculez le produit bande passante-délai :

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 à la charge de travail

Type de charge de travail Taille de tampon recommandée Paramètres clés
Serveur Web (faible latence) 4-16 Mo Tampons inférieurs, 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 Tampons maximaux, priorité de débit élevée
Diffusion vidéo 32-64 Mo Grands tampons, débit de livraison constant
HPC/Centre de données 128-256 Mo Tampons maximaux, contrôle de congestion spécialisé
Sans fil/Mobile 2-8 Mo Tampons conservateurs, gestion de la latence variable

Erreurs et pièges courants

Erreurs à éviter

  • Sur-buffering :Des tampons trop grands peuvent provoquer un bufferbloat, augmentant ainsi 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 tampon a besoin de 1,25 To de RAM
  • Désactivation du réglage automatique sans raison :Le réglage automatique du système d'exploitation moderne est généralement meilleur que les paramètres statiques
  • Pas de test après les modifications :Validez toujours les améliorations de performances avec des charges de travail réelles
  • Oublier les tampons NIC :L'épuisement du tampon en anneau peut se produire indépendamment des tampons de socket
  • Paramètres incohérents :Le client et le serveur doivent avoir des configurations de tampon compatibles
  • Ignorer le contrôle de la congestion :BBR et CUBIC sont nettement meilleurs que les anciens algorithmes

Flux de travail de dépannage

  1. Établir une référence :Mesurez les performances actuelles avec iperf3 ou des outils similaires
  2. Capturer des paquets :Utilisez tcpdump/Wireshark pour identifier le comportement de la fenêtre TCP
  3. Vérifiez les statistiques du système :Recherchez les baisses, l'épuisement du tampon, les retransmissions
  4. Calculer le BDP :Déterminer les tailles de tampon théoriquement optimales
  5. Appliquer des modifications incrémentielles :Ne change pas tout d'un coup
  6. Testez et validez :Mesurer l’amélioration réelle des performances
  7. Surveiller dans le temps :Assurez-vous que les paramètres restent optimaux sous différentes charges

Références et lectures complémentaires

  • RFC 1323 - Extensions TCP pour hautes performances (mise à l'échelle des fenêtres)
  • RFC 2018 - Options d'accusé de réception sélectif TCP
  • RFC 6928 - Augmentation de la fenêtre initiale de TCP
  • RFC 8312 – Algorithme de contrôle de congestion CUBIC
  • Contrôle de la congestion BBR (Google) - https://research.google/pubs/pub45646/
  • Documentation du noyau Linux - networking/ip-sysctl.txt
  • Guide de réglage des performances Windows TCP/IP (Microsoft)
  • Guide de réglage du réseau ESnet - https://fasterdata.es.net/

Conclusion

L’épuisement de la mémoire tampon est une cause courante de problèmes de performances qui semblent liés au réseau. En comprenant l'évolution de la taille des tampons depuis les limites de 128 Ko de 2009 jusqu'aux capacités actuelles de 128 Mo, les ingénieurs réseau peuvent rapidement identifier et résoudre ces problèmes.

Points clés à retenir :

  • Les systèmes modernes nécessitent des tampons beaucoup plus grands que les configurations existantes (2009).
  • Calculez toujours le BDP pour les conditions spécifiques de votre réseau
  • Utiliser les fonctionnalités de réglage automatique du système d'exploitation lorsqu'elles sont disponibles (Windows, Linux moderne)
  • Surveiller et tester pour valider les modifications
  • Tenir compte des exigences spécifiques à la charge de travail lors du réglage

N'oubliez pas : un "problème de réseau" révélé par l'analyse des paquets pour afficher des fenêtres TCP nulles est en fait un problème de ressources du système hôte. Avec un réglage approprié de la mémoire tampon, vous pouvez éliminer ces faux diagnostics et obtenir des performances optimales.


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

Auteur : Équipe technique Baud9600