本文介绍如何优化 Windows Server 环境中的网络适配器性能。 网络适配器性能调优可以显著提升吞吐量,降低延迟,并最大化服务器工作负载的资源利用率。
网络适配器的正确优化设置取决于以下可变因素:
- 网络适配器及其功能集
- 服务器执行的工作负荷类型
- 服务器硬件和软件资源
- 服务器的性能目标
最佳调优设置取决于具体硬件配置、工作负载需求和性能目标。 实施更改前,请评估当前网络性能并识别改进点。 某些功能和设置可能因版本不同而异。
以下各部分介绍了某些性能优化选项。
卸载功能
网络卸载功能将处理任务从 CPU 转移到网络适配器硬件,减少系统开销,提升整体网络性能。 常见的卸载功能包括 TCP 校验和卸载、大型发送卸载 (LSO) 和接收端缩放 (RSS)。
启用网络适配器卸载功能通常有益。 但是,网络适配器可能不足以强大到可以处理具有较高吞吐量的卸载功能。 例如,考虑一款硬件资源有限的网络适配器。 对于这种适配器,启用分段卸载功能可能会降低该适配器的最大可持续吞吐量。 不过,如果降低的吞吐量可接受,应启用分段卸载功能。
某些网络适配器要求为发送和接收路径单独启用卸载功能。
Important
不要使用 IPsec 任务卸载或 TCP 烟囱卸载这些卸载功能。 这些技术在 Windows Server 2016 中已弃用,可能会对服务器和网络性能产生不利影响。 此外,微软未来可能不支持这些技术。
Web 服务器的接收端缩放 (RSS)
当服务器上的网络适配器少于逻辑处理器时,RSS 可以提高 Web 的可伸缩性和性能。 当所有 Web 流量经过支持 RSS 的网络适配器时,服务器可以在不同的 CPU 上同时处理来自不同连接的传入 Web 请求。
Important
避免在同一台服务器上同时使用非 RSS 网络适配器和支持 RSS 的网络适配器。 由于 RSS 和超文本传输协议 (HTTP) 中的负载分配逻辑,如果不支持 RSS 的网络适配器接受具有一个或多个支持 RSS 的网络适配器的服务器上的 Web 流量,则性能可能会严重降低。 在这种情况下,应在网络适配器属性 “高级属性 ”选项卡上使用支持 RSS 的网络适配器或禁用 RSS。
若要确定网络适配器是否支持 RSS,可以在网络适配器属性 “高级属性 ”选项卡上查看 RSS 信息。
RSS 配置文件和 RSS 队列
默认的 RSS 预定义配置文件是 NUMAStatic。 开始使用 RSS 配置文件前,请审查可用配置文件,了解其适用场景及对网络环境和硬件的影响。
例如,打开 任务管理器 并查看服务器上的逻辑处理器。 如果接收流量的使用率较低,可以尝试将 RSS 队列数量从默认的两个增加到网络适配器支持的最大值。 你的网络适配器可能具有将 RSS 队列数目作为驱动程序的一部分进行更改的选项。
网络适配器资源
对于允许手动配置资源(例如接收和发送缓冲区)的网络适配器,应增加分配的资源。
某些网络适配器将它们的接收缓冲区设置得较低以节省从主机分配的内存。 较低的值会导致数据包丢弃和性能降低。 因此,对于接收密集型的方案,我们建议你将接收缓冲区值增加到最大值。
如果网络适配器不提供手动资源配置,则它要么动态配置资源,要么资源被设为不可更改的固定值。
中断审查
若要控制中断调解,某些网络适配器将公开不同的中断调解级别、不同的缓冲区合并参数(有时分别针对发送和接收缓冲区),或两者兼有。
应考虑对 CPU 密集型工作负荷进行中断调解。 使用中断调解时,请考虑如何在主机 CPU 节约和延迟与因为中断更多或延迟更低而增加的主机 CPU 节约之间做出平衡。 如果网络适配器不执行中断调节,但支持缓冲合并,可以通过增加合并缓冲区数量来提高性能,允许每次发送或接收更多缓冲区。
低延迟数据包处理
许多网络适配器提供选项来优化由操作系统触发的延迟。 延迟是处理网络驱动程序传入数据包和网络驱动程序发回数据包之间经过的时间。 此时间通常以微秒为单位。 为了进行比较,远距离的数据包传输的传输时间通常以毫秒为单位(增大一个数量级)。 此调优不减少数据包传输时间。
以下列表提供一些针对微秒级延迟敏感网络的性能调优建议:
如果 BIOS 支持它,请将计算机 BIOS 设置为 高性能(
C-states禁用)。 某些系统在操作系统控制电源管理时性能更高。 可以通过电源设置或运行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 接收窗口自动优化
Windows 网络栈使用 TCP 接收窗口自动调节功能,协商 TCP 接收窗口大小。 该功能可在 TCP 握手期间为每个 TCP 通信协商定义的接收窗口大小,并提升 TCP 连接性能。
此前 Windows 网络栈使用固定大小的 65,535 字节接收窗口,限制了连接的最大吞吐量。 TCP 连接可实现的总吞吐量可能会限制网络使用方案。 TCP 接收窗口自动调节使得这些场景能够充分利用网络带宽。
对于特定大小的 TCP 接收窗口,可用以下公式计算单连接的总吞吐量:
可实现的总吞吐量(字节) = TCP 接收窗口大小(字节) *(1 / (1 / 连接延迟 [秒])
例如,对于延迟为 10 毫秒的 1Gbps 连接,最大可达吞吐量仅为 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 接收窗口大小。 此行为使网络设备更易于处理窗口大小。
Note
可能遇到网络设备不兼容 TCP 窗口缩放选项(RFC 1323 定义),因此不支持缩放因子的情况。 此类情况请联系网络设备供应商。
自动眩晕级别
TCP 接收窗口自动调节有五个级别可设置。 默认级别为 Normal。 下表描述了级别。
| Level | 十六进制值 | Comments |
|---|---|---|
| 普通(默认值) | 0x8(缩放因子为 8) | 将 TCP 接收窗口设置为增长以适应几乎所有方案。 |
| Disabled | 没有可用的缩放因子 | 将 TCP 接收窗口设置为默认值。 |
| Restricted | 0x4(缩放因子为 4) | 将 TCP 接收窗口设置为增长到超过其默认值,但在某些情况下限制这种增长。 |
| 高度受限 | 0x2(缩放因子为 2) | 将 TCP 接收窗口设置为增长到超过其默认值,但要非常保守地增长。 |
| Experimental | 0xE(缩放因子为 14) | 将 TCP 接收窗口设置为增长以适应极端方案。 |
若使用应用捕获网络包,应用应报告不同窗口自动调节级别对应的数据示例。
自动优化级别:常规(默认状态)
本示例显示 TCP 接收窗口自动调整级别设置为 “正常”时数据包捕获工具的输出。 缩放因子为 8。
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:
自动优化级别:已禁用
本示例显示 TCP 接收窗口自动调整级别设置为 “已禁用”时数据包捕获工具的输出。 不使用缩放因子。
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:
自动优化级别:受限
本示例显示 TCP 接收窗口自动调整级别设置为 “受限”时数据包捕获工具的输出。 缩放因子为 4。
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:
自动优化级别:严格受限
本示例显示当 TCP 接收窗口自动调整级别设置为 “高度受限”时数据包捕获工具的输出。 缩放因子为 2。
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:
自动优化级别:试验性
本示例显示 TCP 接收窗口自动调整级别设置为 “实验”时数据包捕获工具的输出。 缩放因子为 14。
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 PowerShell cmdlet 或 netsh Windows 命令查看或更改 TCP 接收窗口自动调节级别。
Note
自 Windows Server 2019 起,无法再使用注册表配置 TCP 接收窗口大小。 有关已弃用设置的详细信息,请参阅已弃用的 TCP 参数。
可以使用 Get-NetTCPSetting cmdlet 查看或修改自动调节级别。 查看和更改当前设置:
以管理员身份打开 PowerShell,运行以下 cmdlet:
Get-NetTCPSetting | Select SettingName,AutoTuningLevelLocal输出类似于以下示例:
SettingName AutoTuningLevelLocal ----------- -------------------- Automatic InternetCustom Normal DatacenterCustom Normal Compat Normal Datacenter Normal Internet Normal更改设置时,运行以下命令。 确保将
<value>设置为期望的自动调节级别。 有关详细信息,请参阅 Set-NetTCPSetting。Set-NetTCPSetting -AutoTuningLevelLocal <value>
Windows 筛选平台
Windows 过滤平台(WFP)于 Windows Server 2008 引入,向非微软独立软件供应商(ISV)提供创建数据包处理过滤器的 API。 WFP 允许第三方软件在网络栈的各层检查、修改或过滤网络流量。 尽管此功能对安全应用至关重要,但若实现不当,可能引入性能开销。 其示例包括防火墙和防病毒软件。
编写不当的 WFP 过滤器会显著降低服务器网络性能。 有关详细信息,请参阅 Windows 开发人员中心上的将数据包处理驱动程序和应用移植到 WFP。
已弃用的 TCP 参数
Windows Server 2003 中的以下注册表设置不再受支持,并且在更高版本中将被忽略。
- TcpWindowSize
- NumTcbTablePartitions
- MaxHashTableSize
所有这些设置位于以下注册表子项: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters