性能优化网络适配器

适用于:Windows Server 2022、Windows Server 2019、Windows Server 2016,Azure Stack HCI 版本 21H2 和 20H2

使用本主题中的信息为运行 Windows Server 2016 及更高版本的计算机优化网络适配器性能。 如果你的网络适配器提供优化选项,则你可以使用这些选项来优化网络吞吐量和资源使用。

网络适配器的正确优化设置取决于以下可变因素:

  • 网络适配器及其功能集
  • 服务器执行的工作负载类型
  • 服务器硬件和软件资源
  • 服务器的性能目标

以下各部分介绍了某些性能优化选项。

启用卸载功能

启用网络适配器卸载功能通常会带来好处。 但是,网络适配器可能不足以强大到可以处理具有较高吞吐量的卸载功能。

重要

不要使用卸载功能“IPsec 任务卸载”或“TCP 烟囱卸载”。 这些技术在 Windows Server 2016 中已弃用,可能会对服务器和网络性能产生不利影响。 此外,Microsoft 将来可能不支持这些技术。

以一个硬件资源受限的网络适配器为例。 对于这种适配器,启用分段卸载功能可能会降低该适配器的最大可持续吞吐量。 但是,如果你可以接受吞吐量降低,则应该继续启用分段卸载功能。

注意

某些网络适配器要求为发送和接收路径单独启用卸载功能。

启用 Web 服务器的接收端缩放 (RSS)

当服务器上的网络适配器少于逻辑处理器时,RSS 可以提高 Web 的可伸缩性和性能。 当所有 Web 流量经过支持 RSS 的网络适配器时,服务器可以在不同的 CPU 上同时处理来自不同连接的传入 Web 请求。

重要

避免在同一台服务器上同时使用非 RSS 网络适配器和支持 RSS 的网络适配器。 由于 RSS 和超文本传输协议 (HTTP) 中的负载分配逻辑,如果不支持 RSS 的网络适配器接受具有一个或多个支持 RSS 的网络适配器的服务器上的 Web 流量,则性能可能会严重降低。 在此情况下,你应该使用支持 RSS 的网络适配器或在网络适配器属性“高级属性”选项卡上禁用 RSS。

若要确定网络适配器是否支持 RSS,你可以在网络适配器属性“高级属性”选项卡上查看 RSS 信息。

RSS 配置文件和 RSS 队列

默认的 RSS 预定义配置文件是 NUMAStatic,它不同于以前的 Windows 版本使用的默认配置文件。 在开始使用 RSS 配置文件之前,请查看可用的配置文件,以了解它们何时可以为你带来好处,以及如何将它们应用于你的网络环境和硬件。

例如,如果打开任务管理器并在服务器上查看逻辑处理器,而且它们似乎没有得到充分利用以接收流量,则可以尝试将 RSS 队列中的数目从默认值 2 增加到网络适配器所支持的最大数目。 你的网络适配器可能具有将 RSS 队列数目作为驱动程序的一部分进行更改的选项。

增加网络适配器资源

对于允许手动配置资源(例如接收和发送缓冲区)的网络适配器,应增加分配的资源。

某些网络适配器将它们的接收缓冲区设置得较低以节省从主机分配的内存。 较低的值会导致数据包丢弃和性能降低。 因此,对于接收密集型的方案,我们建议你将接收缓冲区值增加到最大值。

注意

如果网络适配器不公开手动资源配置,则它将动态配置资源,或者将资源设置为一个无法更改的固定值。

启用中断调解

若要控制中断调解,某些网络适配器将公开不同的中断调解级别、不同的缓冲区合并参数(有时分别针对发送和接收缓冲区),或两者兼有。

应考虑对 CPU 密集型工作负载进行中断调解。 使用中断调解时,请考虑如何在主机 CPU 节约和延迟与因为中断更多或延迟更低而增加的主机 CPU 节约之间做出平衡。 如果网络适配器不执行中断调解,但它确实公开了缓冲区合并,则增大的合并缓冲区的数目将允许针对每个发送或接收具有更多缓冲区,这样可以提高性能。

低延迟数据包处理的性能优化

