专栏名称: 运维帮
互联网技术分享平台,分享的力量。帮主一直坚信技术可以改变世界,从毕业到现在干了15年运维,有许多话要和你说。
目录
相关文章推荐
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-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 分给这台虚拟机了







请到「今天看啥」查看全文