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

前提条件

背景信息

如果您在六代(g6、c6、r6等)及以后的实例规格上部署DPDK应用,运行DPDK应用时可能发生异常。例如,使用pktgen-dpdk工具进行网络发包测试时可能检测不到网卡绑定的igb_uio端口,出现以下报错:
EAL: eal_parse_sysfs_value(): cannot open sysfs value /sys/bus/pci/devices/0000:00:06.0/uio/uio0/portio/port0/start

您可以使用VFIO驱动替代UIO驱动解决此类问题,在普通云服务器和弹性裸金属服务器中的操作有所不同,具体操作,请参见普通云服务器弹性裸金属服务器

普通云服务器

  1. 检查GRUB配置。
    cat /proc/cmdline

    确保GRUB配置中包括intel_iommu=on,且没有iommu=pt

  2. 可选:如果没有intel_iommu=on,手动添加该配置。
    1. 打开配置文件。
      vim /etc/default/grub
    2. 切换到编辑模式,在GRUB_CMDLINE_LINUX中添加intel_iommu=on,然后保存配置文件。
      修改完成后的示例如下图所示。grub-config
    3. 应用修改后的配置。
      grub2-mkconfig -o /boot/grub2/grub.cfg
    4. 重启实例并再次远程连接实例。
  3. 安装VFIO和vfio-pci驱动。
    modprobe vfio && \
    modprobe vfio-pci
  4. 配置noiommu_mode。
    echo 1 > /sys/module/vfio/parameters/enable_unsafe_noiommu_mode
  5. 查看并记录网卡设备的bus-info值。
    ethtool -i ethX
    请将ethX替换为对应网卡的编号,查看eth1网卡的示例如下图所示。bus-info
  6. 切换到DPDK安装目录的usertools目录下,然后执行以下命令绑定网卡到vfio-pci驱动。
    ./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
  7. 切换到DPDK安装目录的build/app目录下,然后根据DPDK版本执行命令运行DPDK应用程序。
    • DPDK 18.02及更高版本
      ./testpmd -w 0000:00:06.0 -c 0x3 -- --total-num-mbufs=2048 -ai
    • 低于DPDK 18.02的版本
      ./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

弹性裸金属服务器

  1. 检查GRUB配置。
    cat /proc/cmdline

    确保GRUB配置中包括intel_iommu=oniommu=pt

  2. 可选:如果没有intel_iommu=oniommu=pt,手动添加该配置。
    1. 打开配置文件。
      vim /etc/default/grub
    2. 切换到编辑模式,在GRUB_CMDLINE_LINUX中添加intel_iommu=oniommu=pt,然后保存配置文件。
      修改完成后的示例如下图所示。ebm-grub
    3. 应用修改后的配置。
      grub2-mkconfig -o /boot/grub2/grub.cfg
    4. 重启实例并再次远程连接实例。
  3. 安装VFIO和vfio-pci驱动。
    modprobe vfio && \
    modprobe vfio-pci
  4. 配置noiommu_mode。
    echo 1 > /sys/module/vfio/parameters/enable_unsafe_noiommu_mode
  5. 查看并记录网卡设备的bus-info值。
    ethtool -i ethX
    请将ethX替换为对应网卡的编号,查看eth1网卡的示例如下图所示。ebm-bus-info
  6. 切换到DPDK安装目录的usertools目录下,然后执行以下命令绑定网卡到vfio-pci驱动。
    ./dpdk-devbind.py -b vfio-pci 0000:b7:00.0
    说明 0000:b7:00.0为网卡的bus-info值,用于指定对应的网卡,请按实际情况替换。

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

    bound-eth1
  7. 切换到DPDK安装目录的build/app目录下,然后根据DPDK版本执行命令运行DPDK应用程序。
    • DPDK 18.02及更高版本
      ./testpmd -w 0000:b7:00.0 -c 0x3 -- --total-num-mbufs=2048 -ai
    • 低于DPDK 18.02的版本
      ./testpmd -w 0000:b7:00.0 -c 0x3 -- --total-num-mbufs=2048 --disable-hw-vlan -ai
    说明 0000:b7:00.0用于指定网卡,total-num-mbufs=2048对应设置的HugePages大小,请按实际情况替换。

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

    ebm-testpmd