许多网络适配器提供选项来优化由操作系统触发的延迟。 延迟是处理网络驱动程序传入数据包和网络驱动程序发回数据包之间经过的时间。 此时间通常以微秒为单位。 为了进行比较,远距离的数据包传输的传输时间通常以毫秒为单位(增大一个数量级)。 此优化不会减少数据包在传输过程中所花的时间。

以下是某些针对微秒敏感网络的性能优化建议。

  • 请将计算机的 BIOS 设置为“高性能”,并禁用 CPU 电源状态。 但是,请注意这与系统和 BIOS 相关,如果操作系统控制电源管理,则某些系统将提供更高的性能。 可以在“设置”中或使用 powercfg 命令检查和调整电源管理设置。 有关详细信息,请参阅 Powercfg 命令行选项

  • 请将操作系统电源管理配置文件设置为“高性能系统”。

    注意

    如果系统 BIOS 已设置为禁用电源管理的操作系统控制,此设置无法正常工作。

  • 启用静态卸载。 例如,启用“UDP 校验和”、“TCP 校验和”以及“发送大型卸载(LSO)”设置。

  • 如果流量经过多重流式处理(例如,在接收大量多播流量时),请启用 RSS。

  • 针对需要可能的最低延迟的网卡驱动程序,禁用“中断裁决”设置。 请记住,此配置可能会占用更多的 CPU 时间,并且它也反映了一种弊端。

  • 在内核处理器上处理网络适配器中断和 DPC,该处理器与处理数据包的程序(用户线程)所用的内核共享 CPU 缓存。 可以使用 CPU 相关性优化将进程定向到特定的逻辑处理器并结合 RSS 配置来实现此目的。 将相同的内核用于中断、DPC 和用户模式线程会随着负载的增加而表现出最差的性能,因为 ISR、DPC 和线程会争夺对内核的使用。

系统管理中断

许多硬件系统将系统管理中断 (SMI) 用于各种维护功能,例如报告纠错码 (ECC) 内存错误、维护传统 USB 的兼容性、控制风扇以及管理 BIOS 控制的电源设置。

SMI 是系统中优先级最高的中断,它会将 CPU 置于管理模式。 当 SMI 运行某个中断服务例程时(通常包含在 BIOS 中),此模式会抢占所有其他活动的优先级。

遗憾的是,此行为可能导致 100 微秒或更大的延迟峰值。

如果你需要达到最低延迟,应要求你的硬件提供商提供可将 SMI 降低到可能的最低程度的 BIOS 版本。 这些 BIOS 版本通常称为“低延迟 BIOS”或“无 SMI BIOS”。在某些情况下,硬件平台无法完全消除 SMI 活动,因为此活动用于控制最基本的功能(例如散热风扇)。

注意

操作系统无法控制 SMI,因为逻辑处理器在一种特殊的维护模式下运行,而此模式会阻止操作系统的干预。

性能优化 TCP

可以使用以下各项来优化 TCP 性能。

TCP 接收窗口自动优化

在 Windows Vista、Windows Server 2008 及更高版本的 Windows 中,Windows 网络堆栈使用一项称为“TCP 接收窗口自动优化级别”的功能来协商 TCP 接收窗口大小。 此功能可以在 TCP 握手期间为每次 TCP 通信协商定义的接收窗口大小。

在早期版本的 Windows 中,Windows 网络堆栈使用固定大小的接收窗口(65,535 字节),从而限制了连接的整体潜在吞吐量。 TCP 连接可实现的总吞吐量可能会限制网络使用方案。 TCP 接收窗口自动优化使这些方案能够充分利用网络。

对于具有特定大小的 TCP 接收窗口,可以使用以下公式来计算单个连接的总吞吐量。

可实现的总吞吐量(字节) = TCP 接收窗口大小(字节) * (1 / 连接延迟(秒))

例如,对于延迟为 10 毫秒的连接,可实现的总吞吐量仅为 51 Mbps。 此值对于大型企业网络基础结构是合理的。 但是,通过使用自动优化调整接收窗口,连接可以达到 1 Gbps 的全线路速率。

某些应用程序定义了 TCP 接收窗口的大小。 如果应用程序未定义接收窗口大小,则按如下所述根据链路速度确定窗口大小:

  • 小于 1 Mbps:8 KB
  • 1 Mbps 到 100 Mbps:17 KB
  • 100 Mbps 到 10 Gbps:64 KB
  • 10 Gbps 或更快:128 KB

