Configurer DPDK dans une machine virtuelle Linux

Le kit DPDK (Data Plan Development Kit) dans Azure offre une infrastructure de traitement des paquets d’espace utilisateur plus rapide pour les applications exigeantes en termes de performance. Cette infrastructure contourne la pile réseau du noyau de la machine virtuelle.

Dans le traitement de paquets typique qui utilise la pile réseau du noyau, le processus est piloté par les interruptions. Lorsque l’interface réseau reçoit des paquets entrants, le noyau s’interrompt afin de traiter le paquet et un changement de contexte de l’espace noyau à l’espace utilisateur. DPDK remplace le changement de contexte et la méthode pilotée par les interruptions par l’implémentation d’un espace utilisateur qui se sert des pilotes du mode d’interrogation pour traiter rapidement les paquets.

DPDK se compose d'ensembles de bibliothèques d'espace utilisateur qui donnent accès à des ressources de niveau inférieur. Ces ressources peuvent inclure le matériel, les cœurs logiques, la gestion de la mémoire et les pilotes de mode d’interrogation pour les cartes d'interface réseau.

DPDK peut s’exécuter sur des machines virtuelles Azure prenant en charge plusieurs distributions de système d’exploitation. DPDK fournit une différenciation de performance clé dans le pilotage des implémentations de virtualisation des fonctions réseau. Ces implémentations peuvent prendre la forme d'appliances virtuelles réseau (NVA), telles que des routeurs virtuels, des pare-feu, des VPN, des équilibreurs de charge, des cœurs de paquets évolués et des applications de déni de service (DDoS).

La liste des instructions d’installation de DPDK sur les machines virtuelles MANA est disponible ici : Microsoft Azure Network Adapter (MANA) et DPDK sur Linux

Avantage

Nombre supérieur de paquets par seconde (PPS) : le contournement du noyau et la prise de contrôle des paquets dans l’espace utilisateur ont pour effet de réduire le nombre de cycles du fait de l’élimination des changements de contexte. Il améliore également le nombre de paquets traités à la seconde dans les machines virtuelles Linux Azure.

Versions minimales des systèmes d’exploitation prises en charge

Voici les distributions de la Place de marché Azure qui sont prises en charge :

Système d’exploitation Linux Version du noyau
Ubuntu 18.04 4.15.0-1014-azure+
SLES 15 SP1 4.12.14-8.19-azure+
RHEL 7.5 3.10.0-862.11.6.el7.x86_64+
Debian 10 4.19.0-1-cloud+

Les versions indiquées correspondent à la configuration minimale requise. Les versions plus récentes sont également prises en charge.

La liste des conditions requises pour DPDK sur les machines virtuelles MANA est disponible ici : Carte réseau Microsoft Azure (MANA) et DPDK sur Linux

Prise en charge de noyau personnalisé

Pour toute version du noyau Linux non répertoriée, voir Correctifs pour la création d'un noyau Linux optimisé pour Azure. Pour plus d’informations, vous pouvez également contacter aznetdpdk@microsoft.com.

Prise en charge de la région

Toutes les régions Azure prennent en charge DPDK.

Prérequis

La mise en réseau accélérée doit être activée sur une machine virtuelle Linux. La machine virtuelle doit disposer d’au moins deux interfaces réseau, dont une pour la gestion. L’activation des performances réseau accélérées sur l’interface de gestion n’est pas recommandée. Découvrez comment créer une machine virtuelle Linux en ayant activé la mise en réseau accélérée.

De plus, DPDK utilise des verbes RDMA pour créer des files d’attente de données sur l’adaptateur réseau. Dans la machine virtuelle, vérifiez que les pilotes de noyau RDMA corrects sont chargés. Elles peuvent être mlx4_ib, mlx5_ib ou mana_ib selon les tailles de machine virtuelle.

Les instructions d’installation de DPDK pour les machines virtuelles MANA sont disponibles ici : Carte réseau Microsoft Azure (MANA) et DPDK sur Linux

Installer les dépendances de build

RHEL7.5

