需要测试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网口绑核测试)