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

基于KVM的SRIOV直通配置及性能测试SRIOV 介绍 VF 直通配置 以及包转发率性能测试

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

SRIOV介绍、VF直通配置,以及包转发率性能测试

小慢哥的原创文章,欢迎转载


目录


1. SRIOV介绍

基于KVM的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方案,性能提升:


2. 环境说明


3. 开启SRIOV

1️⃣ 在BIOS里开启SRIOV,如图所示

基于KVM的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段落里加入

 
         
          
          

上面中address的地址,可以根据“lshw -c network -businfo”来配置,比如

pci@0000:41:10.0 p1p1_0 

方法2(hostdev):在devices段落里加入

 
         
          

上面中address的地址,也是根据“lshw -c network -businfo”来配置

方法3(net-pool)

为每个PF网卡定义一个net-pool,即分别编辑一个xml文件。这里仅展示一个PF,编辑sriov-int.xml

 
         
         
           sriov-int 
          
          
           
          
         

加入到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里增加

 
         
          
          
           
            
            
         

3种方法如何选择

综上所述:使用方法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种方案:

注意:不能在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,若大于10000则会报错

注意:vm关机后vf的带宽限速不会复位


9. 安全

仅支持源mac过滤和网卡mac防篡改,不支持其他安全防护(防arp欺骗就无法实现)

源mac过滤

ip link set p1p1 vf 0 spoofchk on 

表示vm里发出的包,如果源mac不是指定mac,那么数据包不允许通过。注意:vm关机后vf的spoofchk不会复位

网卡mac防篡改

在宿主上手动修改mac方法(vm关机和开机情况下都可以改):

ip link set p1p1 vf 0 mac aa:bb:cc:dd:ee:ff 

建议:


10. 其他使用限制


11. 性能测试

测试方法:

配置:

测试结果:

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

测试结论:

使用SR-IOV+VF直通方式可以明显提升包转发率,1对1的测试结果看到kernel态发包可以达到3.5Mpps,收包可以达到1.9Mpps

说明:

更多测试结果:

以下测试使用的packet大小为64B

▷ kernel态,3层转发性能:发包器使用不同的source ip

▷ kernel态,2层转发性能:发包器使用不同的source mac

▷ kernel态下vxlan封装能力

▷ dpdk用户态,2层转发性能:发包器使用不同的source ip

▷ SR-IOV模式

▪ X520总量11.2Mpps,每vm为11.2Mpps/vm总数(即VF数)

总结:

注意:


12. windows虚拟机使用VF

到网卡官网下载对应驱动并安装,经测试,win2012默认就有82599(x520)驱动,但版本旧


13. 运维命令

# 查看网卡支持的vf数量 cat /sys/bus/pci/devices/0000:41:00.0/sriov_totalvfs # 宿主屏蔽VF驱动后查看vf和pf的对应 https://github.com/intel/SDN-NFV-Hands-on-Samples/blob/master/SR-IOV_Network_Virtual_Functions_in_KVM/listvfs_by_pf.sh 载下来后执行./listvfs_by_pf.sh即可 # 宿主屏蔽VF后查看哪些VF正在被使用 yum install dpdk-tools dpdk-devbind --status # 查看网卡对应哪个socket lstopo-no-graphics # lspci查看网卡信息 lspci -Dvmm|grep -B 1 -A 4 Ethernet # 宿主上查看具体VF流量(仅支持x520,x710查不到) ethtool -S p1p1 | grep VF 

14. 宿主屏蔽VF驱动

echo "blacklist ixgbevf" >> /etc/modprobe.d/blacklist.conf 

表示当物理机启动时候,默认不加载ixgbevf驱动,但是如果手动modprobe ixgbevf,则也会加载驱动。

如果当前已经加载了ixgbevf,想卸载,则需要如下步骤

echo 0 > /sys/bus/pci/devices/0000:41:00.0/sriov_numvfs rmmod ixgbevf echo 63 > /sys/bus/pci/devices/0000:41:00.0/sriov_numvfs 

附. 包转发率测试方法

modprobe pktgen:发包通过pktgen来发,收包通过sar -n DEV来看,发的是udp包

#!/bin/bash NIC="eth1" DST_IP="192.168.1.2" DST_MAC="52:54:00:43:99:65" modprobe pktgen pg() { echo inject > $PGDEV cat $PGDEV } pgset() { local result echo $1 > $PGDEV result=`cat $PGDEV | fgrep "Result: OK:"` if [ "$result" = "" ]; then cat $PGDEV | fgrep Result: fi } # Config Start Here ----------------------------------------------------------- # thread config # Each CPU has own thread. Two CPU exammple. We add ens7, eth2 respectivly. PGDEV=/proc/net/pktgen/kpktgend_0 echo "Removing all devices" pgset "rem_device_all" echo "Adding ${NIC}" pgset "add_device ${NIC}" # device config # delay 0 means maximum speed. CLONE_SKB="clone_skb " # NIC adds 4 bytes CRC PKT_SIZE="pkt_size 64" # COUNT 0 means forever COUNT="count 0" DELAY="delay 0" PGDEV=/proc/net/pktgen/${NIC} echo "Configuring $PGDEV" pgset "$COUNT" pgset "$CLONE_SKB" pgset "$PKT_SIZE" pgset "$DELAY" pgset "dst ${DST_IP}" pgset "dst_mac ${DST_MAC}" # Time to run PGDEV=/proc/net/pktgen/pgctrl echo "Running... ctrl^C to stop" pgset "start" echo "Done" # Result can be vieved in /proc/net/pktgen/eth[3,4] 