yum -y groupinstall "Infiniband Support"
sudo dracut --add-drivers "mlx4_en mlx4_ib mlx5_ib" -f
yum install -y gcc kernel-devel-`uname -r` numactl-devel.x86_64 librdmacm-devel libmnl-devel meson

Compiler et installer DPDK manuellement

  1. Téléchargez la dernière version de DPDK. La version 22.11 LTS ou ultérieure est recommandée pour Azure.

  2. Créez la configuration par défaut avec meson builddir.

  3. Compilez avec ninja -C builddir.

  4. Installez avec DESTDIR=<output folder> ninja -C builddir install.

Configurez l’environnement d’exécution

Après le redémarrage, exécutez une fois les commandes suivantes :

  1. Hugepages

    • Configurez les Hugepages en exécutant la commande suivante, une seule fois pour chaque nœud NUMA :
     echo 1024 | sudo tee /sys/devices/system/node/node*/hugepages/hugepages-2048kB/nr_hugepages
    
    • Créez un répertoire pour un montage avec mkdir /mnt/huge.

    • Montez les Hugepages avec mount -t hugetlbfs nodev /mnt/huge.

    • Vérifiez que les HugePages sont réservées avec grep Huge /proc/meminfo.

    • L’exemple ci-dessus concerne 2 M de pages volumineuses. Des pages volumineuses de 1 G peuvent également être utilisées.

    Notes

    Il existe un moyen de modifier le fichier grub de sorte que les HugePages soient réservées au démarrage en suivant les instructions relatives à DPDK. Les instructions figurent au bas de la page. Lorsque vous utilisez une machine virtuelle Linux Azure, modifiez plutôt les fichiers sous /etc/config/grub.d de sorte que les HugePages soient réservées à tous les redémarrages.

  2. Adresses MAC et IP : utilisez ifconfig –a pour afficher l’adresse MAC et IP des interfaces réseau. Les interface réseau VF et NETVSC ont la même adresse MAC, mais seule l’interface réseau NETVSC possède une adresse IP. Les interfaces VF s’exécutent en tant qu’interfaces subordonnées des interfaces NETVSC.

  3. Adresses PCI

    • Utiliser ethtool -i <vf interface name> pour savoir quelle adresse PCI utiliser pour ethtool -i <vf interface name>.

    • Si la mise en réseau accélérée d’eth0 est activée, assurez-vous que testpmd ne prend pas accidentellement le contrôle de l’appareil pci VF pour eth0. Si l’application DPDK prend accidentellement le contrôle de l’interface réseau de gestion et que cela vous fait perdre la connexion SSH, utilisez la console série pour arrêter l’application DPDK. Vous pouvez également utiliser la console série pour arrêter ou démarrer la machine virtuelle.

  4. Chargez ibuverbs à chaque redémarrage avec modprobe -a ib_uverbs. Pour SLES 15 uniquement, chargez aussi mlx4_ib avec modprobe -a mlx4_ib.

PMD maître

Les applications DPDK doivent être exécutées sur le PMD maître exposé dans Azure. Si l’application s’exécute directement via le PMD VF, elle ne reçoit pas tous les paquets destinés à la machine virtuelle, car certains paquets s’affichent via l’interface synthétique. DPDK prend en charge deux types de PMD maître : NetVSC PMD et Failsafe PMD. Un PMD maître garantit que l’application reçoit tous les paquets qui lui sont destinés. Il permet également de s’assurer que l’application continue de fonctionner en mode DPDK sur le PMD maître, même si le VF est révoqué lorsque l’hôte est en cours de maintenance.

PMD NetVSC

NetVSC est le PMD recommandé pour fonctionner en tant que PMD maître dans Azure. Il garantit que l’application reçoit tous les paquets qui lui sont destinés. Il est par ailleurs certain que l’application continuera à s’exécuter en mode DPDK, même si la fonction virtuelle est révoqué lorsque l’hôte est en cours de maintenance. Pour plus d’informations sur l’utilisation et la configuration de PMD NetVSC, consultez (https://doc.dpdk.org/guides/nics/netvsc.html).

PMD fiable (failsafe)

Remarque : il n’est pas recommandé d’utiliser Failsafe PMD dans Azure. Si votre version DPDK est 22.11 LTS ou ultérieure, il est recommandé d’utiliser NetVSC PMD.

Vous pouvez également exécuter une application DPDK sur le PMD de sécurité automatique. Si vous souhaitez obtenir plus d’informations sur le PMD fiable (failsafe), consultez la Bibliothèque de pilotes de prévention de défaillance en mode interrogation.

Exécuter testpmd

Pour exécuter testpmd en mode racine, utilisez sudo avant la commande sudo.

De base : contrôle d’intégrité, initialisation d’adaptateur fiable (failsafe)

  1. Exécutez les commandes suivantes pour démarrer une application testpmd à port unique :

    testpmd -w <pci address from previous step> \
      -- -i \
      --port-topology=chained
    
  2. Exécutez les commandes suivantes pour démarrer une application testpmd à deux ports :

    testpmd -w <pci address nic1> \
    -w <pci address nic2> \
    -- -i
    

Après que l’application a démarré, exécutez show port info all pour vérifier les informations de port. Un ou deux ports DPDK net_netvsc devraient s’afficher.

  1. Utilisez start <port> /stop <port> pour lancer le trafic.

Les commandes précédentes démarrent testpmd en mode interactif, ce qui est recommandé, pour tester des commandes testpmd.

De base : expéditeur unique/destinataire unique

Les commandes suivantes impriment régulièrement des statistiques relatives au nombre de paquets par seconde :

  1. Du côté de TX, exécutez la commande suivante :

    testpmd \
      -l <core-list> \
      -n <num of mem channels> \
      -w <pci address of the device you plan to use> \
      -- --port-topology=chained \
      --nb-cores <number of cores to use for test pmd> \
      --forward-mode=txonly \
      --eth-peer=<port id>,<receiver peer MAC address> \
      --stats-period <display interval in seconds>
    
  2. Du côté de RX, exécutez la commande suivante :

    testpmd \
      -l <core-list> \
      -n <num of mem channels> \
      -w <pci address of the device you plan to use> \
      -- --port-topology=chained \
      --nb-cores <number of cores to use for test pmd> \
      --forward-mode=rxonly \
      --eth-peer=<port id>,<sender peer MAC address> \
      --stats-period <display interval in seconds>
    

Si vous exécutez les commandes précédentes sur une machine virtuelle, modifiez IP_SRC_ADDR et IP_DST_ADDR dans app/test-pmd/txonly.c pour faire correspondre l’adresse IP effective des machines virtuelles avant de procéder à la compilation. Sinon, les paquets seront abandonnés avant de parvenir au destinataire.

Avancé : expéditeur unique/redirecteur unique

Les commandes suivantes impriment régulièrement des statistiques relatives au nombre de paquets par seconde :

  1. Du côté de TX, exécutez la commande suivante :

    testpmd \
      -l <core-list> \
      -n <num of mem channels> \
      -w <pci address of the device you plan to use> \
      -- --port-topology=chained \
      --nb-cores <number of cores to use for test pmd> \
      --forward-mode=txonly \
      --eth-peer=<port id>,<receiver peer MAC address> \
      --stats-period <display interval in seconds>
    
  2. Du côté de FWD, exécutez la commande suivante :

    testpmd \
      -l <core-list> \
      -n <num of mem channels> \
      -w <pci address NIC1> \
      -w <pci address NIC2> \
      -- --nb-cores <number of cores to use for test pmd> \
      --forward-mode=io \
      --eth-peer=<recv port id>,<sender peer MAC address> \
      --stats-period <display interval in seconds>
    

Si vous exécutez les commandes précédentes sur une machine virtuelle, modifiez IP_SRC_ADDR et IP_DST_ADDR dans app/test-pmd/txonly.c pour faire correspondre l’adresse IP effective des machines virtuelles avant de procéder à la compilation. Sinon, les paquets seront abandonnés avant de parvenir au redirecteur. Vous ne pouvez pas utiliser une troisième machine pour la réception du trafic transféré, car le redirecteur testpmd ne modifie pas les adresses de couche 3, sauf si vous apportez des modifications au code.

sudo yum install -y dpdk

References