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
- 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)
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 <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 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
- Établir le niveau de référence : Mesurer les performances actuelles avec iperf3 ou des outils similaires
- Capturer les paquets & #160;: Utilisez tcpdump/Wireshark pour identifier le comportement de la fenêtre TCP
- Statistiques du système de contrôle: Rechercher les gouttes, l'épuisement du tampon, les retransmissions
- Calculer BDP: Déterminer théoriquement les tailles optimales du tampon
- Appliquer des modifications progressives & #160;: Ne changez pas tout à la fois.
- Tester et valider: Mesurer l ' amélioration des résultats
- 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