虚拟化环境中的转发性能测试(DPDK)

需要测试dpdk在虚拟机VM环境下通过绑定的转发性能;具体过程详细记录下:

一:几个关键点的配置

(1):大页内存

已在HOST中预留了大页内存,为了让dpdk使用大页内存,需要在XML中作出如下配置:

    <memoryBacking>
     <hugepages>
       <page size='1048576' unit='KiB' nodeset='0'/> /*使用1G大页内存*/
     </hugepages>
    </memoryBacking>

原理:https://www.hanbaoying.com/2017/04/04/hugepage.html

(2)cpu mode的选取;

考虑到需要测试dpdk的性能瓶颈,所以尽量使用高性能的模式;host-passthrough: libvirt 令 KVM 把宿主机的 CPU 指令集全部透传给虚拟机。因此虚拟机能够最大限度的使用宿主机 CPU 指令集,故性能是最好的;

关于其他几种模式的使用:http://wsfdl.com/openstack/2018/01/02/libvirt_cpu_mode.html

(3)SR-IOV 配置

为了支持物理I/O设备的跨虚拟机共享,使用VFs(Virtual Functions,虚拟功能):支持SR-IOV的物理网卡虚拟出来的实例,以一个独立网卡的形式呈现,每个VF有独立的PCI配置区域,并可以与其它VF共享同一个物理资源(共用同一个物理网口);将一个物理网口虚拟成4个VF;

lspci |grep Eth
1a:00.0 Ethernet controller: Intel Corporation Ethernet Connection X722 for 10GbE SFP+ (rev 09)
1a:00.1 Ethernet controller: Intel Corporation Ethernet Connection X722 for 10GbE SFP+ (rev 09)
3b:00.0 Ethernet controller: Intel Corporation Ethernet Controller XL710 for 40GbE QSFP+ (rev 02)
3b:00.1 Ethernet controller: Intel Corporation Ethernet Controller XL710 for 40GbE QSFP+ (rev 02)

查看对应物理网口的PCIE的总线、设备号和功能编号;并通过命令

echo '4' >/sys/class/net/eth5/device/sriov_numvfs

虚拟出四个VF口;每个虚拟口都有虚拟的PCIe通道,共用物理网口的PCIe通道;因此,虚拟出来的VF口都具有一个PCIe内存空间,用于映射其寄存器集。VF设备驱动程序对寄存器集进行操作以启用其功能,并且显示为实际存在的PCIe设备。创建VF后,可以直接将其指定给I/O来宾域或各个应用程序。此功能使得虚拟功能可以共享物理设备,并在没有CPU和虚拟机管理程序软件开销的情况下执行I/O。

SRIOV局限性:

  • 单个物理网卡支持的虚拟机个数有限制;
  • SR-IOV特性需要物理网卡硬件支持,并非所有的物理网卡都支持SR-IOV特性。

通过XML中的hostdev节点,虚拟机绑定虚拟出来的网口;

    <hostdev mode='subsystem' type='pci' managed='yes'>
      <source>
        <address bus='0x3b' slot='0x0a' function='0x00'/>
      </source>
    </hostdev>

二:具体测试

DPDK绑定网卡:

(1)配置环境变量&编译链 编译可用的dpdk版本;

(2)加载igb_uio驱动;

         ----  modprobe uio

         ----  insmod igb_uio.ko (使用的ko内核版本要和当前环境一致)

关于igb_uioq驱动:见dpdk的uio技术一文;

(3)./dpdk/usertools/dpdk-devbind.py -s 可以查看到已接管&未接管的网口

 ./dpdk-devbind.py -s

Network devices using DPDK-compatible driver
============================================
0000:00:07.0 'XL710/X710 Virtual Function 154c' drv=igb_uio unused=
0000:00:08.0 'XL710/X710 Virtual Function 154c' drv=igb_uio unused=
0000:00:09.0 'XL710/X710 Virtual Function 154c' drv=igb_uio unused=
0000:00:0a.0 'XL710/X710 Virtual Function 154c' drv=igb_uio unused=

Network devices using kernel driver
===================================
0000:00:03.0 'Virtio network device 1000' if=eth0 drv=virtio-pci unused=igb_uio *Active*
0000:00:0b.0 'XL710/X710 Virtual Function 154c' if=eth5 drv=i40evf unused=igb_uio
0000:00:0c.0 'XL710/X710 Virtual Function 154c' if=eth6 drv=i40evf unused=igb_uio
0000:00:0d.0 'XL710/X710 Virtual Function 154c' if=eth7 drv=i40evf unused=igb_uio
0000:00:0e.0 'XL710/X710 Virtual Function 154c' if=eth8 drv=i40evf unused=igb_uio

./dpdk/usertools/dpdk-devbind.py -b igb_uio [PCIe num/0000:00:0e:0] 绑定网口

(4)具体启动dpdk测试视需求而定,比如二层测试l2cfwd

./examples/l2fwd/build/app/l2fwd  -c 0x2 -n 3 -- -p 0x1 (为dpdk接管的第一个vf网口绑核测试) 

原文地址:https://www.cnblogs.com/rex-2018-cloud/p/10394705.html