Personnalisez les règles de hachage RSS et les tables d'indirection sur les ENI prises en charge afin de répartir uniformément le trafic entre les cœurs CPU et de résoudre les goulots d'étranglement liés à un cœur unique.
Qu'est-ce que le RSS
Le Receive Side Scaling (RSS) s'appuie sur le matériel et le pilote de l'ENI pour calculer une valeur de hachage à partir des caractéristiques des paquets (adresses IP source/destination et ports), puis mappe différents flux de trafic vers plusieurs files RX. Les cœurs CPU associés traitent ces files en parallèle, ce qui permet d'équilibrer la charge et de réduire la latence liée à l'utilisation d'un seul cœur.
Une ENI qui prend en charge les files d'attente multiples utilise des canaux RX (réception) et TX (envoi) indépendants par file pour un traitement parallèle. Lorsqu'un paquet arrive, le matériel de l'ENI applique une politique RSS pour distribuer les différents flux de données entre plusieurs files RX. Par défaut, la politique RSS d'une instance ECS est fixée dans le Virtual Private Cloud (VPC) et ne peut ni être affichée ni modifiée depuis l'instance elle-même.
Certaines familles d'instances prennent en charge la fonctionnalité de RSS personnalisé pour les ENI. Après avoir activé la fonctionnalité de RSS personnalisé sur une famille d'instances prise en charge, l'ENI distribue le trafic selon les règles de hachage personnalisées par défaut. Vous pouvez également ajuster la configuration RSS en fonction des caractéristiques réelles de votre trafic.
Une fois le RSS personnalisé activé, vous pouvez aussi configurer le RSS dans les scénarios DPDK afin de maximiser les performances multicœurs.
Fonctionnement
Le RSS personnalisé pour une ENI d'instance ECS fonctionne comme suit :
-
Calcul de la valeur de hachage : l'ENI calcule une valeur de hachage à partir du quintuplet (IP source, IP destination, port source, port destination et protocole), d'une clé de hachage et d'un algorithme de hachage.
Clé de hachage : une valeur fixe de
40octets. Le pilote de l'ENI génère une clé de hachage par défaut lors de l'initialisation. Vous pouvez ajuster la clé de hachage pour influencer la répartition du trafic.Algorithme de hachage : seul l'algorithme
toeplitzpar défaut est actuellement pris en charge. Ce paramètre ne peut pas être modifié.-
Règles de hachage : les règles de calcul des valeurs de hachage varient selon le type de trafic. Les règles de hachage par défaut du RSS des ENI ECS sont les suivantes. Vous ne pouvez pas modifier ces règles.
Trafic TCP et UDP sur IPv4/IPv6 : une valeur de hachage est calculée sur la base du quadruplet (IP source, IP destination, port source et port destination) et de la clé de hachage.
Trafic non TCP/UDP sur IPv4/IPv6, tel que ICMP : une valeur de hachage est calculée sur la base du doublet (IP source et IP destination) et de la clé de hachage.
Les messages non IP (tels que ARP) sont envoyés vers la file par défaut (file 0) et ne font pas l'objet d'un hachage.
-
Mappage de la table d'indirection : la table d'indirection RSS est un tableau prédéfini qui associe les valeurs de hachage aux files de réception de destination. Chaque élément (bucket de hachage) stocke un numéro de file, par exemple 0, 1 ou 2. Lors du chargement du pilote de l'ENI, une table d'indirection est automatiquement générée afin de répartir uniformément le trafic.
Longueur de la table d'indirection : nombre total de buckets de hachage. La valeur est fixée à
128.-
Modes de distribution :
Le mode de distribution de la table d'indirection RSS constitue le mécanisme central qui associe les valeurs de hachage à des files de réception spécifiques. Grâce à une table d'indirection prédéfinie, le résultat du calcul de hachage est converti en un index de file. Cela permet une répartition flexible du trafic entre plusieurs cœurs.
Différents modes de distribution, tels que la distribution uniforme et la distribution pondérée, influencent directement la manière dont le trafic est réparti entre les cœurs CPU. Cela a un impact sur le débit du système, la latence, l'utilisation des ressources et les performances des services.
Choisissez un modèle de distribution adapté à votre scénario. Consultez la section Modèle de distribution de la table d'indirection.
-
Processus de mappage de la table d'indirection :
Calcul de l'index du bucket de hachage :
Index = Valeur de hachage % Longueur de la table d'indirection(par exemple, 88 % 128 → index 88). Vous pouvez utiliser le script de calcul RSS pour calculer la valeur de l'index.-
Remplissage des numéros de file : inscrivez les numéros de file dans chaque bucket de hachage selon le mode de distribution choisi.
Une fois la table d'indirection générée, l'index de hachage de chaque paquet correspond à un numéro de file, et le paquet est envoyé vers cette file.
-
Association aux cœurs CPU : lorsqu'une file reçoit un paquet, elle déclenche une interruption. Le cœur CPU associé traite cette interruption.
Les images autres que Red Hat Enterprise Linux prennent en charge par défaut l'affinité des interruptions réseau. Chaque file est associée à une interruption indépendante, et l'affinité des interruptions répartit leur traitement entre différents cœurs CPU. Consultez le Mécanisme central des files d'attente multiples.
Activer ou désactiver le RSS personnalisé pour une ENI
La fonctionnalité de RSS personnalisé pour les ENI est en aperçu sur invitation. Pour utiliser cette fonctionnalité, vous pouvez soumettre un ticket.
Lorsque vous activez le RSS personnalisé sur un type d'instance pris en charge, le trafic reçu est distribué vers plusieurs files de réception selon les règles de hachage par défaut. Différents cœurs CPU traitent ces files en parallèle, ce qui augmente le débit et réduit la charge sur un cœur unique.
Prérequis
-
Le déploiement du RSS personnalisé s'effectue par phases. Il est disponible dans les régions suivantes :
Nom de la région
ID de région
Chine (Hong Kong)
cn-hongkong
-
Seules certaines familles d'instances à files d'attente multiples prennent en charge le RSS personnalisé, notamment la famille d'instances à usage général g9i et la famille d'instances optimisées pour la mémoire r9i.
Appelez l'opération API DescribeInstanceTypes pour vérifier la prise en charge. RssSupport=
trueindique que la fonctionnalité est prise en charge. -
L'image Alibaba Cloud Linux 3.2104 LTS 64 bits est recommandée.
Si vous utilisez d'autres images publiques, la version du noyau doit être 6,12 ou ultérieure.
Si vous utilisez la fonctionnalité de RSS personnalisé dans une application DPDK, la version de DPDK doit être 21,11 ou ultérieure.
Procédure d'activation ou de désactivation
Le RSS personnalisé est désactivé par défaut. Vous pouvez l'activer ou le désactiver lors de la création d'une ENI ou après sa création.
-
Lors de l'appel à CreateNetworkInterface, définissez EnableRss dans EnhancedNetwork sur true ou false.
Le RSS personnalisé prend effet après l'attachement de l'ENI à une instance.
-
Appelez ModifyNetworkInterfaceAttribute et définissez EnableRss dans EnhancedNetwork sur true ou false. Après l'activation ou la désactivation, la modification prend effet lorsque l'ENI est rattachée :
Pour une ENI secondaire attachée à une instance, vous devez détacher l'ENI puis attacher l'ENI pour que la modification prenne effet.
Pour l'ENI principale, redémarrez l'instance pour que la modification prenne effet.
-
Appelez DescribeNetworkInterfaceAttribute avec Attribute défini sur enhancedNetwork pour savoir si le RSS personnalisé est activé. EnableRSS=true signifie qu'il est activé ; false signifie qu'il est désactivé.
Si le RSS n'a pas été modifié pour l'ENI, cette opération ne renvoie pas le paramètre EnableRSS, ce qui signifie que la fonctionnalité n'est pas activée.
Afficher la configuration RSS d'une ENI
Après avoir activé le RSS personnalisé, le pilote de l'ENI génère une configuration RSS par défaut selon le mécanisme et les règles par défaut lors du rechargement de l'ENI.
Vous pouvez vous connecter à distance à une instance Linux et exécuter ethtool -x eth0 pour afficher la configuration RSS de l'ENI principale. Pour une ENI secondaire, remplacez l'identifiant d'interface (eth1, eth2, etc.).

