善假于“物”——网卡RSS技术


        在介绍VMQ之前,我们先来看看在传统的物理服务器上,网卡是如何接收网络数据的。在多核CPU出现的时候,因为网卡不支持将网络流量中断到多个逻辑核而是中断到其中一个逻辑核进行处理,这样就造成CPU使用不平均以及降低了CPU处理网络流量的效率,如图1所示。

Hyper-V 性能加速之VMQ_第1张图片

图1 网卡中断一个CPU逻辑核接收数据

        而现在大部分的网卡都已经支持接收端缩放(Receive SideScaling,以下简称为RSS),物理机网卡如果支持多个硬件接收队列,则会将接收的数据分发到网卡的多个队列里,在具备多核的物理服务器上,通过网卡的RSS技术将多个队列中断不同的CPU逻辑核来提高数据接收效率,如图2所示。RSS技术的目的在于为队列找到最佳的CPU逻辑核来平衡网络的CPU开销。

Hyper-V 性能加速之VMQ_第2张图片

图2 RSS队列中断多个CPU逻辑核接收数据

 

Hyper-V虚机队列的工作方式

        虚拟化环境的情况比物理环境要复杂些,其一是因为物理机网卡发生“形变”成虚拟交换机之后网卡丧失了RSS功能,其二是由于物理机上运行了若干台虚机,物理机和虚机通过相同的网卡接收数据包,所以需要寻求同等有效的方法来平衡网络的CPU开销,并同时保证虚机的网络性能。VMQ技术因需而生,VMQ是一种特殊的队列,采用和网卡硬件类似的队列,并采用类似于RSS为队列中断不同的CPU逻辑核的机制。所不同的是,VMQ筛选和分配数据包与网卡硬件队列的逻辑不一样,在只有物理机的情况下,物理机的网卡只考虑物理机自己数据队列,而在虚拟化环境中虚拟交换机不仅要平衡物理机的队列还要照顾虚机的队列。

        在介绍VMQ工作原理之前,我们先来了解虚拟交换机数据包的路由路径,Hyper-V虚拟交换机存在两种队列—VMQ和默认队列。默认队列的数据先后通过虚拟交换机的路由、筛选、扩展、访问控制列表和转发路径,最后由虚机总线进行数据分发,如图3所示。


Hyper-V 性能加速之VMQ_第3张图片

图3 虚拟交换机数据转发路径

        VMQ队列在分发数据给队列之前先将虚机虚拟网卡的MAC地址收集起来,然后通过VMQ MAC筛选器为启用了VMQ的虚机分配VMQ队列,未启用VMQ的虚机和不能匹配VMQ MAC筛选器的数据将继续放置在默认队列里。VMQ队列不像默认队列一样通过完整的路由、筛选、扩展、访问控制列表和转发路径,而是“插队”到扩展通过更少的路由代码发送数据给虚机总线,数据由虚机总线发送给虚拟网卡后,虚机使用虚拟RSS(vRSS)技术为虚拟网卡上的队列中断虚拟CPU,如图4所示。


Hyper-V 性能加速之VMQ_第4张图片

图4 VMQ队列和默认队列

         从图4中我们可以清楚地认识到VMQ带来的好处。如果虚机网卡属性启用了VMQ功能,虚拟交换机将绕过虚拟交换机层层路由代码,如此一来可以保证数据能够精确而快速地将转发给虚机,对比没有VMQ的情况下,不但可以减少处理路由所需CPU资源占用,而且可以降低数据传送的延迟。

        VMQ又有动态和静态的区分,静态VMQ指的是VMQ队列和中断的CPU逻辑核关联关系是固定的。图4是典型的静态VMQ,网卡里给虚拟1分配的VMQ队列和逻辑CPU1关联,给虚拟2分配的VMQ队列和逻辑CPU2关联,在虚机1和虚机2整个生命周期内不会改变,可以认为虚机1的数据一直由逻辑CPU1处理,而虚机2的数据一直由逻辑CPU2处理。静态VMQ在虚机关联的CPU繁忙时可能会导致虚机网络处理变慢,因此从WindowsServer 2012 R2开始引入了动态VMQ的机制,动态VMQ更加智能,顾名思义动态VMQ允许虚机网络根据负载和其关联的逻辑CPU进行动态关联调整。如图5所示,当逻辑CPU2处于相对空闲状态时,虚机1和虚机2的VMQ队列都关联到逻辑CPU2。


Hyper-V 性能加速之VMQ_第5张图片

图5 动态VMQ

         在了解VMQ和动态VMQ基本原理后,我们可以实际了解下网卡的RSS和虚拟网卡的vRSS默认接收队列数和默认使用处理器数量信息,通过以下示例命令和结果可以显示网卡的队列数和使用的处理器数,示例中的Ethernet4这块网卡RSS默认接收队列数为8,默认使用最多处理器数量为16。

PS C:\> Get-NetworkAdapterRss -Name  “Ethernet 4”


Name

: Ethernet  4

InterfaceDescription

: Intel Ethernet CNA X540-T2  #2

Enabled

: True

NumberOfReceiveQueues

: 8

Profile  

: NUMAStatic  

BaseProcessor:[Group:Number]  [Group:Number]  [Group:Number]  [Group:Number]

: 0

MaxProcessor:[Group:Number]【[][Group:Number]

: :

MaxProcessors 

: 16

        其中几个重要的参数说明如下:

  • Enabled:启用或者禁用RSS;

  • BaseProcessor:系统分配给网卡的最小处理器数量;[Group:Number] – 处理器组数量和处理器数量比。

  • MaxProcessor:分配给网卡的最大处理器数量;[Group:Number] - 处理器组数量和处理器数量比。

  • MaxProcessors:分配给网卡的处理器总数的最大值。

        我们可以通过Set-NetAdapter命令设置参与接收队列数和RSS中断的最大CPU数量,如下示例将网卡Ethernet4的RSS默认接收队列数为16。

PS C:\> Set-NetworkAdapterRss -Name  “Ethernet 4” -NumberOfReceiveQueues 16

Name

: Ethernet  4

InterfaceDescription

: Intel Ethernet CNA X540-T2  #2

Enabled

: True

NumberOfReceiveQueues

: 16

Profile  

: NUMAStatic  

BaseProcessor:[Group:Number]  [Group:Number]  [Group:Number]  [Group:Number]

: 0

MaxProcessor:[Group:Number]【[][Group:Number]

: :

MaxProcessors 

: 16

       虚机VMQ开启关闭也比较简单,默认情况下,Hyper-V虚机会启用VMQ功能。我们可以依据虚机是否需要VMQ和实际的网卡性能进行开启或者关闭。如果虚机过多而网卡的VMQ队列又不足时,我们还可以适时为启用了VMQ的虚机设置VMQ权重,权重高的虚机网络数据将优先置于VMQ队列,反之亦然,默认的VMQ权重是100,如下示例所示。

PS C:\> Set-NetworkAdapterRss -Name  “Ethernet 4” -NumberOfReceiveQueues 16

VMQWeight  : 100