例如,在安装了 1 Gbps 网络适配器的计算机上,窗口大小应为 64 KB。

此功能还充分利用其他功能来提高网络性能。 这些功能包括 RFC 1323 中定义的其余 TCP 选项。 使用这些功能,基于 Windows 的计算机可以根据配置协商更小但可按定义的值缩放的 TCP 接收窗口大小。 通过这种行为,网络设备可以更方便地处理大小。

注意

你可能会遇到这样的问题:网络设备不符合 RFC 1323 中定义的 TCP 窗口缩放选项,因此不支持缩放因子。 在这种情况下,请参阅知识库文章 934430:尝试在防火墙设备后面使用 Windows Vista 时网络连接失败,或联系网络设备供应商的支持团队。

查看和配置 TCP 接收窗口自动优化级别

可以使用 netsh 命令或 Windows PowerShell cmdlet 来查看或修改 TCP 接收窗口自动优化级别。

注意

与在 Windows 10 或 Windows Server 2019 以前的 Windows 版本中不同,现在不再可以使用注册表来配置 TCP 接收窗口大小。 有关已弃用设置的详细信息,请参阅已弃用的 TCP 参数

注意

有关可用自动优化级别的详细信息,请参阅自动优化级别

使用 netsh 查看或修改自动优化级别

若要查看当前设置,请打开命令提示符窗口并运行以下命令:

netsh interface tcp show global

此命令的输出应如下所示:

Querying active state...

TCP Global Parameters
-----
Receive-Side Scaling State : enabled
Chimney Offload State : disabled
Receive Window Auto-Tuning Level : normal
Add-On Congestion Control Provider : default
ECN Capability : disabled
RFC 1323 Timestamps : disabled
Initial RTO : 3000
Receive Segment Coalescing State : enabled
Non Sack Rtt Resiliency : disabled
Max SYN Retransmissions : 2
Fast Open : enabled
Fast Open Fallback : enabled
Pacing Profile : off

若要修改设置,请在命令提示符下运行以下命令:

netsh interface tcp set global autotuninglevel=<Value>

注意

在上面的命令中,<Value> 表示自动优化级别的新值

有关此命令的详细信息,请参阅针对接口传输控制协议的 Netsh 命令

使用 Powershell 查看或修改自动优化级别

若要查看当前设置,请打开 PowerShell 窗口并运行以下 cmdlet。

Get-NetTCPSetting | Select SettingName,AutoTuningLevelLocal

此 cmdlet 的输出应如下所示。

SettingName           AutoTuningLevelLocal
-----------          --------------------
Automatic
InternetCustom       Normal
DatacenterCustom     Normal
Compat               Normal
Datacenter           Normal
Internet             Normal

若要修改设置,请在 PowerShell 命令提示符下运行以下 cmdlet。

Set-NetTCPSetting -AutoTuningLevelLocal <Value>

注意

在上面的命令中,<Value> 表示自动优化级别的新值

有关这些 cmdlet 的详细信息,请参阅以下文章:

自动优化级别

可以将接收窗口自动优化设置为五个级别中的任何一个。 默认级别为“常规”。 下表描述了级别。

Level 十六进制值 注释
标准(默认值) 0x8(缩放因子为 8) 将 TCP 接收窗口设置为增长以适应几乎所有方案。
已禁用 没有可用的缩放因子 将 TCP 接收窗口设置为默认值。
受限 0x4(缩放因子为 4) 将 TCP 接收窗口设置为增长到超过其默认值,但在某些情况下限制这种增长。
严格限制 0x2(缩放因子为 2) 将 TCP 接收窗口设置为增长到超过其默认值,但要非常保守地增长。
实验 0xE(缩放因子为 14) 将 TCP 接收窗口设置为增长以适应极端方案。

