En Ethernet, normalement il y a le flow control : quand les buffers d'un switch ou d'une carte réseau sont presque pleins, ils vont envoyer une trame pause qui demande d'arrêter temporairement les envois. Le buffer du switch doit être dimensionné pour qu'il n'y ait pas de perte de trames le temps d'envoyer la demande de pose, et qu'elle soit traitée (et que les données restent donc dans les buffers côté SoC).
Il y a peut-être un bug quelque part qui fait que le flow control ne fonctionne pas.
Il pourrait être intéressant de faire des iperf UDP entre un PC à 100Mbps sur le switch et :
- un PC à 1Gbps sur le switch : le flow control devrait fonctionner
- un PC à 10Gbps : pour que le flow control fonctionne, il faut qu'il soit bien géré sur le switch, remonté au SoC, puis émis par le SoC vers le PC
Avec flow control, iperf devrait donner 100Mbps, sans il donnera 1Gbps/10Gbps avec 90%/99% de pertes.
L'absence de gestion du flow control peut aussi causer des problèmes, même avec tous les PC au même débit.
Si une machine est fortement chargée, ou sur un laptop si la carte réseau a besoin de temps pour sortir d'un mode d'économie d'énergie (par exemple avec l'ASPM du PCIe : tant que le lien n'est par réveillé la carte ne peut pas faire de DMA, et n'a donc que ses buffers, qui sont en général tout petits), on peut avoir des pertes de trames, qui font indirectement chuter le débit TCP (surtout quand la durée avant réémission laisse le temps à la carte de repasser en économie d'énergie...).