pktgen-dpdk

# 固定ip固定mac set 0 dst ip 192.168.10.240 set 0 src ip 192.168.10.245/24 set 0 dst mac c8:1f:66:d7:58:ba set 0 src mac a0:36:9f:ec:4a:28 # 可变source ip可变source mac stop 0 range 0 src ip 192.168.0.1 192.168.0.1 192.168.200.200 0.0.0.1 range 0 dst ip 10.1.1.241 10.1.1.241 10.1.1.241 0.0.0.0 range 0 dst mac c8:1f:66:d7:58:ba c8:1f:66:d7:58:ba c8:1f:66:d7:58:ba 00:00:00:00:00:00 range 0 src mac a0:36:9f:ec:4a:28 a0:36:9f:ec:4a:28 a0:36:9f:ec:ff:ff 00:00:00:00:01:01 range 0 src port 100 100 65530 1 range 0 dst port 100 100 65530 1 range 0 size 64 64 64 0 enable 0 range enable 0 latency start 0 # 按50%的速率发包 set 0 rate 50 

附. 参考文档

# openstack关于sriov的限制
https://docs.openstack.org/mitaka/networking-guide/config-sriov.html

# 迁移
https://wenku.baidu.com/view/d949db67998fcc22bcd10dfd.html
https://www.chenyudong.com/archives/live-migrate-with-pci-pass-through-fail-with-libvirt-and-qemu.html

# sriov配置
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/virtualization_host_configuration_and_guest_installation_guide/sect-virtualization_host_configuration_and_guest_installation_guide-sr_iov-how_sr_iov_libvirt_works

# 线速
http://netoptimizer.blogspot.tw/2014/05/the-calculations-10gbits-wirespeed.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/207698.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午1:18
下一篇 2026年3月19日 下午1:18


相关推荐

  • 【评分卡】评分卡入门与创建原则——分箱、WOE、IV、分值分配

    【评分卡】评分卡入门与创建原则——分箱、WOE、IV、分值分配本文主要讲 变量选择 模型开发 评分卡创建和刻度 变量分析首先 需要确定变量之间是否存在共线性 若存在高度相关性 只需保存最稳定 预测能力最高的那个 需要通过 VIF varianceinfl 也就是方差膨胀因子进行检验 变量分为连续变量和分类变量 在评分卡建模中 变量分箱 binning 是对连续变量离散化 discretizati 的一种称呼

    2026年3月20日
    1
  • String与Integer的相互转化

    String与Integer的相互转化String 与 Integer 相互转化时 一定要注意空指针异常

    2026年3月18日
    2
  • google域名邮箱申请 gmail域名邮箱申请(企业应用套件)指南

    google域名邮箱申请 gmail域名邮箱申请(企业应用套件)指南

    2021年12月9日
    60
  • jQuery下载和安装详细教程[通俗易懂]

    jQuery下载和安装详细教程[通俗易懂]下载jQuery我们可以到jQuery的官网下载jQuery文件(PS:其实jQuery就是一个封装了很多函数的js文件,把这个js文件导入到网页中就可以了)。jQuery官网地址:https://jquery.com/打开官网,即可看到jQuery的下载按钮,点击进入下载页面。有两个版本的jQuery可以下载:Productionversion-用于实际的网站中,是已经被精简和…

    2022年5月3日
    450
  • Modelsim的安装教程

    Modelsim的安装教程提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、Modelsim安装二、激活成功教程1.拷贝Crack文件夹中的文件2.激活成功教程过程可能出现的错误前言Modelsim的安装与激活成功教程使用一、Modelsim安装打开下在之后的文件夹,直接双击exe文件进行安装。不熟悉时,可以直接使用默认路径进行安装,不进行路径上的修改。1、下载并解压好文件包,然后运行安装程序根据向导提示进行软件安装2、依提示安装软件过程中需要注意的是,会有三个弹出框提示,首先是是否创建桌面快捷方式提示

    2022年6月16日
    85
  • 转载:shmget参数详解

    转载:shmget参数详解shmgetintshm key t nbsp key size t nbsp size int nbsp flag key 标识符的规则 size 共享存储段的字节数 flag 读写的权限返回值 成功返回共享存储的 id 失败返回 1key tkey nbsp nbsp nbsp key 标识共享内存的键值 nbsp 0

    2026年3月19日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号