如果你使用应用程序捕获网络数据包,应用程序应针对不同的窗口自动优化级别设置报告如下所示的数据。

  • 自动优化级别:常规(默认状态)

    Frame: Number = 492, Captured Frame Length = 66, MediaType = ETHERNET
    + Ethernet: Etype = Internet IP (IPv4),DestinationAddress:[D8-FE-E3-65-F3-FD],SourceAddress:[C8-5B-76-7D-FA-7F]
    + Ipv4: Src = 192.169.0.5, Dest = 192.169.0.4, Next Protocol = TCP, Packet ID = 2667, Total IP Length = 52
    - Tcp: [Bad CheckSum]Flags=......S., SrcPort=60975, DstPort=Microsoft-DS(445), PayloadLen=0, Seq=4075590425, Ack=0, Win=64240 ( Negotiating scale factor 0x8 ) = 64240
    SrcPort: 60975
    DstPort: Microsoft-DS(445)
    SequenceNumber: 4075590425 (0xF2EC9319)
    AcknowledgementNumber: 0 (0x0)
    + DataOffset: 128 (0x80)
    + Flags: ......S. ---------------------------------------------------------> SYN Flag set
    Window: 64240 ( Negotiating scale factor 0x8 ) = 64240 ---------> TCP Receive Window set as 64K as per NIC Link bitrate. Note it shows the 0x8 Scale Factor.
    Checksum: 0x8182, Bad
    UrgentPointer: 0 (0x0)
    - TCPOptions:
    + MaxSegmentSize: 1
    + NoOption:
    + WindowsScaleFactor: ShiftCount: 8 -----------------------------> Scale factor, defined by AutoTuningLevel
    + NoOption:
    + NoOption:
    + SACKPermitted:
    
  • 自动优化级别:已禁用

    Frame: Number = 353, Captured Frame Length = 62, MediaType = ETHERNET
    + Ethernet: Etype = Internet IP (IPv4),DestinationAddress:[D8-FE-E3-65-F3-FD],SourceAddress:[C8-5B-76-7D-FA-7F]
    + Ipv4: Src = 192.169.0.5, Dest = 192.169.0.4, Next Protocol = TCP, Packet ID = 2576, Total IP Length = 48
    - Tcp: [Bad CheckSum]Flags=......S., SrcPort=60956, DstPort=Microsoft-DS(445), PayloadLen=0, Seq=2315885330, Ack=0, Win=64240 ( ) = 64240
    SrcPort: 60956
    DstPort: Microsoft-DS(445)
    SequenceNumber: 2315885330 (0x8A099B12)
    AcknowledgementNumber: 0 (0x0)
    + DataOffset: 112 (0x70)
    + Flags: ......S. ---------------------------------------------------------> SYN Flag set
    Window: 64240 ( ) = 64240 ----------------------------------------> TCP Receive Window set as 64K as per NIC Link bitrate. Note there is no Scale Factor defined. In this case, Scale factor is not being sent as a TCP Option, so it will not be used by Windows.
    Checksum: 0x817E, Bad
    UrgentPointer: 0 (0x0)
    - TCPOptions:
    + MaxSegmentSize: 1
    + NoOption:
    + NoOption:
    + SACKPermitted:
    
  • 自动优化级别:受限

    Frame: Number = 3, Captured Frame Length = 66, MediaType = ETHERNET
    + Ethernet: Etype = Internet IP (IPv4),DestinationAddress:[D8-FE-E3-65-F3-FD],SourceAddress:[C8-5B-76-7D-FA-7F]
    + Ipv4: Src = 192.169.0.5, Dest = 192.169.0.4, Next Protocol = TCP, Packet ID = 2319, Total IP Length = 52
    - Tcp: [Bad CheckSum]Flags=......S., SrcPort=60890, DstPort=Microsoft-DS(445), PayloadLen=0, Seq=1966088568, Ack=0, Win=64240 ( Negotiating scale factor 0x4 ) = 64240
    SrcPort: 60890
    DstPort: Microsoft-DS(445)
    SequenceNumber: 1966088568 (0x75302178)
    AcknowledgementNumber: 0 (0x0)
    + DataOffset: 128 (0x80)
    + Flags: ......S. ---------------------------------------------------------> SYN Flag set
    Window: 64240 ( Negotiating scale factor 0x4 ) = 64240 ---------> TCP Receive Window set as 64K as per NIC Link bitrate. Note it shows the 0x4 Scale Factor.
    Checksum: 0x8182, Bad
    UrgentPointer: 0 (0x0)
    - TCPOptions:
    + MaxSegmentSize: 1
    + NoOption:
    + WindowsScaleFactor: ShiftCount: 4 -------------------------------> Scale factor, defined by AutoTuningLevel.
    + NoOption:
    + NoOption:
    + SACKPermitted:
    
  • 自动优化级别:严格受限

    Frame: Number = 115, Captured Frame Length = 66, MediaType = ETHERNET
    + Ethernet: Etype = Internet IP (IPv4),DestinationAddress:[D8-FE-E3-65-F3-FD],SourceAddress:[C8-5B-76-7D-FA-7F]
    + Ipv4: Src = 192.169.0.5, Dest = 192.169.0.4, Next Protocol = TCP, Packet ID = 2388, Total IP Length = 52
    - Tcp: [Bad CheckSum]Flags=......S., SrcPort=60903, DstPort=Microsoft-DS(445), PayloadLen=0, Seq=1463725706, Ack=0, Win=64240 ( Negotiating scale factor 0x2 ) = 64240
    SrcPort: 60903
    DstPort: Microsoft-DS(445)
    SequenceNumber: 1463725706 (0x573EAE8A)
    AcknowledgementNumber: 0 (0x0)
    + DataOffset: 128 (0x80)
    + Flags: ......S. ---------------------------------------------------------> SYN Flag set
    Window: 64240 ( Negotiating scale factor 0x2 ) = 64240 ---------> TCP Receive Window set as 64K as per NIC Link bitrate. Note it shows the 0x2 Scale Factor.
    Checksum: 0x8182, Bad
    UrgentPointer: 0 (0x0)
    - TCPOptions:
    + MaxSegmentSize: 1
    + NoOption:
    + WindowsScaleFactor: ShiftCount: 2 ------------------------------> Scale factor, defined by AutoTuningLevel
    + NoOption:
    + NoOption:
    + SACKPermitted:
    
  • 自动优化级别:试验性

    Frame: Number = 238, Captured Frame Length = 66, MediaType = ETHERNET
    + Ethernet: Etype = Internet IP (IPv4),DestinationAddress:[D8-FE-E3-65-F3-FD],SourceAddress:[C8-5B-76-7D-FA-7F]
    + Ipv4: Src = 192.169.0.5, Dest = 192.169.0.4, Next Protocol = TCP, Packet ID = 2490, Total IP Length = 52
    - Tcp: [Bad CheckSum]Flags=......S., SrcPort=60933, DstPort=Microsoft-DS(445), PayloadLen=0, Seq=2095111365, Ack=0, Win=64240 ( Negotiating scale factor 0xe ) = 64240
    SrcPort: 60933
    DstPort: Microsoft-DS(445)
    SequenceNumber: 2095111365 (0x7CE0DCC5)
    AcknowledgementNumber: 0 (0x0)
    + DataOffset: 128 (0x80)
    + Flags: ......S. ---------------------------------------------------------> SYN Flag set
    Window: 64240 ( Negotiating scale factor 0xe ) = 64240 ---------> TCP Receive Window set as 64K as per NIC Link bitrate. Note it shows the 0xe Scale Factor.
    Checksum: 0x8182, Bad
    UrgentPointer: 0 (0x0)
    - TCPOptions:
    + MaxSegmentSize: 1
    + NoOption:
    + WindowsScaleFactor: ShiftCount: 14 -----------------------------> Scale factor, defined by AutoTuningLevel
    + NoOption:
    + NoOption:
    + SACKPermitted:
    

已弃用的 TCP 参数

Windows Server 2003 中的以下注册表设置不再受支持,并且在更高版本中将被忽略。

  • TcpWindowSize
  • NumTcbTablePartitions
  • MaxHashTableSize

所有这些设置位于以下注册表子项中:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters

Windows 筛选平台

Windows Vista 和 Windows Server 2008 引入了 Windows 筛选平台 (WFP)。 WFP 为非 Microsoft 独立软件供应商 (ISV) 提供 API 以创建数据包处理筛选器。 其示例包括防火墙和防病毒软件。

注意

不当编写的 WFP 筛选器可能会大幅降低服务器的网络性能。 有关详细信息,请参阅 Windows 开发人员中心上的将数据包处理驱动程序和应用移植到 WFP

有关本指南中所有主题的链接,请参阅网络子系统性能优化