使用VFIO驱动替代UIO驱动

重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

本文介绍如何在普通云服务器和弹性裸金属服务器中使用VFIO驱动替代UIO驱动,解决DPDK应用运行异常的问题。

前提条件

背景信息

如果您在六代(g6、c6、r6等)及以后的实例规格(包含通用算力型实例)上部署DPDK应用,运行DPDK应用时可能发生异常。例如,使用pktgen-dpdk工具进行网络发包测试时可能检测不到网卡绑定的igb_uio端口,出现以下报错时,您可以使用VFIO驱动替代UIO驱动解决此类问题。

EAL: eal_parse_sysfs_value(): cannot open sysfs value /sys/bus/pci/devices/0000:00:06.0/uio/uio0/portio/port0/start

操作步骤

  1. 远程连接普通云服务器和弹性裸金属服务器。

    具体操作,请参见通过密码或密钥认证登录Linux实例

  2. 检查GRUB配置。

    cat /proc/cmdline
    • 如果GRUB配置中包括intel_iommu=on,且没有iommu=pt,请执行步骤4

    • 如果是其他情况,需要添加intel_iommu=on并删除iommu=pt,请执行步骤3

      如下图所示,GRUB配置中没有intel_iommu=on,也没有iommu=pt,需要添加intel_iommu=on

      image.png

  3. /etc/default/grub配置文件中添加intel_iommu=on

    1. 打开配置文件。

      sudo vim /etc/default/grub
    2. i切换到编辑模式,在GRUB_CMDLINE_LINUX中添加intel_iommu=on,然后保存配置文件。

      修改完成后的示例如下图所示。grub-config

    3. 应用修改后的配置。

      sudo grub2-mkconfig -o /boot/grub2/grub.cfg

      image.png

    4. 执行以下命令,重启实例并再次远程连接实例。

      reboot
      警告

      重启实例会造成您的实例停止工作,可能导致业务中断,建议您在非业务高峰期时执行该操作。

  4. 安装VFIO和VFIO-PCI驱动。

    sudo modprobe vfio && \
    sudo modprobe vfio-pci
  5. 配置noiommu_mode。

    sudo bash -c 'echo 1 > /sys/module/vfio/parameters/enable_unsafe_noiommu_mode'
  6. 查看并记录网卡设备的bus-info值。

    ethtool -i ethX

    请将ethX替换为对应网卡的编号,查看eth1网卡的示例如下图所示。bus-info

  7. 切换到DPDK安装目录的usertools目录下,然后执行以下命令绑定网卡到vfio-pci驱动。

    sudo ./dpdk-devbind.py -b vfio-pci 0000:00:06.0
    说明

    0000:00:06.0为网卡的bus-info值,用于指定对应的网卡,请按实际情况替换。

    绑定后可以运行./dpdk-devbind.py --status查看绑定状态,下方示例表示0000:00:06.0对应的网卡已绑定到vfio-pci驱动。bound-status

  8. 切换到DPDK安装目录的build/app目录下,然后根据DPDK版本执行命令运行DPDK应用程序。

    • DPDK 18.02及更高版本

      sudo ./testpmd -w 0000:00:06.0 -c 0x3 -- --total-num-mbufs=2048 -ai
    • 低于DPDK 18.02的版本

      sudo ./testpmd -w 0000:00:06.0 -c 0x3 -- --total-num-mbufs=2048 --disable-hw-vlan -ai
    说明

    -w 0000:00:06.0用于指定网卡,total-num-mbufs=2048对应设置的HugePages大小,请按实际情况替换。

    运行DPDK应用程序的示例如下图所示。run-dpdk