接收端缩放(RSS)是一种网络驱动程序技术,可有效地在多处理器系统中的多个 CPU 之间分配网络接收处理。 RSS 通过减少处理延迟和优化系统中的 CPU 利用率来提高网络性能。
注释
由于同一核心处理器上的超线程 CPU 共享相同的执行引擎,因此效果与具有多个核心处理器不同。 因此,RSS 不使用超线程处理器。
为了有效地处理接收的数据,微型端口驱动程序接收中断服务函数安排一个延迟过程调用(DPC)。 如果没有 RSS,典型的 DPC 会反映 DPC 调用中的所有接收数据。 因此,与中断关联的所有接收处理在发生接收中断的 CPU 上运行。 有关非 RSS 接收处理的概述,请参阅 非 RSS 接收处理。
RSS 允许 NIC 和微型端口驱动程序在其他处理器上调度接收 DPC。 RSS 设计可确保与给定连接关联的处理保留在分配的 CPU 上。 NIC 实现哈希函数,生成的哈希值有助于选择 CPU。
下图演示了用于确定 CPU 的 RSS 机制。
NIC 使用哈希函数在收到的网络数据中基于定义的区域(哈希类型)计算哈希值。 定义的区域可以是不连续的。
哈希值的一些最小有效位(LSB)用于为间接表编制索引。 间接表中的值用于将接收的数据分配给 CPU。
有关指定间接表、哈希类型和哈希函数的更多详细信息,请参阅 RSS 配置。
借助于消息信号中断(MSI)支持,NIC 还可以中断与其关联的 CPU。 有关 NDIS 对 MSIS 的支持的详细信息,请参阅 NDIS MSI-X。
RSS 的硬件支持
下图说明了 RSS 的硬件支持级别。
RSS 的硬件支持有三个级别:
使用单个队列进行哈希计算:NIC 计算哈希值,微型端口驱动程序将收到的数据包分配给与 CPU 关联的队列。
具有多个接收队列的哈希计算:NIC 将接收的数据缓冲区分配给与 CPU 关联的队列。
消息信号中断(MSIs):NIC 会中断应处理收到的数据包的 CPU。
NIC 始终传递 32 位哈希值。
RSS 如何提高系统性能
RSS 可以通过减少以下方法来提高网络系统性能:
通过将来自 NIC 的接收处理分发到多个 CPU 上来减少延迟。
分布式接收处理有助于确保不会出现一个 CPU 负载过重而另一个 CPU 空闲的情况。
增加数据共享算法在同一 CPU 上执行的概率,从而减少旋转锁的开销。
当一个在 CPU0 上执行的函数持有一个旋转锁,而 CPU1 上运行的另一个函数需要访问相同的数据时,就会产生旋转锁开销。 CPU1 会旋转(等待),直到 CPU0 释放锁。
通过增加共享同一 CPU 上执行数据的软件算法的概率,重新加载缓存和其他资源。
例如,在 CPU0 上执行和访问共享数据的函数在后续中断中在 CPU1 上执行此类重新加载。
为了在安全环境中实现这些性能改进,RSS 提供以下机制:
分布式处理
RSS 将来自 DPC 中给定 NIC 的接收指示的处理分发到多个 CPU。
按顺序处理
RSS 保留接收数据包的传递顺序。 对于每个网络连接,RSS 进程都会在关联的 CPU 上接收指示。 有关 RSS 接收处理的详细信息,请参阅 指示 RSS 接收数据。
动态负载均衡
RSS 提供了一种在主机系统负载变化时重新平衡 CPU 之间的网络处理负载的方法。 若要重新平衡负载,上层驱动程序可以更改间接表。 有关指定间接表、哈希类型和哈希函数的详细信息,请参阅 RSS 配置。
发送端缩放
RSS 使驱动程序堆栈能够处理同一 CPU 上给定连接的发送和接收端数据。 通常,上层驱动程序(例如 TCP)发送数据块的一部分,并在发送剩余的数据之前等待确认。 然后确认会触发后续发送请求。 RSS 间接表标识接收数据处理的特定 CPU。 默认情况下,如果发送处理是由接收确认触发的,则发送处理将在同一 CPU 上运行。 驱动程序还可以指定 CPU(例如,如果使用计时器)。
安全哈希
RSS 包含一个提供附加安全性的签名。 此签名可保护系统免受恶意远程主机的侵害,这些主机可能会尝试将系统强制进入不平衡状态。
MSI-X 支持
RSS 支持 MSI-X,在以后执行 DPC 的同一 CPU 上运行中断服务例程(ISR)。 此功能可减少旋转锁开销和缓存重载。