VM高性能网络I/O:DPDK +SR-IOV配置

日常搬砖打杂所用,记录于此,以便日后查阅。

预备知识:DPDK配置及使用,SR-IOV相关概念(PF,VF),网卡passthrough给VM

SR-IOV数据包分发机制

<h4 id="1">配置过程(Ubuntu 14.04):</h4>

  • 给VM所在的Host打开iommu 以及 sriov,以Intel CPU为例(AMD CPU iommu打开方式略有不同)
  • # Step 1 修改/etc/default/grub
    # 表示对于每个物理interface,打开4个virtual functions
    GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on ixgbe.max_vfs=4"
    # Step 2 更新grub配置并重启物理机
    >> update-grub && reboot
    

    重启之后可以查看到所有的PF和VF,表示配置成功>> lspci | grep -i ether,结果如下:

  • VF能够收发包的前提是相应的PF必须处于UP的状态,通过ifconfig来UP所有的PF
  • 默认所有VF的mac地址都是全0,所以需要为VF配置mac地址,通过ip link set来进行设置
  • >> ip link set <ethX> vf <vf-id> mac <addr>
    

    其余配置可选,同样使用ip link set来进行设置,可以通过ip link help来查看其余可配置项。
    注:spoof checking开启后,会进行mac地址检查,如果发现VF要发送的数据包mac地址不是本身的mac地址,则会被丢弃。
    到这一步,已经可以在物理机上使用VF了,用ifconfig把VF对应的interface UP起来即可收发数据包。接下来是配置DPDK + SR-IOV。

  • 在Host上将VF从内核态驱动ixgbevf解绑,重新绑定到vfio-pci驱动,这里可以利用DPDK提供的脚本dpdk_bind_nic.py来设置
  • # 加载vfio-pci驱动内核模块
    >> modprobe vfio-pci
    # 重新绑定VF驱动
    >> ./dpdk_bind_nic.py --bind=<vf pci bus addr> vfio-pci
    

    到这里,就能够在Host上通过DPDK在VF上收发数据包了。再接下来是,如何在VM中使用DPDK在VF上收发数据包。

  • 本文中使用的虚拟化软件是qemu-kvm,首先在启动VM时,需要设置qemu-kvm的启动参数,将VF passthrough到VM。
  • >> qemu-system-x86_64 -enable-kvm -drive file=<vm img>,if=virtio -cpu host -smp 16 -m 16G \
                -name <vm name> -device vfio-pci,host=<vf pci bus addr> -device vfio-pci,host=<vf pci bus addr> -vnc :1 -net none
    

    重点在于通过-device vfio-pci,host=<vf pci bus addr>将VF passthrough到虚拟机,这样VM就可以直接使用VF了。

  • VM启动后,ifconfig -a可以看到passthrough的VFs,将对应VF的interface绑定到DPDK提供的igb_uio驱动就可以在虚拟机中通过DPDK使用VF收发包了。
  • <h4 id="2">SR-IOV数据包分发机制</h4>

    知道如何配置SR-IOV后,还需要了解数据包是如何从外部进入VF,以及从VF发出的数据包是如何流向的,才能够正确使用SR-IOV进行收发包。