-
Table de hachage (table d'indirection de hachage de flux RX) : définit les règles de mappage des valeurs de hachage vers les 64 files de réception.
Chaque ligne de la table de hachage représente une plage de valeurs de hachage, indiquée par l'index de départ. Par exemple, 0 indique les valeurs de hachage 0-7, et 8 indique 8-15.
Les nombres dans la table (0, 1, 2, etc.) représentent les identifiants des files de réception correspondantes. Dans cet exemple, il y a 64 files (0-63).
Configuration actuelle : la table d'indirection est remplie cycliquement avec la séquence
0,1,2,...,63,0,1,2...63, ce qui garantit que les valeurs de hachage sont mappées uniformément vers les 64 files et que le trafic est réparti équitablement.
Clé de hachage RSS : la clé utilisée pour calculer la valeur de hachage. Les caractères hexadécimaux représentent une clé de 40 octets.
-
Fonction de hachage RSS : définit l'algorithme utilisé pour calculer la valeur de hachage.
toeplitz: il s'agit de l'algorithme par défaut, actuellement activé. Il prend en charge le hachage symétrique basé sur un quintuplet et convient au trafic à usage général.xor/crc32: il s'agit d'autres algorithmes optionnels généralement utilisés dans des scénarios spécifiques. ECS ne prend actuellement en charge que l'algorithmetoeplitz; les autres algorithmes ne sont ni pris en charge ni activés.
-
Règles de hachage : affichez la configuration des champs de hachage pour le trafic reçu par l'ENI principale.
ethtool -n eth0 rx-flow-hash tcp4Vous pouvez remplacer
tcp4par le type de protocole que vous souhaitez interroger, tel queudp4,tcp6ouudp6.-
Les règles de hachage par défaut du RSS des ENI ECS sont les suivantes. Vous ne pouvez pas modifier ces règles.
Trafic TCP et UDP sur IPv4/IPv6 : une valeur de hachage est calculée sur la base du quadruplet (IP source, IP destination, port source et port destination) et de la clé de hachage.
Trafic non TCP/UDP sur IPv4/IPv6, tel que ICMP : une valeur de hachage est calculée sur la base du doublet (IP source et IP destination) et de la clé de hachage.
Les messages non IP (tels que ARP) sont envoyés vers la file par défaut (file 0) et ne font pas l'objet d'un hachage.
-
Prenons
tcp4comme exemple. Pour le trafic TCP IPv4, la valeur de hachage est calculée par défaut sur la base du quadruplet (IP source, adresse IP destination, port source, port destination) et de la clé de hachage :
Les caractéristiques attendues du trafic sont les suivantes :
Même connexion TCP : tous les paquets ont la même valeur de hachage et sont distribués vers la même file. Cela garantit l'ordre des paquets.
Connexions TCP différentes : si les quadruplets diffèrent, les valeurs de hachage diffèrent. Le trafic est distribué vers différentes files. Cela permet à plusieurs cœurs CPU de traiter différentes connexions en parallèle et d'augmenter le débit.
Si le message suivant s'affiche, le RSS personnalisé n'est pas activé ou le type d'instance ne le prend pas en charge. Activez le RSS personnalisé après avoir confirmé que le type d'instance le prend en charge.

Configurer le RSS personnalisé pour une ENI
La configuration RSS par défaut répond à la plupart des besoins. Vous devrez peut-être ajuster la clé de hachage ou la table d'indirection dans les situations suivantes :
Trafic inégal : les valeurs de hachage par défaut peuvent concentrer un trafic spécifique dans quelques files.
Optimisation des performances : ajustez les règles de hachage en fonction des caractéristiques du trafic, par exemple une proportion élevée de UDP, afin d'améliorer l'utilisation des files.
Exigences de sécurité : utilisez une clé de hachage personnalisée pour empêcher les attaquants de prédire la répartition du trafic.
Dans cet exemple, l'instance est configurée avec l'image
Alibaba Cloud Linux 3.2104 LTS 64-bit.Cet exemple utilise l'ENI principale
eth0. Remplacez l'identifiant d'interface par eth1 ou eth2 pour modifier le RSS de l'ENI secondaire correspondante.Lorsque la configuration RSS ne correspond pas aux caractéristiques de votre trafic, elle peut entraîner une répartition inégale et une contention d'état inter-cœurs, ce qui affecte les performances. Ajustez la configuration en fonction des caractéristiques réelles du trafic et utilisez les outils de surveillance pour observer la répartition des files en temps réel.
Configurer la clé de hachage
Regénérez la clé de hachage RSS si le trafic est réparti de manière inégale (par exemple, si rx_packets de certaines files est nettement supérieur à celui d'autres files), ou pour empêcher les attaquants de déduire les modèles de trafic en effectuant une ingénierie inverse de la valeur de hachage.
La modification de la clé change les valeurs de hachage des connexions existantes, ce qui peut provoquer temporairement un réordonnancement ou des retransmissions de paquets. Effectuez cette opération pendant les heures creuses.
-
Affichez la clé de hachage actuelle de l'ENI.
Le pilote de l'ENI génère une clé de hachage par défaut de 40 octets lors du chargement de l'ENI.
ethtool -x eth0
-
Générez une nouvelle clé aléatoire à l'aide d'OpenSSL.
openssl rand -hex 40 | fold -w2 | paste -sd: - -
Appliquez la nouvelle clé à l'ENI.
ImportantIl s'agit d'un paramètre temporaire. Il devient invalide après le redémarrage de l'instance ou le rattachement de l'ENI. Le pilote de l'ENI initialise automatiquement une configuration par défaut aléatoire.
ethtool -X eth0 hkey <hash key>Remplacez <hash key> par la nouvelle clé que vous avez générée à l'étape précédente.
-
Vérifiez que la nouvelle clé a pris effet.
ethtool -x eth0La sortie indique que la nouvelle clé a pris effet :

Configurer la table d'indirection
Le mode de distribution de la table d'indirection RSS constitue le mécanisme central qui associe les valeurs de hachage à des files d'attente de réception spécifiques. Grâce à une table d'indirection prédéfinie, le résultat du calcul de hachage est converti en un index de file d'attente. Cette approche permet une répartition flexible du trafic sur plusieurs cœurs.
Les différents modes de distribution, tels que la distribution uniforme et la distribution pondérée, influencent directement la manière dont le trafic est réparti entre les cœurs CPU. Cela a un impact immédiat sur le débit du système, la latence, l'utilisation des ressources et les performances des services.
Choisissez un mode de distribution adapté à votre scénario.
Les configurations suivantes sont temporaires. Elles deviennent invalides après le redémarrage de l'instance ou le rattachement de l'ENI. Le pilote ENI réinitialise alors une configuration par défaut aléatoire.
-
Mode de distribution uniforme : Les N premières files d'attente remplissent les compartiments de hachage de manière cyclique. Ce mode convient aux scénarios de forte concurrence générale.
ethtool -X eth0 equal <Number of queues N>Si la valeur est définie sur 64, la table d'indirection est remplie cycliquement avec
0,1,2,...,63,0,1,2...63,.
-
Distribution pondérée : Allouez les compartiments de hachage selon des ratios de poids. Cette méthode est adaptée aux scénarios présentant des priorités métier différenciées (par exemple, la file d'attente 0 traite le trafic en temps réel et la file d'attente 1 gère les tâches en arrière-plan) ou des performances CPU mixtes.
ethtool -X eth0 weight <queue 0 weight> <queue 1 weight> ...Dans l'exemple suivant, la file d'attente 0 reçoit 60 % et la file d'attente 1 reçoit 40 % :
RemarqueS'il y a quatre files d'attente au total, mais que vous ne définissez des poids que pour deux d'entre elles, la table d'indirection générera uniquement des mappages pour les files d'attente 0 et 1.
ethtool -X eth0 weight 6 4
-
Distribution partielle des files d'attente : À partir d'une file d'attente spécifiée, utilisez des files d'attente consécutives pour remplir les compartiments de hachage de manière cyclique. Cette option est recommandée pour diriger le trafic vers une plage CPU spécifique, telle qu'un nœud NUMA.
ethtool -X eth0 start <start queue> equal <number of queues>Dans l'exemple ci-dessous, les files d'attente 2 à 41 (40 files d'attente à partir de la file d'attente 2) remplissent les compartiments de hachage :
ethtool -X eth0 start 2 equal 40
Utiliser watch pour observer la distribution du trafic
Après avoir activé le RSS personnalisé sur l'ENI, utilisez hping3 pour générer du trafic avec différentes caractéristiques et watch pour surveiller la distribution des interruptions des files d'attente, afin de vérifier si le trafic est bien réparti sur plusieurs cœurs comme prévu.
Prérequis
Achetez deux instances ECS avec les configurations suivantes :
Instance ECS émettrice (10.0.0.252) : Une instance sur laquelle
hping3est installé pour générer du trafic avec différentes caractéristiques.-
Instance ECS réceptrice : Une instance dont le type prend en charge les files d'attente multiples pour les ENI, avec une ENI secondaire attachée (10.0.0.5) et le RSS personnalisé activé sur l'ENI secondaire eth1.
RemarqueCet exemple utilise quatre files d'attente pour les tests.
Pour éliminer l'impact du trafic de connexion SSH sur l'ENI principale, le RSS personnalisé est activé sur l'ENI secondaire eth1 pour les tests.
Connectivité réseau : Les deux instances ECS se trouvent dans le même groupe de sécurité et peuvent communiquer entre elles via le réseau interne.
Procédure
-
Connectez-vous à l'instance ECS réceptrice, vérifiez la configuration RSS de l'ENI secondaire et confirmez la distribution de trafic attendue. Consultez la section Afficher la configuration RSS d'une ENI.

-
Connectez-vous à l'instance ECS émettrice et installez
hping3.yum install -y hping3 -
Sur l'instance ECS réceptrice, surveillez les compteurs de paquets des files d'attente en temps réel.
watch -n 1 "ethtool -S eth1 | grep rx[0,1,2,3]_packets"Remplacez la configuration du numéro de file d'attente par la configuration réelle de l'ENI réceptrice.
-
Connectez-vous à l'instance ECS émettrice et simulez différents modèles de trafic.
-
Scénario 1 : Envoyez 10 000 paquets SYN à haute vitesse vers l'adresse IP du récepteur avec des ports de destination aléatoires. Cela garantit que le hachage du trafic est dispersé et permet de vérifier l'équilibrage du hachage.
sudo hping3 10.0.0.5 -S -a 10.0.0.252 --rand-dest -p 0 --baseport 10000 -c 10000 -i u100 -I eth0rand-dest: Port de destination aléatoire-p 0: Utilisé conjointement avecrand-dest--baseport 10000: Valeur de départ pour le port source.-c 10000: Envoie 10 000 paquets-i u100: Spécifie un intervalle de 100 microsecondes entre les paquets pour un envoi à haute vitesse.-I eth0: Utilisé conjointement avecrand-destpour spécifier l'interface réseau de l'émetteur
Sur l'instance réceptrice, les compteurs de paquets des quatre files d'attente doivent augmenter de manière uniforme :

-
Scénario 2 : Envoyez du trafic avec une adresse IP source et un port fixes. Ce test permet de vérifier si le même trafic est mappé sur la même file d'attente et de confirmer la cohérence du hachage.
La commande suivante envoie 10 000 paquets TCP SYN vers la cible
10.0.0.5:80, avec l'IP source fixée sur10.0.0.252et le port source fixé sur12345.sudo hping3 10.0.0.5 -S -p 80 -c 10000 -s 12345 -a 10.0.0.252 --keep -i u100-
La valeur d'index de hachage est calculée en fonction du script RSS. Le trafic devrait être traité par la file d'attente 0 :

-
Résultat d'observation réel sur l'instance ECS réceptrice (10.0.0.5) :

-
-
Si la distribution du trafic ne répond pas aux attentes (par exemple, si une file d'attente présente une charge significativement plus élevée), optimisez la configuration en ajustant la clé de hachage ou en configurant la table d'indirection.
Configurer et utiliser RSS dans DPDK
Le Data Plane Development Kit (DPDK) est un framework open source d'accélération du plan de données en mode utilisateur qui utilise des pilotes en mode utilisateur, la copie zéro et le mode d'interrogation pour atteindre un traitement des paquets proche de la vitesse de la ligne. Il convient aux domaines sensibles au débit et à la latence, tels que les clouds de télécommunications, la fintech et l'informatique en périphérie. Consultez la page Data Plane Development Kit (DPDK*).
Après avoir activé le RSS personnalisé sur l'ENI, vous pouvez utiliser testpmd et l3fwd dans DPDK pour tester et vérifier la distribution RSS.
Installer et configurer DPDK sur une instance ECS
Si vous utilisez la fonctionnalité RSS personnalisé dans une application DPDK, la version de DPDK doit être 21,11 ou ultérieure.
Cette rubrique utilise une instance
ecs.r9i.16xlarge(64 files d'attente) exécutant l'imageAlibaba Cloud Linux 3.2104 LTS 64-bitcomme exemple pour démontrer l'installation de la version22.11.3de DPDK.Cet exemple utilise l'ENI principale
eth0. Remplacez l'identifiant d'interface par eth1 ou eth2 pour modifier le RSS de l'ENI secondaire correspondante.
Étape 1 : Installer DPDK
Étape 2 : Charger les modules du noyau
DPDK nécessite des modules du noyau tels que UIO ou VFIO pour l'accès aux périphériques en mode utilisateur. VFIO est préféré pour sa sécurité (il s'appuie sur IOMMU), tandis que UIO convient aux tests rapides. Cet exemple utilise VFIO.
-
Activez IOMMU.
VFIO s'appuie sur IOMMU pour une liaison sécurisée des périphériques en mode utilisateur et un mappage DMA.
-
Ouvrez le fichier.
sudo vim /etc/default/grub -
Appuyez sur
ipour entrer en mode insertion. Ajoutezintel_iommu=onau paramètreGRUB_CMDLINE_LINUX. Enregistrez et fermez le fichier.Exemple de configuration modifiée :
GRUB_TIMEOUT=1 GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" GRUB_DEFAULT=saved GRUB_DISABLE_SUBMENU=true GRUB_TERMINAL_OUTPUT="console" GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet idle=halt biosdevname=0 net.ifnames=0 console=tty0 console=ttyS0,115200n8 noibrs intel_iommu=on" GRUB_DISABLE_RECOVERY="true" -
Appliquez la configuration.
sudo grub2-mkconfig -o /boot/grub2/grub.cfg[test@iZ2ze9h6rn ~]$ sudo grub2-mkconfig -o /boot/grub2/grub.cfg Generating grub configuration file ... Found linux image: /boot/vmlinuz-4.19.91-27.4.al7.x86_64 Found initrd image: /boot/initramfs-4.19.91-27.4.al7.x86_64.img Found linux image: /boot/vmlinuz-0-rescue-2cea6e3dd20d4251bf6880159559f2c9 Found initrd image: /boot/initramfs-0-rescue-2cea6e3dd20d4251bf6880159559f2c9.img done -
Redémarrez l'instance et reconnectez-vous après son démarrage.
rebootAvertissementL'opération de redémarrage arrête l'instance pendant une courte période et peut interrompre les services en cours d'exécution sur l'instance. Nous vous recommandons de redémarrer l'instance pendant les heures creuses.
-
-
Installez les pilotes VFIO et VFIO-PCI.
sudo modprobe vfio && \ sudo modprobe vfio-pci -
Activez
noiommu_mode.sudo bash -c 'echo 1 > /sys/module/vfio/parameters/enable_unsafe_noiommu_mode'
Étape 3 : Lier l'ENI au pilote DPDK
-
Activer le RSS personnalisé sur l'ENI.
Assurez-vous que le RSS personnalisé est activé pour l'ENI que DPDK va prendre en charge et que l'ENI a été rattachée pour que la modification prenne effet.
-
Se connecter à une instance à l'aide de VNC.
Cet exemple utilise l'ENI principale. Les opérations suivantes détachent l'ENI, ce qui interrompt les sessions SSH.
Pour les opérations sur l'ENI secondaire, connectez-vous à l'aide de Workbench (ENI principale) à la place.
-
Affichez l'état de liaison du pilote de périphérique PCI. Par défaut, l'ENI est gérée par le noyau.
dpdk-devbind.py --status
Le périphérique
0000:00:05.0est géré par le pilote du noyauvirtio-pcieteth0est actif.Le périphérique peut être basculé vers
vfio-pcipour une prise en charge en mode utilisateur par DPDK. Désactivez d'abord l'interface et détachez le pilote du noyau.
-
Désactivez eth0.
sudo ip link set dev eth0 downSi vous ignorez cette étape, la liaison à VFIO échoue :

-
Détachez le pilote du noyau et liez-le à VFIO.
dpdk-devbind.py -b vfio-pci 0000:00:05.0Remplacez l'identifiant de périphérique PCI par celui que vous avez interrogé pour votre ENI.
RemarquePour reliaisonner le pilote du noyau, arrêtez l'application DPDK avec
sudo pkill dpdk-appet exécutezdpdk-devbind.py -b virtio-pci 0000:00:05.0. -
Affichez à nouveau l'état de liaison du pilote de périphérique PCI. L'ENI devrait désormais être prise en charge par DPDK.
ImportantLorsque l'ENI est prise en charge par le pilote en mode utilisateur DPDK, le noyau ne la contrôle plus. Des commandes telles que
ip ane peuvent pas afficher ses informations.dpdk-devbind.py --status
Le périphérique
0000:00:05.0est désormais lié àvfio-pci.
Configurer RSS à l'aide de testpmd
Testpmd est un outil de test DPDK permettant de vérifier les fonctionnalités du pilote ENI et de déboguer les applications du plan de données. Consultez Testpmd Runtime Functions.
Les modifications apportées à la configuration ENI (nombre de files d'attente, règles RSS, table RETA) ne prennent effet qu'après le démarrage ou le redémarrage de la transmission des paquets.
-
Démarrez l'outil de test de transmission de paquets DPDK testpmd.
dpdk-testpmd -a 0000:00:05.0 --socket-mem 1024 -- -i --portmask=0x1 --rxq=64 --txq=64 --forward-mode=rxonly-a 0000:00:05.0: attache l'ENI à l'adresse PCI0000:00:05.0à DPDK. Exécutezdpdk-devbind.py --statuspour trouver l'adresse PCI.--socket-mem 1024: pré-alloue 1 024 Mo de mémoire de pages géantes par nœud NUMA.-i: démarre le mode de ligne de commande interactif pour ajuster dynamiquement la configuration et afficher les statistiques. Saisissezquitpour quitter.-
--portmask=0x1: active le masque de port0x1(binaire0001), en utilisant uniquement la première ENI (adresse PCI0000:00:05.0).Chaque bit binaire de
portmaskcorrespond à un port (0x1active le port 0,0x3active les ports 0 et 1).Un seul périphérique (
0000:00:05.0) étant attaché, son numéro de port DPDK est 0.
--rxq=64/--txq=64: définit le nombre de files d'attente RX et TX par port à 64 pour le traitement multi-files. Remplacez 64 par le nombre de files d'attente ENI réel.--forward-mode=rxonly: mode réception uniquement (les paquets sont reçus et ignorés). Utilisé pour tester les performances de réception de l'ENI ou pour la capture de paquets.
-
Accédez au mode interactif et interrogez la configuration RSS actuelle.
-
Interroger les informations de configuration de hachage :
show port info <port_id>port_id : le port. Dans cet exemple, le port 0.
-
Interroger la clé de hachage :
show port <port_id> rss-hash key
-
Interroger la configuration de la table d'indirection :
show port <port_id> rss reta <size> <mask0, mask1...>size: le nombre d'entrées de la table d'indirection à interroger. La valeur est fixée à128.-
mask0, mask1: les masques utilisés pour filtrer la plage d'index de hachage à afficher, spécifiés au format hexadécimal. Par exemple,mask0=0xffindique que les entrées pour les index de hachage 0 à 7 sont affichées.La taille de la table d'indirection est fixée à 128. Deux masques sont requis, chacun couvrant 64 blocs d'index. Exécutez
show port 0 rss reta 128 (0xffffffffffffffff,0xffffffffffffffff)pour renvoyer les 128 mappages index-vers-file d'attente :
-
-
Configurez RSS selon vos besoins.
-
Configurez une nouvelle clé de hachage.
Générer une nouvelle clé aléatoire avec OpenSSL.
port config <port_id> rss-hash-key (ipv4|ipv4-frag|\ ipv4-tcp|ipv4-udp|ipv4-sctp|ipv4-other|\ ipv6|ipv6-frag|ipv6-tcp|ipv6-udp|ipv6-sctp|\ ipv6-other|l2-payload|ipv6-ex|ipv6-tcp-ex|\ ipv6-udp-ex <string of hex digits \ (variable length, NIC dependent)>)Pour TCP sur IPv4, exécutez
port config 0 rss-hash-key ipv4 6D5A56DA255B0EC24167253D43A38FB0D0CA2BCBAE7B30B477CB2DA38030F20C6A42B73BBEAC01FCpour configurer la clé de hachage et vérifier :
-
Configurez la table d'indirection RSS pour mapper les valeurs de hachage aux files d'attente spécifiées.
port config all rss reta <hash,queue>,<hash,queue>..Effectuez la configuration en fonction du nombre réel de files d'attente :
hash: l'index de hachage. La plage dépend de la taille de la table d'indirection (par exemple, 0-63 pour 64 entrées).queue: le numéro de la file d'attente de réception cible.
-
Appliquer RSS dans l3fwd
Pour activer RSS dans une application DPDK, implémentez la configuration de la clé de hachage et de la table d'indirection dans votre code. L'exemple suivant utilise L3FWD.
L3FWD (Layer 3 Forwarding) est un exemple d'application DPDK qui illustre le routage de paquets basé sur IP haute performance utilisant le zéro copie et les pilotes en mode polling (PMD).
-
Modifiez le code source L3FWD dans DPDK (
examples/l3fwd/main.c).-
Modifiez la section d'initialisation du port
static struct rte_eth_conf port_confdans l'exemple de code L3FWD. -
Ajoutez des fonctions pour configurer la table d'indirection de hachage et la clé de hachage.
-
Après
rte_eth_dev_start, appelez les nouvelles fonctions de configuration.
-
-
Recompilez L3FWD après avoir modifié le code source.
cd ~/dpdk-stable-22.11.3/ rm -rf build # Initialize the build directory and configure project options, specifying to build the l3fwd Layer 3 forwarding example. meson setup -Dexamples=l3fwd build cd build # Compile. ninja # Install the compiled files to the system directory. sudo ninja install # Update the system's shared library cache. sudo ldconfig -
Spécifiez les liaisons port-file-cœur et démarrez L3FWD.
cd ~/dpdk-stable-22.11.3/build/examples ./dpdk-l3fwd --legacy-mem -a 0000:00:05.0 --socket-mem 1024 -- -p 0x1 --config="(PORT_ID, QUEUE_ID, LCORE_ID), (PORT_ID, QUEUE_ID, LCORE_ID), ..." --parse-ptype-
--config: chaque triplet spécifie :PORT_ID : l'ID du port (commence à 0).
QUEUE_ID : l'ID de la file d'attente de réception (commence à 0).
LCORE_ID : l'ID du cœur logique (commence à 0).
-
L'exemple suivant utilise deux cœurs et deux files d'attente :
./dpdk-l3fwd --legacy-mem -a 0000:00:05.0 --socket-mem 1024 -- -p 0x1 --config="(0,0,0),(0,1,1)" --parse-ptypeLe premier triplet
(0,0,0): le cœur logique 0 (lcore0) traite la file d'attente 0 du port 0.Le deuxième triplet
(0,1,1): le cœur logique 1 (lcore1) traite la file d'attente 1 du port 0.

-
Utiliser le script RSS pour calculer un index de hachage
Utilisez ce script Python pour déterminer à quelle file d'attente de réception un paquet est mappé, en fonction de son quadruplet et de sa clé de hachage. Le résultat guide la configuration de la table d'indirection pour diriger des flux spécifiques vers des files d'attente désignées.
L'exemple suivant utilise la configuration RSS d'une ENI avec 64 files d'attente :

Calculez la valeur de hachage RSS à l'aide du script avec les informations de quintuplet suivantes (modifiez les valeurs si nécessaire).
Adresse IP de destination (-r) : 10.0.0.1, qui est l'adresse IP de l'ENI de l'instance réceptrice configurée avec RSS.
Adresse IP source (-t) : 10.0.0.251, qui est l'adresse IP de l'ENI de l'expéditeur.
Port de destination (-R) :
26000Port source (-T) :
18042Clé de hachage : obtenez-la à partir de la configuration de la table d'indirection RSS.
python ali_ecs_rss_calc.py -r 10.0.0.1 -t 10.0.0.251 -R 26000 -T 18042 -k 69:e8:7c:56:bf:03:9f:63:d7:c5:e5:96:b3:00:36:93:02:8c:d2:8f:cc:a9:00:65:fd:c8:94:71:5f:fd:c8:de:7a:30:a9:73:b3:33:0c:c6
Le script calcule le hachage à l'aide de l'algorithme toeplitz. Dans le résultat ci-dessous, le système utilise une longueur de table d'indirection de 128. Un index de hachage de 117 signifie que le paquet est mappé à la file d'attente à l'index 117.

Consultez la table d'indirection : l'index 117 est mappé à la file d'attente 53, donc les paquets sont traités par la file d'attente 53.




