Centos7使用SR-IOV创建KVM虚拟机方法

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

一、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 .*(seds,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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值