性能优化网络适配器

适用于: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 命令设置和调整电源管理设置。 有关详细信息,请参阅 Powercfg Command-Line选项

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

    注意

    如果系统 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 活动,因为它用于控制基本功能 (例如冷却风扇) 。

注意

操作系统无法控制 SMIS,因为逻辑处理器在特殊维护模式下运行,这可以防止操作系统干预。

性能优化 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 (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窗口缩放选项,因此不支持缩放因子。 在这种情况下,请参阅此 KB 934430:尝试在防火墙设备后面使用 Windows Vista 或联系网络设备供应商的支持团队时,网络连接失败。

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

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

注意

与在 Windows Server 2019 Windows 10或 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>

注意

在上一命令 <<> 表示自动优化级别的新值。

有关此命令的信息,请参阅接口传输控制 协议的 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>

注意

在上一命令 <<> 表示自动优化级别的新值。

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

自动调和级别

可以将接收窗口自动调和设置为五个级别中的任意一个。 默认级别为 Normal。 下表描述了级别。

级别 十六进制值 注释
标准(默认值) 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 独立软件供应商提供 API (ISV) 创建数据包处理筛选器。 其示例包括防火墙和防病毒软件。

注意

编写不佳的 WFP 筛选器可能会显著降低服务器的网络性能。 有关详细信息,请参阅以下Packet-Processing驱动程序和应用移植到WFP Windows 开发人员中心。

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