服务器 
首页 > 服务器 > 浏览文章

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

(编辑:jimmy 日期: 2024/11/18 浏览:3 次 )

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介绍

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

"color: #ff0000">2. 环境说明

机型:Dell PowerEdge R620
网卡:Intel X520(82599ES)
宿主OS:CentOS 7
VM OS:CentOS 7

3. 开启SRIOV

在BIOS里开启SRIOV,如图所示

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

注:即使BIOS里开启全局SRIOV,网卡也依然可以当作普通网卡使用

需要在BIOS里开启VT-d

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种配置方法:

"htmlcode">

<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

"htmlcode">

<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”来配置

"htmlcode">

<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 id='4010'/>
 </vlan>
</interface>

3种方法如何选择

"color: #ff0000">6. 开启irqbalance

x520是2队列,x710是4队列,需要在vm里启动中断平衡服务(irqbalance),否则只会有一个cpu来处理数据包。

另外,这与宿主上vf的query_rss无关。

7. VM迁移

直通网卡属于PCI设备,而libvirt和qemu却不支持带有非USB的PCI设备的vm做迁移,包括冷迁移和热迁移。因此热迁移无法实现。

冷迁移,有2种方案:

"color: #ff0000">8. 带宽限速

只能限制出站带宽,无法限制入站带宽

ip link set p1p1 vf 0 max_tx_rate 100

表示出站带宽限速100Mbps,不同网卡有差别:

"color: #ff0000">9. 安全

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

源mac过滤

ip link set p1p1 vf 0 spoofchk on

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

网卡mac防篡改

"htmlcode">

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

建议:

"color: #ff0000">10. 其他使用限制

"color: #ff0000">11. 性能测试

测试方法:

"text-align: center">详解基于KVM的SRIOV直通配置及性能测试

测试结论:

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

"color: #ff0000">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 1000000"
# 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]

"htmlcode">

# 固定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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

上一篇:详述Linux中Firewalld高级配置的使用
下一篇:zabbix监控Linux系统服务的流程