linux network driver buffers

Lors du précédent épisode, j'ai présenté comment décharger le processeur, d'une partie de la gestion réseau, avec le TOE ou TCP Offload. Passons à présent aux optimisations du driver réseau Linux, en particulier des paramètres RX et TX.

Le protocole TCP a été élaboré, il y a longtemps. A cette époque, les communications étaient peu fiables, lentes. Cette époque est bien révolue, mais, TCP perdure. Le principe de fonctionnement de TCP, veut que chaque paquet envoyé sur le réseau, soit acquitté par le récepteur.

Principe de fonctionnement du protocole TCP

TCP/IP utilise le principe suivant, une requête est envoyé au serveur :

TCP-IP SYN

Le serveur accuse réception du SYN :

TCPIP SYN+ACK

Le client acquite réception avec un ACK (en TCPIP ACK pour Acknowledge) :

TCP/IP ACK

Quand l'Internet était lent (à l'origine), le serveur envoyait l'ensemble de ses paquets de données, puis, le client acquittait, l'ensemble avec des ACK qui arrivaient tranquillement.

Mais, avec la vitesse actuelle des connexions, les ACK arrivent en rafale à un train d'enfer, le serveur "perd" du temps, a traiter tout les ACK !

Receive Window, Transmit Window

La solution, est d'augmenter la taille des buffers d'entrée et de sortie au niveau du driver réseau. Ces buffers spécifiques, sont connus sous le nom de fenêtres TCP/IP. Le système ne traitera les données reçues que lorsque la fenêtre TCPIP est pleine.

Ethtool va encore nous servir. Avec le flag -g, nous allons connaitre les settings par défaut réglés au niveau du driver, ainsi que la taille maximum des RWIN, Receive Windows et TWIN, Transmit Windows :

ethtool -g eth0
Ring parameters for eth0:
Pre-set maximums:
RX:             4096
RX Mini:        0
RX Jumbo:       0
TX:             4096
Current hardware settings:
RX:             256
RX Mini:        0
RX Jumbo:       0
TX:             256

Comme l'indique wikipedia, le throughput ou débit du réseau est maximisé par l'augmentation de la Recieve Windows :  \mathrm{Throughput} \le \frac {\mathrm{RWIN}} {\mathrm{RTT}} \,\!

Je vais pouvoir définir de façon définitive, l'ensemble des réglages dans le fichier : /etc/modprobe.conf

alias eth0 e1000
options e1000 RxDescriptors=4096,4096 TxDescriptors=4096,4096

Nous avons vu les 2 premiers points. Avant de mettre l'ensemble en oeuvre, je décrirai dans le prochain épisode les optimisations au niveau du noyau Linux.

  • optimisation hardware avec le TOE, épisode 1
  • optimisation des buffers de carte réseau au niveau driver, cet épisode
  • optimisation des buffers systèmes de l'OS au niveau de la pile IP, épisode 3
  • .