作者简介:
杨俊俊,资深Linux系统专家,《深度实践KVM》作者之一。目前就职于盛大游戏,担任盛大游戏“G云”运维负责人。具有多年Linux运维开发经验,精通KVM虚拟化、Linux监控及运维自动化管理。其联合撰写的《Linux运维最佳实践》已经发售,可点击阅读原文购买,《Linux运维最佳实践》读者交流QQ群 434242482。
SR-IOV全称是(Single-Root I/O Virtualization)直译成中文是单根IO虚拟化技术,不好记,也不好理解,所以很多人都习惯直接叫SR-IOV。
它本身是一种技术实现方式,简单的说,它就是通过的硬件的方式,将个物理的网卡(PF),虚拟出多个虚拟机网卡(VF),虚拟出来的网卡可以直接分配的虚拟机使用。在传统的虚拟化中,虚拟机的网卡通常是通过桥接(Bridge或OVS)的方式,因为这种方式最方便,也最简单。但是这样做最大的问题在于性能。
SR-IOV并不是一个新技术,在2010年左右,Intel就已经提出来了,有人可能会问,一个六年前就已经被提出来的技术方案,为什么到现在,各大公有云都没有支持呢?可以归结为以下几点。
SR-IOV需要特定的网卡支持,支持清单:http://www.intel.cn/content/www/cn/zh/support/network-and-i-o/ethernet-products/000005722.html
SR-IOV在KVM应用中存在局限性,目前在线迁移的功能任然不完善。
大部分上云的服务器,对网卡的性能要求传统的网桥即可满足,所以动力不足。
KVM虚拟机在传统网桥模式下,网络稳定是没有问题的,但它和SR-IOV一个本质的区别是,网桥模式本身会消耗宿主机的CPU,在实际场景下,当宿主机的CPU压力(>60%)比较大时,虚拟机内部网卡的发包率(PPS)性能会下降,极端情况会出现丢包。这点对于游戏来说,直接的感觉就是卡屯和掉人,这在游戏业务中是绝对不允许的。
为了规避这个痛点,通常不敢上一些对网卡发包率压力非常高的游戏,或者通过降低虚拟化的比例,来保证宿主机的CPU压力在可控的范围内。
除此还有没有其他更好的办法呢?SR-IOV是一个不错的选择。
SR-IOV最适合的应用场景是什么?
宿主机CPU压力大(>60%)+虚拟机网卡发包率压力大(pps >5w)
虚拟机网卡发包率压力非常大(pps>10w)
以下(图1)是我们使用SR-IOV之后,宿主机的负载CPU,这种CPU负载下,同宿主机下的5台KVM虚拟机,网卡的发包率每台都可以在10w左右。业务完全正常。
在传统网桥模式下,这种负载的游戏业务是跑不起来的。
对于很多做技术的朋友,来说,还是比较关心,如何来用,中间的坑怎么来规避,下面就来着重介绍如何配置。
使用SR-IOV的时候,我们选择了万兆网卡,主要有两个原因,
第一:万兆网卡的pps,bps的性能远好于千兆网卡。
第二:虚拟机系统对万兆网卡的SR-IOV支持好于千兆网卡SR-IOV。
在SR-IOV网卡分给虚拟机之后,虚拟机系统内部需要有对应的VF驱动,笔者曾亲测在千兆网卡I350上做SR-IOV给虚拟机使用,在windows 2008 R2的虚拟机内,网卡驱动即使升级到最新,windows自带的性能监视器里也看不到网卡的PPS性能数据。当时就这个问题,咨询过Intel的技术专家,定位为网卡驱动问题,最终他们建议使用万兆网卡替代。
配置步骤如下:
第一步、初始化创建SR-IOV网卡的VF
使用SR-IOV需要一块万兆网卡,比如,Intel 82599或者Intel X540(本文开头有介绍目前intel支持SRIOV的网卡型号)
如果网卡不是服务器上只带的,是外置的PCI-E网卡,注意需要接在PCI-E x16的插槽上
在BIOS中打开VT-d和SR-IOV的支持,以HP的服务器为例
图2,开启VT-d
图3,开启SR-IOV
4. 宿主机为CentOS6.7 的情况下,最好能升级一下万兆网卡驱动到 ixgbe-4.3.1
#tar zxf /root/ixgbe-4.3.15.tar.gz #cd /root/ixgbe-4.3.15/src #make install #rmmod ixgbe #modprobe ixgbe |
5. grub里面添加iommu的支持
#sed -i 's/quiet nomodeset/& intel_iommu=on/g' /boot/grub/grub.conf |
6. 添加万兆网卡的模块配置文件ixgbe.conf,如下配置表示两个万兆网口,各添加10个虚拟网卡VF
#cat /etc/modprobe.d/ixgbe.conf options ixgbe max_vfs=10,10 |
注意:如果网卡上接的第三方兼容的光模块,需要在加载驱动的时候,添加allow_unsupported_sfp=1,1 否则该网卡会无法识别
#cat /etc/modprobe.d/ixgbe.conf options ixgbe max_vfs=10,10 allow_unsupported_sfp=1,1 |
7. 因为我们创建出来的VF都是直接给虚拟机用的,所以在/etc/modprobe.d/blacklist.conf文件中,禁止加载ixgbevf驱动,添加内容如下:
blacklist ixgbevf
8. 重启服务器,之后使用lspci,20个VF已经创建好了
[root@localhost ~]# lspci|grep 'Virtual Function' 07:10.0 Ethernet controller: Intel Corporation 82599 Ethernet Controller Virtual Function (rev 01) ... //输出内容省略19条 |
第二步、编辑虚拟机xml配置文件,添加SR-IOV网卡
在虚拟机的xml配置文件中添加,如下这段配置
说明:
定义的虚拟机网卡的mac地址
中定义的VF的pci地址
pci地址通过以下方式获得
[root@localhost ~]# lspci|grep 82599 //获取82599 万兆网卡pci信息 07:00.0 Ethernet controller: Intel Corporation 82599ES 10-Gigabit SFI/SFP+ Network Connection (rev 01) [root@localhost ~]# virsh nodedev-list|grep 07_00_0 //利用07:00.0查询nodedev-list中pci地址 pci_0000_07_00_0 [root@gcloud-njlj-sriov-54-55 ~]# virsh nodedev-dumpxml pci_0000_07_00_0 //列出这个PF下所有VF的pci地址
pci_0000_07_00_0 ... //此处省略多行无关输出 82599ES 10-Gigabit SFI/SFP+ Network Connection Intel Corporation //这里就是vf的pci地址了,将这段内容放到上面的xml就把这个vf分给这台虚拟机了 ... //此处省略多行无关输出
|
第三步、升级虚拟机内部的网卡驱动
目前SR-IOV网卡支持的虚拟机系统
为了提供更好的性能,需将网卡驱动做升级,特别是windows系统,默认只带的版本,在性能监控方面无法采集到数据
第四步、平台整合
对于没有平台的用户来说,独立使用的话,做到第三步就可以了,但是如果需要整合到平台的话,需要注意以下几点
对虚拟机迁移功能需要做独立开发,配置了SR-IOV的虚拟机不支持在线迁移,但必须支持离线迁移
VF的使用情况,需要有登记,分配过程中,必须杜绝,vf 的mac重复。简单的做法,可以在虚拟机关机之后,使用 /sbin/ip link set eth4 vf 0 mac 0,来重置vf的mac。
至此,SR-IOV在KVM中应用的介绍就结束了。