petite précision sur le vocabulaire pour éviter les confusions:
TOE - TCP Offload Engine
et
TSO - TCP Segmentation Offload
ne sont pas du tout la meme chose. Cette discussion a pour titre "TCP offload engine - Segmentation réalisée par la carte réseau" mais parle de TSO.
Souvent on mélance les 2 notions, il ne faudrait pas...
TOE n'est pas supporté sur Linux et n'est pas globalement accepté comme une bonne technique. Le principe de TOE est que la carte sous traite bien plus de choses, notamment l'ouverture des connections, l'envoi des ack ou la fermeture des connections. TSO est une sous partie de TOE d'ou souvent la confusion de langage.
Voir le wikipedia de TOE pour plus d'info:
https://en.wikipedia.org/wiki/TCP_offload_engineQuelques définitions sur les autre options 'offload'(-k) de ethtool:
rx-checksumming: laisse le soin a la carte de vérifier la checksum. rejete le packet si pas la somme est pas bonne. le cpu n’est pas derangé pendant cette opération. gains cpu approx: 5% a 1500 MTU, 15% a 9000 MTU
tx-checksumming: le cpu met une valeur bidon pour la checksum et la carte calcule et met la bonne valeur avec d’envoyer le packet sur le réseau. gains approx idem rx.
scatter-gather: aussi appelé Vectored I/O. permet de d’échanger les données en les fragmentant/assemblant. En lecture (carte->cpu) on ‘scatter’ en eclatant un morceau de mémoire contigue (dans la carte) en plusieurs endroits différents dans la RAM via DMA. En écriture (cpu->carte) on ‘gather’ en récupérant des morceaux a différents endroits via DMA et en les combinant dans un seul morceau de mémoire dans la carte. Typiquement l’entete du paquet est a un endroit, les données utiles (le payload) a un autre et ca scatter dans un sens et gather dans l’autre. On peut combiner ca avec “page flip” (changement de page dans le systeme de gestion de mémoire virtuelle) pour éviter de copier le payload en mémoire et le mapper directement avec le buffer de l'application par exemple. Avantage: moins de besoin mémoire (moins de besoin de gros bouts contiguës), moins de copies mémoires par le cpu donc gains de mémoire et de cycles cpu.
TSO - tcp segmentation offload: expliqué au début par Vivien. C'est dispo dans Linux depuis la 2.6.16.10. La carte doit supporter ca.
UFO - udp fragmentation offload: principe du TSO mais appliqué a UDP.
LRO - large receive offload : en gros l’inverse du TSO, rassemble plusieurs packets dans la carte avant de passer un seul gros packet au cpu. y’a 2 variantes: une software dans le driver, une hardware directement dans la carte.
GSO - generic segmentation offload : comme TSO mais géré par le kernel si la carte ne supporte pas TSO. Le principe est qu’on retarde le plus possible la segmentation. C'est souvent off par défaut quand TSO est on car c'est redondant. Mais ca peut aussi servir a améliorer autre chose que TCP contrairement a TSO qui n'est que pour TCP.
generic-receive-offload : le pendant en reception de GSO.
large segment offload: c'est le terme/concept générique commun a TSO, GSO, USO et LRO (en réception).
ntuple-filters : surtout pour les machines multi-core/multi-cpu. Principe d’avoir plusieurs queues de traitement dans la carte. Des regles style regles de firewall (style source, dest, port, proto) permet d’aiguiller les packets dans des queues différentes. Ensuite une queue peut etre apairé avec toujours le meme core du CPU et une IRQ propre, ce core gérant aussi l'application qui utilise ce flux (ca evite les changements de contexte entre cores notamment et une meilleur affinité sur les cpu).
Apres y'a de plus en plus d'options avec le temps. Surtout car ipv6 arrivant a maturité, certaines cartes sont mixtes d'autre pas donc les options se dédoublent voir triplent (options pour ipv4, options pour ipv6, options pour les 2, etc).