作者简介:
杨俊俊,资深
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
分给这台虚拟机了