SRIOV介绍、VF直通配置,以及包转发率性能测试
目录▪ 1. SRIOV介绍
▪ 2. 环境说明
▪ 3. 开启SRIOV
▪ 4. 生成VF
▪ 5. VF直通
▪ 6. 开启irqbalance
▪ 7. VM迁移
▪ 8. 带宽限速
▪ 9. 安全
▪ 10. 其他使用限制
▪ 11. 性能测试
▪ 12. windows虚拟机使用VF
▪ 13. 运维命令
▪ 14. 宿主屏蔽VF驱动
▪ 附. 包转发率测试方法
▪ 附. 参考文档
▷ 传统方式的瓶颈:qemu的网卡,传统方式是使用tap网卡,桥接到宿主的bridge上,但性能很差,尤其是包转发率很低,难以满足对性能要求比较高的场景。性能差的主要原因是路径太长,经过的内核设备太多,根本原因在于linux/unix内核本身就不是为高性能而设计的,linux/unix更适合做控制平面,而不是转发平面。
▷ 解决思路:减少中间路径,最简单有效的方法就是bypass内核。SRIOV的作用就是bypass宿主内核。
▷ PF和VF:每个物理网卡(比如p1p1)就是一个PF,在开启SRIOV后,每个PF可以生成固定数量的VF,每个VF都可以在宿主上作为一张网卡直接使用,或者直通到QEMU虚拟机里作为虚拟机里的网卡使用,这就实现了bypass宿主内核。
先给出性能测试的结论,SRIOV VF直通相比传统tap+bridge方案,性能提升:
▷ 发包转发率提高: 677%
▷ 收包转发率提高: 171%
机型:Dell PowerEdge R620
网卡:Intel X520(82599ES)
宿主OS:CentOS 7
VM OS:CentOS 7
1️⃣ 在BIOS里开启SRIOV,如图所示
注:即使BIOS里开启全局SRIOV,网卡也依然可以当作普通网卡使用
2️⃣ 需要在BIOS里开启VT-d
3️⃣ grub配置iommu
iommu=pt intel_iommu=on 4. 生成VF # 启动网卡 ip link set p1p1 up # 查看pf的pci编号 lshw -c network -businfo # 查看网卡支持的vf数量 cat /sys/bus/pci/devices/0000:41:00.0/sriov_totalvfs # 生成vf,建议加入开机启动 echo 63 > /sys/bus/pci/devices/0000:41:00.0/sriov_numvfs注意:若没有屏蔽宿主的VF驱动,则在生成vf后还必须等待一会时间才能在宿主上看到所有命名完成的网卡(否则会看到一堆ethX网卡),vf数量越多需要等待时间越长,63个vf,差不多需要10秒
5. VF直通如果qemu是通过libvirt管理的,有3种配置方法:
▷ 方法1(interface):在devices段落里加入
<interface type='hostdev' managed='yes'> <mac address='52:54:00:ad:ef:8d'/> <source> <address type='pci' domain='0x0000' bus='0x41' slot='0x10' function='0x0'/> </source> <vlan> <tag/> </vlan> </interface>上面中address的地址,可以根据“lshw -c network -businfo”来配置,比如
pci@0000:41:10.0 p1p1_0▷ 方法2(hostdev):在devices段落里加入
<hostdev mode='subsystem' type='pci' managed='yes'> <source> <address domain='0x0000' bus='0x41' slot='0x10' function='0x0'/> </source> </hostdev>上面中address的地址,也是根据“lshw -c network -businfo”来配置
▷ 方法3(net-pool)
为每个PF网卡定义一个net-pool,即分别编辑一个xml文件。这里仅展示一个PF,编辑sriov-int.xml
<network> <name>sriov-int</name> <forward mode='hostdev' managed='yes'> <pf dev='p1p1'/> </forward> </network>加入到libvirt net-pool、激活、并设置开机启动
virsh net-define sriov-int.xml virsh net-start sriov-int virsh net-autostart sriov-int虽然配置了net-autostart,但并不管用,因为物理机启动时候,经常会在启动生成vf(假设在rc.local里生成vf)之前就启动libvirt,而这个net-pool(sriov-int)本应该在vf生成后才能启动,因此建议在rc.local里增加如下内容来确保启动
ip link set p1p2 up echo 63 > /sys/bus/pci/devices/0000:41:00.0/sriov_numvfs virsh net-start sriov-int然后,在vm的xml里增加
<interface type='network'> <mac address='52:54:00:ad:ef:8d'/> <source network='sriov-int'/> <vlan> <tag/> </vlan> </interface>3种方法如何选择
▷ 方法1:功能多,可以配置mac和vlan
▷ 方法2:mac和vlan需要自己在宿主上敲ip命令设置
▷ 方法3:有2个问题
▪ 存在一个bug,当本宿主所有vm使用某个PF的VF总数超过VF上限后,不会报错,也能启动,但是可能会有异常,并且vm如果被destroy关机,那么对应的VF就会出问题,比如使用ip link set p1p1 vf 0 mac 00:00:00:00:00:00来做重置时候,会提示“RTNETLINK answers: Cannot allocate memory”,而且难以修复,即使修复,也不知道有没有看不见的异常存在。
▪ 没有办法知道某个vm使用的是哪个vf,因此如果要对vf设置限速或者开关spoofchk时候,只能先在宿主上通过“ip link show dev p1p1 | grep MAC地址”方式来获得vf号,然后才能设置限速等操作
综上所述:使用方法3最便捷,但是存在bug,因此需要做好逻辑来防止vm使用vf总数超过上限的情况。
6. 开启irqbalancex520是2队列,x710是4队列,需要在vm里启动中断平衡服务(irqbalance),否则只会有一个cpu来处理数据包。
另外,这与宿主上vf的query_rss无关。
7. VM迁移直通网卡属于PCI设备,而libvirt和qemu却不支持带有非USB的PCI设备的vm做迁移,包括冷迁移和热迁移。因此热迁移无法实现。
冷迁移,有2种方案:
▷ detach掉vf网卡,然后使用libvirt做迁移,迁移过去后,再在新宿主上attach vf网卡
▷ undefine vm,然后在新宿主上重新渲染并define vm
注意:不能在vm关机时候用libvirt的迁移功能,有时候会导致虚拟机消失掉,包括原宿主和新宿主
8. 带宽限速只能限制出站带宽,无法限制入站带宽
ip link set p1p1 vf 0 max_tx_rate 100表示出站带宽限速100Mbps,不同网卡有差别: