NetAdapterCx 接收端缩放 (RSS)
接收方缩放 (RSS) 是一种网络驱动技术,能在多处理器系统中将网络接收处理有效地分配给多个 CPU。 RSS 可利用系统中所有可用处理器,动态重新平衡 CPU 工作负载,从而提高系统性能,增强网络可扩展性。
本主题重点介绍 NetAdapterCx 客户端驱动程序的 RSS,并假设你已了解 RSS 概念和术语。 有关 RSS 的详细信息,包括不同硬件情况下 RSS 的示意图,请参阅接收方缩放。
NetAdapterCx 中的 RSS 概述
NetAdapterCx 中的 RSS 侧重于配置的简便性、启用和禁用的简单性以及处理器到中断复杂性的抽象性。 支持 RSS 的 NIC 客户端驱动程序只需满足三个条件即可在 NetAdapterCx 中支持 RSS:
- 在启动网络适配器时,但在调用 NetAdapterStart 之前,驱动程序必须设置 RSS 功能。 这包括实现四个 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 结构中,并在调用 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。