接收端缩放(RSS)是一种网络驱动技术,使得在多处理器系统中可以在多个 CPU 之间高效分配网络接收处理。 RSS 通过利用系统中的所有可用处理器并动态重新平衡 CPU 工作负荷来提高系统性能并提高网络可伸缩性。
本主题重点介绍 NetAdapterCx 客户端驱动程序的 RSS,并假定了解 RSS 概念和术语。 请参阅 接收端缩放以获取更多有关 RSS 的一般信息,其中包括展示不同硬件方案中 RSS 的图示。
NetAdapterCx 中的 RSS 概述
NetAdapterCx 中的 RSS 侧重于配置的简便性、启用和禁用的简单性,以及简化处理器与中断复杂性的抽象。 支持 RSS 的 NIC 的客户端驱动程序只需要满足三个条件才能在 NetAdapterCx 中支持 RSS:
- 驱动程序必须在启动 NET 适配器时设置 RSS 功能,但在调用 NetAdapterStart 之前。 这包括实现四个 RSS 回调并在 RSS 功能结构中注册它们。
 - 必须创建驱动程序的数据路径队列并准备好接受请求。
 - 驱动程序必须处于 D0 电源状态。
 
NetAdapterCx 中的 RSS 设计确保系统在 上电序列结束之前,不会调用客户端的 RSS 回调函数或启用 RSS。 客户端无需管理间接表移动请求或处理其他 RSS 事件,直到所需的一切准备就绪。
稍后,当驱动程序卸载时,NetAdapterCx 在 关闭电源顺序期间销毁数据路径队列后,不会调用 RSS 回调。 由于数据路径队列在停电过程中作为第一步被拆毁,这意味着客户端不必在关闭电源期间处理任何其他阶段可能的 RSS 事件。
设置 RSS 功能
若要在 NetAdapterCx 中开始使用 RSS,请执行以下步骤:
- 启动网络适配器时,使用 NET_ADAPTER_RECEIVE_SCALING_CAPABILITIES 结构告知系统有关硬件的 RSS 功能和约束。
 - 通过调用 NET_ADAPTER_RECEIVE_SCALING_CAPABILITIES_INIT初始化功能结构。
 - 初始化 RSS 功能结构时,请将结构的 RSS 回调成员设置为注册这些回调的实现:
 - 根据需要设置 RSS 功能结构的 SynchronizeSetIndirectionEntries 。
 - 将初始化的 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 将新的重定向表存储在 NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES 结构中,其中的条目与接收队列 ID 相关联,并在调用 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 的处理器。