第一章 SR-IOV介绍
1.1 概述
SR-IOV(Single Root I/O Virtualization)是一种基于硬件的虚拟化解决方案,它允许多个云主机高效共享PCIe设备,且同时获得与物理设备性能媲美的I/O性能,能有效提高性能和可伸缩性。可适用于网络NFV、云游戏、视频流(UDP)等对网络性能、传输速度要求较高的应用场景。本文将以型号为Mellanox Technologies MT27710 Family [ConnectX-4 Lx]的物理网卡为例,详细介绍ZStack SR-IOV在Linux系统和Windows系统中的安装使用,以及带SR-IOV的VF云主机网络性能和普通虚拟机网卡网络性能之间的对比。
1.2 SR-IOV原理介绍
ZStack支持基于SR-IOV规范,通过硬件技术,将物理网卡(PF)虚拟化切割成多张虚拟(VF)类型网卡,直接分配给云主机使用的功能。与传统的KVM里数据包传输过程相比,VF网卡可越过虚拟化层,缩短数据传输路径,使云主机获得接近物理设备的I/O性能,明显减少数据传输对物理机CPU资源的消耗,即使物理机CPU压力较大,也能有效减少网络丢包,提高传输效率,如下图所示:
SR-IOV属于VT-d技术的一个分支,VT-d 的性能非常好,但是它的物理设备只能分配给一个虚拟机使用。为了实现多个虚拟机共享一个物理设备,并且达到直接分配的目的, SR-IOV以原生地支持实现多个客户机共享一个设备的效果,广泛应用在网卡上。
SR-IOV引入了两种功能类型:
1)物理功能(Physical Function,PF)
用于支持 SR-IOV 功能中的 PCI 功能,如 SR-IOV 规范定义。PF 包含 SR-IOV 功能结构,用于管理 SR-IOV 功能。PF 是全功能的 PCIe 功能,可以像其他任何 PCIe 设备一样对数据进行发现、管理和处理。PF 拥有完全的配置资源,可以用于配置或控制 PCIe 设备。
2)虚拟功能(Virtual Function,VF)
与物理功能关联的一种功能。VF 是一种轻量级 PCIe 功能,可以与物理功能以及同一物理功能关联的其他 VF 共享一个或多个物理资源。VF仅允许拥有用于其自身行为的配置资源。
每个SR-IOV设备都可有一个PF,并且每个PF有其关联的VF。PF可以通过寄存器创建VF,这些寄存器设计有专用于此目的的属性。
在PF中启用了SR-IOV,就可以通过PF的总线、设备和功能编号,访问各个VF的PCI配置空间,实现弹性灵活使用资源的同时,提高资源利用率、节约成本。如下图所示:
第二章 SR-IOV使用流程
2.1 准备工作
说明:本文档采用ZStack3.9.0版本,服务器网卡以Mellanox Technologies MT27710 Family [ConnectX-4 Lx]为例
1)配置物理机BIOS,打开SR-IOV功能,并打开Intel(R) VT。不同服务器的BIOS中启动IOMMU的方法有差别,可根据实际情况配置。
2)请确保物理网卡支持SR-IOV,并开启SR-IOV,如下图所示:
3)可在System setup中Number of virtual functions设置物理网卡的较大切割数,例如:假设该物理网卡可支持切割64个VF,在Number of virtual functions中,设置该物理网卡较大切割数为8,那么在平台中,对于该网卡较多支持切割8个VF网卡。
4)执行命令lspci |grep -i eth检查当前服务器pci插槽号、网卡型号和网卡数量,执行命令lspci -s 3b:00.1 -v显示3b:00.1设备上的功能块信息,检查该网卡是否开启SR-IOV。
5)上述参数修改完成后,重启服务器,重启之后进入系统执行以下脚本,检查Interrupt Remapping功能是否开启;
输出"No interrupt remapping support found"或"Interrupt remapping not supported"表示CPU不支持Interrupt Remapping,无输出则表示CPU支持Interrupt Remapping。
如果不支持则必须执行以下框架内的配置才可做VF透传,否则会报错:failed to set iommu for container: Operation not permitted
echo "options vfio_iommu_type1 allow_unsafe_interrupts=1" > /etc/modprobe.d/iommu_unsafe_interrupts.conf
注:如果物理机Linux没有自带的PF驱动,需要手动安装PF驱动;如果云主机Linux/Windows没有自带的VF驱动,需要手动安装VF驱动,对应的网卡驱动需找到其官方网站进行下载。
2.2 SR-IOV网卡切割
基于ZStack平台SR-IOV功能切分
平台物理机网卡切割方式如下:
前提条件:
a. 请确保此物理网卡支持SR-IOV切割;
b. 请确保待切割物理网卡所在物理机的BIOS中已开启Intel VT-d/AMD IOMMU和SR-IOV功能;
c. 请确保云平台中添加的物理机IOMMU状态为“可用”。
网卡切割:
1)点击物理机名称,外接设备,勾选要切割的物理网卡,再点击操作,即可对该物理网卡进行SR-IOV切割,如下图所示:
2)根据物理网卡所设置的较大切割数,可自定义设置该物理网卡所切割的VF类型的网卡数量,VF切割数量越多,性能越差;对已切割的物理网卡,不支持动态修改已切割值,即“已虚拟化”状态不支持切割,“可虚拟化”状态才支持切割,如下图所示:
3)物理网卡切割完成后可查看当前VF虚拟网卡可用量及总量,如下图所示:
第三章 场景实践
在ZStack平台中为云主机分配的SR-IOV_VF网卡IP地址配置可采用:DHCP动态分配或手动静态配置两种模式;手动静态配置IP地址的方法可参考对应系统静态IP配置方法,Windows系统IP地址较为简单可以直接在图形界面配置即可;如果云主机系统为Linux发行版本,则需要遵守各发行版本IP配置方法进行配置;本次示例以DHCP模式举例说明。
3.1 Linux系统分配VF网卡
物理机相关准备工作完成后,请登录云平台,对物理机网卡进行切割,请参考2.2 SR-IOV网卡切割使用vf网卡创建云主机,详情请参考如下文所示:
1)创建二层网络,勾选启用SR-IOV
2)创建三层网络选用勾选了SR-IOV功能的二层网络。
3)创建云主机,选择三层网络,勾选启用SR-IOV。
4)检查云主机网卡类型为VF,正常打开云主机控制台,检查网络是否可正常连通。
3.2 Windows系统分配VF网卡
说明:对于Windows客户机系统,有少数的新Windows系统(如Windows 8、Windows10)默认带有网卡驱动,而多数的Windows系统 (如Windows 7、Windows 2008 Server、windows2012 Server等)都没有默认带有相关的驱动,需要自行下载和安装。本次示例以Window2012R2为例,举例说明,仅供参考。
1)上传一个Window ISO,本文,以Windows 2012R2为例,镜像格式选择iso平台,再选择Windows,如下图所示:
2)根据物理网卡型号,在对应的官网下载网卡驱动到本地,本次示例网卡型号为:Mellanox Technologies MT27710 Family [ConnectX-4 Lx],对应的网卡驱动下载地址为:https://cn.mellanox.com/products/adapter-software/ethernet/windows/winof-2
下载windows server 2012 R2对应的驱动,如下图所示:
注:由于平台支持上传镜像格式为iso,故需将该exe程序,制作成iso格式,加载给云主机提供驱动,本次示例以UItraISO工具转换为例,如下图所示:
进行保存,为ISO重新命名,如下图所示:
3)上传网卡驱动到云平台,镜像格式选择iso,平台推荐选择other。创建云主机,选择Windows2012R镜像,选择SR-IOV三层网络,勾选启用SR-IOV,点击高级>创建更多光驱>加载ISO添加网卡驱动,如下图所示:
4)安装Windows 2012R2系统。找到网卡驱动,双击打开驱动,双击运行网卡驱动程序,如下图所示:
5)如果出现“欢迎”界面,则点击下一步,如果出现如下显示,则表示/Windows/System32目录中缺少文件,需要在微软官网去下载相应的补丁,Windows server 2012 R2安装KB2999226前还需安装KB2919442、KB2919355两个补丁才可成功安装KB2999226补丁:
6)下载KB2919442、KB2919355、KB2999226补丁并上传到Windows server 2012 R2系统中。本次测试笔者采用的是USB透传,将相应的补丁上传到Windows server 2012 R2系统中;另外也可采用将KB文件制作成ISO的方式,上传到Windows系统内。方法不限,仅做参考,对应的链接如下:
KB2919442:https://www.microsoft.com/zh-cn/download/details.aspx?id=42153
KB2919355:https://www.microsoft.com/en-us/download/details.aspx?id=42334
KB2999226:https://www.microsoft.com/zh-CN/download/details.aspx?id=49063
7)在Windows系统中找到上传的KB2919442补丁,双击运行安装KB2919442,安装完成后,重启系统生效。安装步骤如下图所示:
8)同样的方法,在Windows系统中,双击KB2919355,安装补丁,安装完成后重启生效,最后安装KB2999226,安装步骤参考第7)。
9)找到网卡驱动位置,双击运行安装,如下图所示:
10)本次以自定义安装为例,点击下一步。
11)选择要安装的功能:
性能工具-安装用于衡量用户环境中的性能的性能工具
文档-包含用户手册和发行说明
管理工具-用于管理的安装工具,例如mlxstat
诊断工具-用于诊断的安装工具,例如mlx5cmd
本次安装需安装性能工具,故以性能工具为例,点击下一步。
12)点击Install开始安装。驱动安装好后,网络即可连接,点击“是”,连接网络。
13)点击Finish完成网卡驱动的安装,如下图所示:
14)在PowerShell中查看网络连通是否正常,如下图所示:
第四章 性能对比测试
4.1 网络性能对比
前面我们有提到,VF网卡与普通vNIC网卡相比较,性能更好,通过以下性能测试,来进行比较与证明。
注:本次测试采用跨物理机测试对比,具体参数如下:
基于vNIC网卡和vf网卡性能测试对比如下:
总结: 从以上数据不难看出,使用带SR-IOV的VF云主机网络性能,比虚拟化网卡网络,延迟和带宽性能都更好。
ZStack云平台使用SR-IOV功能需注意以下情况:
1)使用SR-IOV功能前,须严格确保准备工作全部完成,否则此功能无法正常使用。
2)若VF网卡已分配给云主机使用,请勿卸载物理网卡驱动,否则可能导致VF网卡被强行回收。
3)若物理网卡已配置bond,则继续使用SR-IOV功能,可能导致VF与vNIC网卡相互通信受影响,推荐使用方式如下:
针对单个物理网卡配置bond,并继续使用SR-IOV功能;
多个物理网卡配置bond时,仅对其中一个物理网卡进行SR-IOV切割。
4)VF网卡不支持QoS功能。
5)启用SR-IOV功能的三层网络创建的云主机,暂时不支持使用以下网络服务:
公有网络/扁平网络创建的云主机,其VF网卡不支持使用安全组和弹性IP网络服务。
云路由网络/VPC网络创建的云主机,其VF网卡不支持使用安全组网络服务。
6)运行状态且加载VF网卡的云主机,不支持数据的存储迁移操作,须停用云主机或卸载VF网卡,才能执行这类操作。
7)停用云主机,将自动释放VF网卡;启用云主机时则重新获取。若无可用VF网卡,将导致启用云主机失败。