基于KVM的SRIOV直通配置及性能测试

发布时间:2024-04-13 点击:144
云计算
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驱动
? 附. 包转发率测试方法
? 附. 参考文档
1. sriov介绍
? 传统方式的瓶颈: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%
2. 环境说明
机型:dell poweredge r620
网卡:intel x520(82599es)
宿主os:centos 7
vm os:centos 7
3. 开启sriov
1 在bios里开启sriov,如图所示
注:即使bios里开启全局sriov,网卡也依然可以当作普通网卡使用
2 需要在bios里开启vt-d
3 grub配置iommu
iommu=pt intel_iommu=on4. 生成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 id=\\\'4010\\\'/> </vlan></interface>上面<source>中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>上面<source>中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.xmlvirsh net-start sriov-intvirsh net-autostart sriov-int虽然配置了net-autostart,但并不管用,因为物理机启动时候,经常会在启动生成vf(假设在rc.local里生成vf)之前就启动libvirt,而这个net-pool(sriov-int)本应该在vf生成后才能启动,因此建议在rc.local里增加如下内容来确保启动
ip link set p1p2 upecho 63 > /sys/bus/pci/devices/0000:41:00.0/sriov_numvfsvirsh net-start sriov-int然后,在vm的xml里增加
<interface type=\\\'network\\\'> <mac address=\\\'52:54:00:ad:ef:8d\\\'/> <source network=\\\'sriov-int\\\'/> <vlan> <tag id=\\\'4010\\\'/> </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. 开启irqbalance
x520是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,不同网卡有差别:
? x520网卡最小限速11mbps,最大限速10000mbps,设为0表示不限速。若小于11或大于10000则会报错
? x710网卡最小限速50mbps,最大限速10000mbps,设为0表示不限速。若小于50则自动设为50,若

嘉兴企业网站建设公司浅谈网站排名的基本原则
阿里云服务器怎么通过域名访问
gov.cn域名是如何注册申请的 gov.cn域名对注册者信息怎样进行变更
微商城如何快速提升口碑?
抖音变现的5个关键点!
云服务器可以买吗
申请域名公司怎么选择合适的?
将阿里云盘挂载在阿里云服务器上