Remplacez le pilote UIO par le pilote VFIO sur les instances ECS et les instances Bare Metal (EBM) pour résoudre les erreurs d'exécution de DPDK.
Prérequis
Les pages énormes sont configurées sur l'instance.
DPDK est installé sur l'instance.
Contexte
Les applications DPDK exécutées sur les types d'instances de sixième génération (tels que g6, c6 et r6) et ultérieurs peuvent rencontrer des erreurs d'exécution. Par exemple, pktgen-dpdk peut ne pas détecter la carte réseau liée au pilote igb_uio. Si vous observez l'erreur suivante, remplacez le pilote UIO par le pilote VFIO.
EAL: eal_parse_sysfs_value(): cannot open sysfs value /sys/bus/pci/devices/0000:00:06.0/uio/uio0/portio/port0/start
Procédure
Connectez-vous à votre instance ECS ou EBM. Consultez la rubrique Se connecter à une instance Linux à l'aide de Workbench.
-
Vérifiez la configuration GRUB.
cat /proc/cmdlineSi la sortie inclut
intel_iommu=onmais pasiommu=pt, passez directement à l'étape 4.-
Sinon, accédez à l'étape 3 pour ajouter le paramètre.
Dans l'exemple suivant, la sortie n'inclut ni
intel_iommu=onniiommu=pt; il est donc nécessaire d'ajouterintel_iommu=on.[test@iZ2ze9h6rn63 ~]$ cat /proc/cmdline BOOT_IMAGE=/boot/vmlinuz-4.19.91-27.4.al7.x86_64 root=UUID=90179e0e-4e13-4c59-a6cc-0ce5cxxx ro crashkernel=0M-2G:0M
-
Ajoutez
intel_iommu=ondans le fichier/etc/default/grub.-
Ouvrez le fichier.
sudo vim /etc/default/grub -
Appuyez sur
ipour passer 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 une fois qu'elle a démarré.
rebootAvertissementLe redémarrage interrompt brièvement l'instance et peut perturber les services en cours d'exécution. Nous vous recommandons d'effectuer cette opération pendant les heures creuses.
-
-
Chargez les pilotes VFIO et VFIO-PCI.
sudo modprobe vfio && \ sudo modprobe vfio-pci -
Activez le mode
noiommu_mode.sudo bash -c 'echo 1 > /sys/module/vfio/parameters/enable_unsafe_noiommu_mode' -
Récupérez la valeur
bus-infode la carte réseau.ethtool -i ethXRemplacez
ethXpar l'ID de la carte réseau cible. Exemple poureth1:Le champ
bus-infodans la sortie correspond à l'adresse bus de l'interface réseau (dans cet exemple,0000:00:06.0).[root@izxxx ~]# ethtool -i eth1 driver: virtio_net version: 1.0.0 firmware-version: expansion-rom-version: bus-info: 0000:00:06.0 supports-statistics: no supports-test: no supports-eeprom-access: no supports-register-dump: no supports-priv-flags: no -
Lie la carte réseau au pilote
vfio-pci. Accédez au répertoireusertoolssitué dans le répertoire d'installation de DPDK et exécutez la commande suivante :sudo ./dpdk-devbind.py -b vfio-pci 0000:00:06.0RemarqueRemplacez
0000:00:06.0par la valeurbus-inforéelle de votre carte réseau.Exécutez
./dpdk-devbind.py --statuspour vérifier. La sortie suivante montre que0000:00:06.0est lié àvfio-pci:[root@izxxxxxxxxxxxxx usertools]# ./dpdk-devbind.py --status Network devices using DPDK-compatible driver ============================================= 0000:00:06.0 'Virtio network device 1000' drv=vfio-pci unused=virtio pci Network devices using kernel driver ==================================== 0000:00:05.0 'Virtio network device 1000' if=eth0 drv=virtio-pci unused=virtio_pci,vfio-pci *Active* -
Démarrez l'application DPDK. Accédez au répertoire
build/appsitué dans le répertoire d'installation de DPDK et exécutez la commande correspondant à votre version.-
Pour DPDK 18.02 et versions ultérieures :
sudo ./testpmd -w 0000:00:06.0 -c 0x3 -- --total-num-mbufs=2048 -ai -
Pour les versions antérieures à DPDK 18.02 :
sudo ./testpmd -w 0000:00:06.0 -c 0x3 -- --total-num-mbufs=2048 --disable-hw-vlan -ai
RemarqueL'option
-w 0000:00:06.0spécifie la carte réseau. La valeurtotal-num-mbufs=2048doit correspondre à la taille de vos pages énormes. Adaptez ces deux valeurs selon votre configuration.Exemple de sortie d'une application DPDK en cours d'exécution :
[ @izxxxxxxxxxxxZ app]# ./testpmd -w 0000:00:06.0 -c 0x3 -- --total-num-mbufs=2048 -ai EAL: Detected 2 lcore(s) EAL: Detected 1 NUMA nodes EAL: Multi-process socket /var/run/dpdk/rte/mp_socket EAL: No free hugepages reported in hugepages-1048576kB EAL: Probing VFIO support... EAL: VFIO support initialized EAL: PCI device 0000:00:06.0 on NUMA socket -1 EAL: Invalid NUMA socket, default to 0 EAL: probe driver: 1af4:1000 net_virtio EAL: using IOMMU type 8 (No-IOMMU) Auto-start selected Interactive-mode selected testpmd: create a new mbuf pool <mbuf_pool_socket_0>: n=2048, size=2176, socket=0 testpmd: preferred mempool ops selected: ring_mp_mc Warning! port-topology=paired and odd forward ports number, the last port will pair with itself. Configuring Port 0 (socket 0) EAL: Error disabling MSI-X interrupts for fd 18 Port 0: 00:16:3E:35:CC:C4 Checking link statuses... Done Start automatic packet forwarding io packet forwarding - ports=1 - cores=1 - streams=1 - NUMA support enabled, MP allocation mode: native Logical Core 1 (socket 0) forwards packets on 1 streams: RX P=0/Q=0 (socket 0) -> TX P=0/Q=0 (socket 0) peer=02:00:00:00:00:00 io packet forwarding packets/burst=32 nb forwarding cores=1 - nb forwarding ports=1 port 0: RX queue number: 1 Tx queue number: 1 Rx offloads=0x0 Tx offloads=0x0 RX queue: 0 RX desc=0 - RX free threshold=0 RX threshold registers: pthresh=0 hthresh=0 wthresh=0 RX Offloads=0x0 TX queue: 0 TX desc=0 - TX free threshold=0 TX threshold registers: pthresh=0 hthresh=0 wthresh=0 TX offloads=0x0 - TX RS bit threshold=0 testpmd> -