NetAdapterCx 接收方缩放 (RSS)

接收方缩放 (RSS) 是一种网络驱动程序技术,可实现在多处理器系统中跨多个 CPU 高效分布网络接收处理。 RSS 利用系统中所有可用处理器并动态重新平衡 CPU 工作负载,从而提高系统性能并提高网络可伸缩性。

本主题重点介绍 NetAdapterCx 客户端驱动程序的 RSS,并假定读者了解 RSS 概念和术语。 有关 RSS 的一般信息,包括说明不同硬件方案中 RSS 的关系图,请参阅 接收方缩放

NetAdapterCx 中的 RSS 概述

NetAdapterCx 中的 RSS 侧重于易于配置、启用和禁用的简单性以及处理器到中断复杂性的抽象。 支持 RSS 的 NIC 的客户端驱动程序只需满足三个条件即可在 NetAdapterCx 中支持 RSS:

  1. 驱动程序必须在启动网络适配器时设置 RSS 功能,但在调用 NetAdapterStart 之前。 这包括实现四个 RSS 回调并在 RSS 功能结构中注册它们。
  2. 必须创建驱动程序的数据路径队列,并准备好接受请求。
  3. 驱动程序必须处于 D0 电源状态。

NetAdapterCx 中的 RSS 设计保证系统在 启动序列结束之前不会调用客户端的 RSS 回调并启用 RSS。 客户端无需管理间接表移动请求或处理其他 RSS 事件,直到它们所需的一切准备就绪。

稍后,当驱动程序卸载时,NetAdapterCx 不会在 断电序列期间销毁数据路径队列后调用 RSS 回调。 由于数据路径队列在关机期间作为第一步进行拆除,这意味着客户端不必在关机期间处理任何其他阶段可能的 RSS 事件。

设置 RSS 功能

若要开始使用 NetAdapterCx 中的 RSS,请执行以下步骤:

  1. 启动网络适配器时,请使用 NET_ADAPTER_RECEIVE_SCALING_CAPABILITIES 结构告知系统硬件的 RSS 功能和约束。
  2. 通过调用 NET_ADAPTER_RECEIVE_SCALING_CAPABILITIES_INIT 初始化功能结构。
  3. 初始化 RSS 功能结构时,设置结构的 RSS 回调成员以注册这些回调的实现:
    1. EvtNetAdapterReceiveScalingEnable
    2. EvtNetAdapterReceiveScalingDisable
    3. EvtNetAdapterReceiveScalingSetHashSecretKey
    4. EvtNetAdapterReceiveScalingSetIndirectionEntries
  4. 根据需要设置 RSS 功能结构的 SynchronizeSetIndirectionEntries
  5. 将初始化的 RSS 功能结构传递给 NetAdapterSetReceiveScalingCapabilities 方法。

启用和禁用 RSS

设置 RSS 功能后,系统将继续执行驱动程序的通电顺序。 创建数据路径队列的最后步骤完成后,NetAdapterCx 开始调用驱动程序的 RSS 回调。 此时,系统可根据需要启用和禁用 RSS。

重要

启用或禁用 RSS 时 ,不应 清除或重置间接寻址表。 框架将设置初始间接寻址表状态。

启用 RSS

NetAdapterCx 通过调用驱动程序的 EvtNetAdapterReceiveScalingEnable 回调来启用 RSS。 在此回调的上下文中,通常会在硬件中启用控制位。

有关启用 RSS 的代码示例,请参阅 EvtNetAdapterReceiveScalingEnable

禁用 RSS

NetAdapterCx 通过调用驱动程序的 EvtNetAdapterReceiveScalingDisable 回调来禁用 RSS。 在这里,通常禁用之前在 EvtNetAdapterReceiveScalingEnable 中设置的硬件中的控制位。

有关禁用 RSS 的代码示例,请参阅 EvtNetAdapterReceiveScalingDisable

设置哈希密钥

启用 RSS 后,NetAdapterCx 会调用 EvtNetAdapterReceiveScalingSetHashSecretKey 回调,为驱动程序提供 NIC 在验证哈希计算时应使用的哈希密钥。 如果哈希密钥发生更改,则可以随时在 RSS 运行时调用此回调。

有关设置哈希密钥的代码示例,请参阅 EvtNetAdapterReceiveScalingSetHashSecretKey

移动间接表条目

当 RSS 在系统上运行时,上层协议驱动程序会监视处理器工作负载,并维护一个间接表,用于将接收队列映射到处理器。 当协议驱动程序需要在 RSS 中重新平衡处理器工作负荷时,它首先计算每个间接表条目到新处理器的新映射。 然后,协议将此信息传递给 NetAdapterCx,后者会代表 NIC 客户端驱动程序处理将接收队列和硬件中断向量映射到正确处理器的复杂性。 NetAdapterCx 将新的间接寻址表(其中条目映射到接收队列 ID)存储在 NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES 结构中,并在调用 EvtNetAdapterReceiveScalingSetIndirectionEntries 回调函数时将其传递给驱动程序。

在此回调中,将 NIC 的间接寻址表中的每个条目移动到指定的接收队列。 NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES数组中的每个NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRY结构都包含表中该条目的哈希索引、要向其分配条目的新接收队列,以及指示单个移动是否成功的状态字段。

将索引条目分配给硬件接收队列的方法取决于 NIC 的设计以及它拥有的接收队列数。 有关详细信息和代码示例,请参阅 EvtNetAdapterReceiveScalingSetIndirectionEntries

异类 CPU 支持

重要

异类 CPU 支持是一项预发布功能,在商业发布之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。

异质 CPU 系统使用多种类型的内核,这些内核具有不同的时钟速度和功能。 与每个核心彼此相同的同质多处理器系统相比,异类 CPU 系统可以更好地适应动态计算负载并降低能耗。

从 WDK 预览版 25197 开始,NetAdapterCx 通过有效利用各种核心类型提供异质 CPU 系统支持。 当 RSS 正在运行时,系统会根据客户端驱动程序收到的流量工作负载决定要使用的处理器。 当接收的流量较少时,更小、更节能的核心可以处理流量。 当存在更多流量时,需要更大、性能更高的内核来持续轮询收到的数据包。

若要选择加入异源系统支持,系统管理员必须将 *RSSProfile标准化 INF 关键字 设置为 NdisRssProfileBalanced。 这是异质系统的默认配置文件。 若要允许系统确定要使用的最佳核心,不能设置 RSS 高级关键字。

异质系统也支持其他 RSS 配置文件。 如果要控制系统上的 RSS 基本处理器编号和 RSS 最大处理器编号等高级设置,则应使用不同的 RSS 配置文件。

还可以在同类 CPU 系统上使用 NdisRssProfileBalanced 。 在这种情况下,系统将决定将哪些处理器用于 RSS。