一、SR-IOV介绍
1、传统方式的瓶颈:
qemu的网卡,传统方式是使用tap网卡,桥接到宿主的bridge上,但性能很差,尤其是包转发率很低,难以满足对性能要求比较高的场景。性能差的主要原因是路径太长,经过的内核设备太多,即使是使用万兆VIRTIO虚拟网卡,TAP作为字符设备也会成为性能瓶颈,根本原因在于linux/unix内核本身就不是为高性能而设计的,linux/unix更适合做控制平面,而不是转发平面。
传统使用TAP创建KVM虚拟机方法(启用virtio,使能多队列支持):
qemu-system-x86_64 \
-name vfw10G \
-m 16384 \
-smp 12 \
-cpu host \
-hda /gao/vit_tool/store/vfw10G.qcow2 \
-cdrom /gao/vit_tool/iso/virtual_install_12171620.iso \
-boot c \
-enable-kvm \
-netdev type=tap,ifname=vfw10G_eth0,script=no,downscript=no,id=net0 \
-device e1000,netdev=net0,mac=70:D0:81:3B:1F:5C,bus=pci.0,addr=0x3 \
-netdev type=tap,ifname=vfw10G_eth1,script=no,downscript=no,id=net1,queues=8 \
-device virtio-net-pci,mq=on,vectors=5,netdev=net1,mac=70:D0:81:C7:7A:08,bus=pci.0,addr=0x4 \
-netdev type=tap,ifname=vfw10G_eth2,script=no,downscript=no,id=net2,queues=8 \
-device virtio-net-pci,mq=on,vectors=5,netdev=net2,mac=70:D0:81:E6:B4:36,bus=pci.0,addr=0x5 \
-daemonize \
-vnc :12 \
2、解决思路:
减少中间路径,最简单有效的方法就是bypass内核。SRIOV(Single-Root I/O Virtualization)的作用就是bypass宿主内核,实现宿主机物理网卡与VM虚拟网卡passthrough直通。

3、PF和VF:
物理功能(PF):PF是全功能的PCIE,可以像其他任何PCIE设备一样进行发现、管理、和处理。PF拥有完全配置和控制PCIE设备资源的能力。
虚拟功能(VF):VF是一种轻量级的PCIE功能,VF可以与PF以及与同一PF相关联的其他VF共享一个或多个物理资源。VF仅允许拥有用于其自身行为的配置资源。
每个物理网卡就是一个PF,在开启SRIOV后,每个PF可以生成固定数量的VF,每个VF都可以在宿主上作为一张网卡直接使用,或者直通到QEMU虚拟机里作为虚拟机里的网卡使用,这就实现了bypass宿主内核。
不同网卡方案对比图如下:

二、 开启SR-IOV支持
1、在BIOS里开启网卡SR-IOV

注:即使BIOS里开启全局SRIOV,网卡也依然可以当作普通网卡使用
2、在BIOS里开启VT-d支持

3、在grub配置iommu支持
修改/boot/grub2/grub.cfg或 /etc/grub2.cfg文件(软链接),在linux16加载内核镜像一行追加“intel_iommu=on iommu=pt”,“iommu.passthrough=1”不加也可,包含在“intel_iommu=on”
[root@localhost ~]# ls -l /etc/grub2.cfg
lrwxrwxrwx. 1 root root 22 Nov 19 17:54 /etc/grub2.cfg -> …/boot/grub2/grub.cfg
linux16 /vmlinuz-3.10.0-514.el7.x86_64 root=/dev/mapper/cl-root ro crashkernel=auto rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet intel_iommu=on iommu=pt
也可修改/etc/default/grub文件,在GRUB_CMDLINE_LINUX最后追加“intel_iommu=on iommu=pt”参数,然后执行grub2-mkconfig -o /boot/grub2/grub.cfg刷新 grub.cfg 文件;
[root@localhost ~]# cat /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="(sed′s,release.∗(sed 's, release .*(sed′s,release.∗,g’ /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT=“console”
GRUB_CMDLINE_LINUX=“crashkernel=auto rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet intel_iommu=on iommu=pt iommu.passthrough=1”
GRUB_DISABLE_RECOVERY=“true”
[root@localhost ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file … Found linux image:
/boot/vmlinuz-3.10.0-514.el7.x86_64 Found initrd image:
/boot/initramfs-3.10.0-514.el7.x86_64.img Found linux image:
/boot/vmlinuz-0-rescue-e5ec5990f1e548bea132e3458196c892 Found initrd
image: /boot/initramfs-0-rescue-e5ec5990f1e548bea132e3458196c892.img
done
注:额外追加“console=ttyS0,115200”参数可支持串口显示;
4、虚拟化支持及开启成功验证
1)验证CPU是否支持虚拟化方法如下:
grep -E “vmx|svm” /proc/cpuinfo
如果输出内容中有 vmx,说明CPU支持 VT。
2)验证KVM加载成功方法:
[root@localhost ~]# lsmod |grep kvm
kvm_intel 170181 14
kvm 554609 1 kvm_intel
irqbypass 13503 4 kvm,vfio_pci
3)验证BIOS里开启SR-IOV和Intel VT-d,Grub开启IOMMU生效方法如下:
[root@localhost ~]# cat /proc/cmdline | grep intel_iommu
BOOT_IMAGE=/vmlinuz-3.10.0-514.el7.x86_64 root=/dev/mapper/cl-root ro crashkernel=auto rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet intel_iommu=on iommu=pt iommu.passthrough=1
[root@localhost ~]# dmesg

本文详细介绍了SR-IOV技术如何解决传统虚拟网络性能瓶颈,包括PF和VF的概念、开启SR-IOV支持的步骤、创建VF虚拟网卡、配置KVM虚拟机使用SR-IOV,以及如何修改虚拟机配置以利用SR-IOV性能优势。

1449

被折叠的 条评论
为什么被折叠?



