网络适配器中的性能

在决定要在网络适配器上实施的硬件功能时,总是需要权衡利弊。 考虑添加任务卸载功能变得越来越重要,因为这些功能允许中断审查、硬件上的动态优化、改进 PCI 总线的使用和支持巨型帧。 这些卸载功能对于需要出色性能的配置中使用的高端网络适配器非常重要。

支持 TCP 和 IP 校验和卸载

对于最常见的网络流量,将校验和计算卸载到网络适配器硬件时,会因减少每个字节所需的 CPU 周期数来提供显著的性能优势。 校验和计算是网络堆栈中最昂贵的功能,原因有两个:

  • 它会使得路径长度较长。
  • 它会导致缓存改动效果(通常会对发送方造成影响)。

将校验和计算卸载给发送方时,可降低主机 CPU 上的负载并提高缓存有效性,从而提高系统的整体性能。

在 Windows 性能实验室中,我们在网络密集型工作负载期间卸载校验和时测量到 TCP 吞吐量提升 19%。 对此改进的分析表明,总体改进的 11% 是由于路径长度缩短,8% 是由于提高缓存有效性。

卸载接收方的校验和与卸载发送方的校验和具有相同的优势。 在充当客户端和服务器(例如套接字代理服务器)的系统上可以看到增加的好处。 在 CPU 不一定繁忙的系统(例如客户端系统)上,卸载校验和的好处可能是缩短网络响应时间,而不是明显改善的吞吐量。

支持大型发送卸载 (LSO)

Windows 使网络适配器/驱动程序能够播发大于 MTU 的最大段大小 (MSS),使 TCP 达到 64K。 这允许 TCP 将最多 64K 的缓冲区分配给驱动程序,该缓冲区将大型缓冲区划分为在网络 MTU 内的数据包。

TCP 分段工作由网络适配器/驱动程序硬件(而不是主机 CPU)完成。 如果网络适配器 CPU 能够处理其他工作,这会导致性能显著改善。

对于测试的许多网络适配器,当主机 CPU 比网络适配器硬件更强大时,纯网络活动几乎没有改善。 但是,对于典型的业务工作负载,测量到高达 9% 的吞吐量总体系统性能改进,因为主机 CPU 使用其大部分周期来执行事务。 在这些情况下,将 TCP 分段卸载到硬件会将主机 CPU 从分段负载中释放出来,从而允许额外的周期执行更多事务。

支持 IP 安全性 (IPSec) 卸载

Windows 提供将 IPSec 的加密工作卸载到网络适配器硬件的功能。 加密(尤其是 3 DES,也称为三重 DES)具有非常高的周期/字节比率。 因此,将 IPSec 卸载到网络适配器硬件时,在安全 Internet 和 VPN 测试中测量到 30% 的性能提升并不奇怪。

改进中断审查

简单网络适配器会在数据包到达时在主机上生成硬件中断,或者发出数据包发送请求完成的信号。 中断延迟和生成的缓存改动效果会增加整体网络性能的开销。 在许多方案中(例如,大量系统使用情况或网络流量),最好通过处理每次中断的多个数据包来降低硬件中断的成本。

具有大量网络工作负载时,在网络密集型工作负责中测量到高达 9% 的性能改进。 但是,仅针对吞吐量改进优化中断审查参数可能会导致响应时间性能下降。 为了保持最佳设置并适应不同的工作负载,最好允许动态调整参数,如本文后面的自动优化中所述。

高效使用 PCI 总线

网络适配器硬件性能中最重要的因素之一是它使用 PCI 总线的效率。 此外,网络适配器的 DMA 性能也会影响同一 PCI 总线上所有 PCI 卡的性能。 优化 PCI 使用情况时,必须考虑以下准则:

  • 在适当情况下聚合目标页面,简化 DMA 传输。

  • 以大块(至少 256 字节)形式执行 DMA,减少 PCI 协议开销。 如果可能,让数据流有时间在单个 PCI 事务中传输整个数据包。 但是,请考虑如何传输。 例如,不要等待所有数据在启动传输之前到达,因为等待会增加延迟并占用额外的缓冲区空间。

  • 最好使用其他字节填充 DMA 数据包传输,而无需通过传输数据包的最后几个字节来“清理”短时间的额外传输。

  • 根据 PCI 规范的建议,使用内存读取、内存读取行和内存读取多个事务。

  • 网络适配器总线接口硬件应检测主机内存控制器中的限制,并相应地调整行为。 例如,网络适配器总线接口硬件应检测 DMA 内存读取的内存控制器预提取限制,并在再次尝试事务之前等待一段时间。 硬件应在网络适配器的一部分检测过多重试,并在主机切断后首次重试未来事务之前增加时间。 确定仍然忙于提取下一个顺序数据集时,继续向内存控制器提交事务没有意义。

  • 尽量减少插入等待状态,尤其是在数据传输期间。 如果要插入多个或两个等待状态,最好放弃总线,让另一个使用总线的 PCI 适配器完成一些工作。

  • 使用内存映射 I/O,而不是编程 I/O。 驱动程序也是如此。

支持巨型帧

支持更大的最大传输单元 (MTU),从而支持更大的帧大小,特别是巨型帧,会减少每个字节产生的网络堆栈开销。 将 MTU 从 1514 更改为 9000 时,测量到 20% 的 TCP 吞吐量增加量。 此外,由于从网络堆栈到网络驱动程序的调用次数减少,CPU 利用率会显著减少。