本文最初由戴尔Windows工程团队的Abhijit Khande和Vineeth V Acharya撰写。
欢迎评论!要提出主题建议或提出其他意见,请联系 WinServerBlogs@dell.com。
借助 Microsoft® Windows Server® 2012 Beta 操作系统,Microsoft 引入了对网络领域许多功能的支持。一个如此重要和有趣的功能是
单根 I/O 虚拟化 (SR-IOV),允许虚拟机共享单个 PCI-e 设备。这篇文章提供了 Windows Server 2012 Beta 中 SR-IOV 的基本概述,以及它如何在网络 I/O 期间大幅降低虚拟化环境中的 CPU 利用率。
SR-IOV 接口是 PCI Express (PCIe) 规范的扩展。SR-IOV 允许单个 PCIe 设备(如网络适配器)在 PCI 总线上提供多个轻量级硬件表面,并在各种实例之间单独访问其资源。除了(通常的)物理功能 (PF) 之外,它还通过使用多个虚拟功能 (VF) 来实现。由于它依赖于硬件,因此 PCIe 设备和平台必须都支持此功能。
传统上,发往虚拟机的数据包由主机操作系统中存在的物理网络适配器(使用物理功能)接收。此数据包由 NDIS(NIC 的网络驱动程序接口规范)驱动程序模块处理。然后,数据包将提供给 Hyper-V 交换机,后者处理数据包(例如路由、VLAN 筛选),并通过 VMBus 将数据包转发到目标虚拟机,如图 1 所示。当虚拟机必须发送数据包时,将遵循反向路径。
借助 SR-IOV,VM 可以使用虚拟功能 (VF) 直接向物理网络适配器发送和接收数据包,完全绕过传统路径,如图 1 所示。这不仅提高了网络 I/O,还减少了主机 CPU 的开销。
图 1:带和不带 SR-IOV 的数据路径
Live Migration 和 SR-IOV
在 Windows Server 2012 Beta 中,可以在 VM 使用 SR-IOV 的情况下执行实时迁移。如果源系统和目标系统支持 SR-IOV,并且目标具有可用的 VF,则虚拟机将使用虚拟功能。否则,虚拟机将恢复为传统路径 (VM-Bus)。
每个支持 SR-IOV 的网络适配器都公开固定数量的虚拟功能,可以通过运行 PowerShell 命令“Get-NetAdapterSriov”来获取这些功能。
性能分析
我们在实验室中执行了一些测试,以比较使用和不使用 SR-IOV 时的性能。测试环境由一个测试服务器(在其上执行测试)和一个文件服务器组成。测试服务器是配备 Intel® X520 10GB 以太网适配器和 Windows Server 2012 Beta OS 的 Dell PowerEdge™ R710 II。文件服务器托管多个 SMB 共享,并通过 Dell PowerConnect™ 8024 交换机使用 10 GB 网络连接到测试服务器。
我们根据参与网络数据传输的不同驱动程序模块安排的 DPC(延迟过程调用)所使用的 CPU 捕获了性能数据。此数据是在来宾和主机操作系统中捕获的,如以下情形中所述。测试服务器具有 4 个与来宾操作系统相同的 Windows Server 2012 Beta 虚拟机。4 台虚拟机通过虚拟交换机连接到 10 GB 网络。此测试配置如图 2 所示。
图 2:测试配置
在我们展示性能数据之前,请务必介绍用于此测试的一个非常关键的参数。在
Microsoft Windows 操作系统中存在一种称为延迟过程调用 (DPC) 的系统机制,它允许高优先级任务(例如
中断处理程序) 将必需但优先级较低的任务推迟到以后执行。这允许设备驱动程序和其他低级别事件使用者快速执行其处理的高优先级部分,并计划非关键的其他处理以较低的优先级执行。
情景 1 — 虚拟机(来宾操作系统)中的性能结果:
我们在此方案中使用了四个虚拟机 (VM)(VM 1 到 VM 4)。我们在虚拟机 1 和虚拟机 2 上启用了 SR-IOV(通过选中虚拟机设置中的“启用 SR-IOV”选项),并在虚拟机 3 和虚拟机 4 上禁用了 SR-IOV(通过取消选中相同的选项)。因此,VM 1 和 VM 2 将使用虚拟功能(由 Intel 适配器公开),而 VM 3 和 VM 4 将使用合成路径 (VMBus) 进行任何网络通信,如图 2 所示。
我们开始将数据(大小为 20 GB)从单个 SMB 共享复制到虚拟机,并在来宾操作系统中捕获系统 CPU 使用情况日志。
图 3:虚拟机
中的 DPC CPU 使用率 在图 3 中,SR-IOV 是指 VM-1 和 VM-2 中的平均 DPC CPU 使用率,非 SR-IOV 是指 VM-3 和 VM-4 中的平均 DPC CPU 使用率。如果我们看一下图表,我们会看到两种情况之间的 CPU 使用率没有太大差异,但我们还没有考虑主机中的 CPU 使用率。
方案 2 — 主机(主机操作系统)中的性能结果:
在此场景中,我们使用了一个虚拟机。我们开始将数据(大小为 20 GB)从 SMB 共享复制到虚拟机,并捕获了网络 I/O 中使用的 2 个模块(NDIS 和 VMBUS)的 DPC CPU 使用情况。
图 4:主机
中的 DPC CPU 使用情况 结果如图 4 所示。正如预期的那样,两种情况(SR-IOV 和非 SR-IOV)之间的 CPU 使用率存在巨大差异。对于 SR-IOV,CPU 使用率约为 102;对于非 SR-IOV,CPU 使用率约为 103 - 104。这主要是因为在 SR-IOV 的情况下,虚拟机通过虚拟功能直接与物理 NIC 通信。因此,主机的 CPU 周期不会用于处理任何网络数据包。在非 SR-IOV 的情况下(如图 1 所示),来宾操作系统通过虚拟机总线与主机操作系统通信,主机总线又处理数据包并通过物理 NIC 发送数据包。因此,VM Bus 和 NDIS 等模块被广泛使用。
在计算总 CPU 使用率时,我们观察到,使用 SR-IOV 时,网络 I/O 期间的 CPU 利用率要低得多。因此,启用了 SR-IOV 的 Windows Server 2012 Beta 将帮助客户减少网络 I/O 期间的 CPU 开销,从而提高整体系统性能。
使用 PowerShell 配置 SR-IOV
您可以使用以下 PowerShell 命令创建启用了 SR-IOV 的新虚拟交换机,并将该虚拟交换机连接到现有虚拟机的虚拟网络适配器。
注意:运行以下命令之前,应在 BIOS 中启用以下选项
(假设连接了单个网络适配器 (Intel X520))
$NetAdap = Get-NetAdapter |Where-Object { $_.Status -eq “Up”}
(-EnableIov switch 用于在虚拟交换机中启用 SR-IOV)
New-VMSwitch -Name “SRIOV Switch” -NetAdapterName $NetAdap.Name -AllowManagementOS $True -Notes “SRIOV Switch on X520” -EnableIov $True
$VMSw = Get-VMSwitch
将新的网络适配器添加到 VM-1 并将其连接到虚拟交换机。
Add-VMNetworkAdapter -SwitchName $VMSw.Name -VMName VM-1 -Name “SRIOV Adapter”
NOTE:要使此命令正常工作,必须关闭
VM )
You can also use an already existing VM network adapter by using the following commands)
$VMNet = Get-VMNetworkAdapter -VMName VM-1
Connect-VMNetworkAdapter -VMName VM-1 -SwitchName $VMSw.Name -Name $VMNet.Name
每个虚拟机网络适配器都有两个属性 IovWeight 和 VmqWeight,分别对应于 SR-IOV 和 VMQ。 调整这些权重可启用或禁用这些功能。