最新消息:

SR-IOV在KVM中应用

kvm admin 6368浏览 0评论

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配置文件中添加,如下这段配置

<interface type=’hostdev’  managed=’yes’>

<mac address=’02:00:74:D3:0F:CC’/>

<source>

<address type=’pci’ domain=’0x0000′ bus=’0x07′ slot=’0x10′  function=’0x0′ />

</source>

</interface>

说明:

<mac address=’02:00:74:D3:0F:CC’/>定义的虚拟机网卡的mac地址

<source></source>中定义的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地址

<device>

<name>pci_0000_07_00_0</name>

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

<product id=’0x10fb’>82599ES 10-Gigabit SFI/SFP+ Network  Connection</product>

<vendor id=’0x8086′>Intel Corporation</vendor>

<capability type=’virt_functions’>

<address domain=’0x0000′ bus=’0x07′ slot=’0x10′  function=’0x0’/>    //这里就是vf的pci地址了,将这段内容放到上面的xml就把这个vf分给这台虚拟机了

<address domain=’0x0000′ bus=’0x07′ slot=’0x10′ function=’0x2’/>

<address domain=’0x0000′ bus=’0x07′ slot=’0x10′ function=’0x4’/>

<address domain=’0x0000′ bus=’0x07′ slot=’0x10′ function=’0x6’/>

<address domain=’0x0000′ bus=’0x07′ slot=’0x11′ function=’0x0’/>

<address domain=’0x0000′ bus=’0x07′ slot=’0x11′ function=’0x2’/>

<address domain=’0x0000′ bus=’0x07′ slot=’0x11′ function=’0x4’/>

<address domain=’0x0000′ bus=’0x07′ slot=’0x11′ function=’0x6’/>

<address domain=’0x0000′ bus=’0x07′ slot=’0x12′ function=’0x0’/>

<address domain=’0x0000′ bus=’0x07′ slot=’0x12′ function=’0x2’/>

</capability>

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

</device>

 

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

目前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中应用的介绍就结束了。

转载请注明:爱开源 » SR-IOV在KVM中应用

您必须 登录 才能发表评论!