专栏名称: 运维帮
互联网技术分享平台,分享的力量。帮主一直坚信技术可以改变世界,从毕业到现在干了15年运维,有许多话要和你说。
目录
相关文章推荐
InfoQ架构头条  ·  基于Java的无代码和低代码应用开发工具综述 ·  昨天  
51好读  ›  专栏  ›  运维帮

SR-IOV在KVM中应用

运维帮  · 公众号  · 运维  · 2016-09-20 08:15

正文

作者简介:

杨俊俊,资深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就已经提出来了,有人可能会问,一个六年前就已经被提出来的技术方案,为什么到现在,各大公有云都没有支持呢?可以归结为以下几点。

  1. SR-IOV需要特定的网卡支持,支持清单:http://www.intel.cn/content/www/cn/zh/support/network-and-i-o/ethernet-products/000005722.html

  2. SR-IOV在KVM应用中存在局限性,目前在线迁移的功能任然不完善。

  3. 大部分上云的服务器,对网卡的性能要求传统的网桥即可满足,所以动力不足。


KVM虚拟机在传统网桥模式下,网络稳定是没有问题的,但它和SR-IOV一个本质的区别是,网桥模式本身会消耗宿主机的CPU,在实际场景下,当宿主机的CPU压力(>60%)比较大时,虚拟机内部网卡的发包率(PPS)性能会下降,极端情况会出现丢包。这点对于游戏来说,直接的感觉就是卡屯和掉人,这在游戏业务中是绝对不允许的。


为了规避这个痛点,通常不敢上一些对网卡发包率压力非常高的游戏,或者通过降低虚拟化的比例,来保证宿主机的CPU压力在可控的范围内。


除此还有没有其他更好的办法呢?SR-IOV是一个不错的选择。


SR-IOV最适合的应用场景是什么?

  1. 宿主机CPU压力大(>60%)+虚拟机网卡发包率压力大(pps >5w)

  2. 虚拟机网卡发包率压力非常大(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


  1. 使用SR-IOV需要一块万兆网卡,比如,Intel 82599或者Intel X540(本文开头有介绍目前intel支持SRIOV的网卡型号)

  2. 如果网卡不是服务器上只带的,是外置的PCI-E网卡,注意需要接在PCI-E x16的插槽上

  3. 在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-listpci地址

pci_0000_07_00_0

[root@gcloud-njlj-sriov-54-55 ~]# virsh  nodedev-dumpxml pci_0000_07_00_0   //列出这个PF下所有VFpci地址

   pci_0000_07_00_0

...   //此处省略多行无关输出

     82599ES 10-Gigabit SFI/SFP+ Network  Connection

     Intel Corporation

     

       

    //这里就是vfpci地址了,将这段内容放到上面的xml就把这个vf分给这台虚拟机了

       

       

       

       

       

       

       

       

       

     

...   //此处省略多行无关输出

 

第三步、升级虚拟机内部的网卡驱动


目前SR-IOV网卡支持的虚拟机系统

  • Windows 服务器 2012

  • Windows 服务器 2012 R2

  • Windows 服务器 2008 * R2

  • Windows 服务器 2008

  • Linux * 2.6.30 内核或更高版本

  • Red Hat Enterprise Linux 6.0 * 和更高版本

  • SUSE Linux Enterprise 服务器 11 * SP1 和更高版本


为了提供更好的性能,需将网卡驱动做升级,特别是windows系统,默认只带的版本,在性能监控方面无法采集到数据


第四、平台整合


对于没有平台的用户来说,独立使用的话,做到第三步就可以了,但是如果需要整合到平台的话,需要注意以下几点

  1. 对虚拟机迁移功能需要做独立开发,配置了SR-IOV的虚拟机不支持在线迁移,但必须支持离线迁移

  2. VF的使用情况,需要有登记,分配过程中,必须杜绝,vf 的mac重复。简单的做法,可以在虚拟机关机之后,使用 /sbin/ip link set eth4 vf 0 mac 0,来重置vf的mac。


至此,SR-IOV在KVM中应用的介绍就结束了。



 

    购买UCloud阿里云推荐人写「运维帮」享会员优惠

    商务合作联系微信yunweibang555