Windows网卡驱动性能调优指南

更新时间:
复制 MD 格式

本文面向使用virtio网卡(驱动名称NetKVM)的阿里云ECS Windows实例,介绍偶发丢包等网络性能问题的排查与调优方法,并给出接收缓冲区数量RxCapacity、RSS队列数*NumRssQueues等关键参数的调整建议,同时汇总NetKVM网卡各高级参数的显示名、默认值、取值范围与配置方法。

适用范围与使用指引

本文适用于使用virtio网卡驱动NetKVM的阿里云ECS Windows实例。如需查阅各参数的显示名、默认值、取值范围与配置方法,请参见NetKVM驱动参数说明

NetKVM是阿里云ECS Windows实例中virtio网卡使用的驱动程序。驱动安装后会在系统中注册一组可配置参数,用于控制校验和卸载、大包发送、多队列收包(RSS)、收包合并(RSC)、VLAN、MTU、日志等行为。

默认值适用于绝大多数场景,如无明确排查结论请勿修改参数。

偶发丢包问题排查

现象与成因

典型现象:网络监控偶见丢包、TCP重传率短时升高,但持续压测不一定能复现;丢包时间点往往与流量突发或系统繁忙时段重合。

常见成因之一:实例内CPU来不及处理接收数据。收包速率瞬时超过驱动处理速度时,网卡的接收缓冲区被逐渐填满;缓冲区耗尽后,后续到达实例的报文无处存放,只能被丢弃。突发过后CPU追上处理进度、缓冲区释放,丢包随之消失——这就是“偶发、难复现”的原因。

定位方法

调整参数前,请先通过排除法初步判断丢包是否可能由“接收缓冲耗尽”引起,避免在丢包原因不明确时盲目调参:

说明

缓冲区耗尽时的丢包发生在报文到达驱动之前,不会体现在操作系统的网卡统计计数器中。因此无法通过单一指标直接确认,需综合以下线索判断。

  • 排除其他环节:先确认丢包不是发生在网络链路层或对端(如安全组丢弃、带宽限速触发等)。若其他环节可排除,则实例内缓冲耗尽是主要嫌疑之一;

  • 看时间相关性:对照丢包时间点与实例CPU利用率、网络流量曲线,确认丢包是否与CPU高负载或流量突发吻合;

  • CPU分布:观察各CPU核的利用率与收包处理分布,确认丢包时收包处理是否集中在少数几个CPU核上;

  • 调大验证(最终确认手段):如果上述线索指向缓冲耗尽,将RxCapacity调大后观察丢包是否消失;若丢包消失,可确认由缓冲耗尽引起。

初步判断指向接收侧处理不及时后,按下面两条路径调优。

调优路径一:调大RxCapacity(吸收突发)

原理:更大的接收缓冲区(如从默认256调到1024、2048)可在瞬时突发时缓存更多报文等待CPU处理,从而避免缓冲耗尽丢弃。该参数在设备管理器中显示为Init.MaxRxBuffers。

使用边界(重要):

  • 只对瞬时突发有效:若是持续性过载(CPU处理能力持续不足),加大缓冲只能推迟丢包发生,不能消除丢包,需配合调优路径二(让更多CPU参与收包)或升配实例;

  • 先确认实际生效上限:并非所有实例都能用到256以上的取值,与实例规格和镜像版本有关,详见实际生效上限调整前请先确认实例满足条件,再调大该值

  • 内存开销需事先估算:接收缓冲区占用的内存与取值和网卡队列数成正比(网卡队列数由实例规格决定,用户不可配置),调到4096时多队列实例可达GB级,量化估算见内存开销;小内存规格实例请先估算再调。

调优路径二:调大RSS队列数(让更多CPU参与收包)

原理:RSS按网络连接把收到的流量分发到多个接收队列,由不同CPU并行处理。多核实例上调大*NumRssQueues(如从默认8调到接近vCPU数,≤16)可避免收包负载集中在少数核上,提升整体收包处理能力。该参数在设备管理器中显示为Maximum Number of RSS Queues。

前提与边界(重要):

  • *RSS(设备管理器中显示为Receive Side Scaling)保持启用(默认即启用);

  • 配置值与实际生效值可能不一致:实际生效队列数不超过实例vCPU数,配置后请通过操作系统的RSS状态信息确认实际生效队列数;

  • 对单条大流量连接无效:同一条连接(单流)的报文始终由同一CPU处理,加队列不能分担单流压力。该路径适用于多流并发场景;单流丢包请优先考虑调优路径一或业务层拆分连接。

决策建议

丢包特征

优先调整

注意事项

瞬时突发丢包,突发过后自行恢复

RxCapacity调大(如1024/2048)

先确认实际生效上限(见3.1节)与内存开销(见3.2节)

多流并发,收包负载集中在少数CPU

*NumRssQueues调大(接近vCPU数,≤16)

*RSS启用;单流丢包无效;配置后验证实际队列数

持续性过载(CPU处理能力持续不足)

两者结合

调参只能缓解,建议同步考虑升配实例(更多vCPU/更高网络能力规格)

高吞吐/高PPS场景的预防性调优同样适用上表:RxCapacity可调至10242048,*NumRssQueues调至接近vCPU数(≤16),其余卸载参数(校验和/LSO/RSS/RSC)保持默认值(默认均为启用)。

说明

以上参数修改均需重启网卡生效,请在业务低峰期操作,并在调整后持续观察丢包指标验证效果。

RxCapacity深入说明

实际生效上限

在阿里云ECS上,接收缓冲区数量能否用到256以上的值(最大4096),取决于实例规格与镜像版本。以下两个条件同时满足时可确保支持4096

条件

要求

实例规格

阿里云ECS 8代及以后规格(如g8i)

镜像

202309月及之后发布的阿里云Windows公共镜像,或基于该类公共镜像创建的自定义镜像

不满足上述条件的实例,实际生效上限可能为256——即使设备管理器界面可以选择更大的值(如1024、4096),超出生效上限的部分也不会带来实际效果。

说明
  • 内存按实际生效值消耗:在生效上限为256的实例上,即使将配置值调整为4096,实际也仅使用256个缓冲区,不会额外占用内存;

  • 实际可配置范围与生效值可能因实例规格、镜像版本不同而有差异,以设备管理器界面显示及实际测试为准。

内存开销

每个接收缓冲区约占用72 KB内存。该内存在驱动加载时即固定占用、不随流量变化,且MTU/*JumboPacket设置无关。接收缓冲区按网卡队列分配(网卡队列数由实例规格决定,用户不可配置,与*NumRssQueues无关),因此:

接收缓冲区总内存 ≈ 72 KB × 实际生效缓冲数 × 网卡接收队列数

估算示例(按实际生效缓冲数计):

实际生效缓冲数

单队列

4队列

8队列

256(默认)

18 MB

72 MB

144 MB

1024

72 MB

288 MB

576 MB

4096

288 MB

1.1 GB

2.3 GB

该参数对内存消耗影响较大,默认值256是内存占用与突发吸收能力之间的平衡。小内存规格实例上调大RxCapacity时请注意内存开销(多网卡队列的实例内存占用会按队列数成倍放大),请在调整前按实例内存规格对照上表估算。

说明

内存估算值随驱动版本演进而变化,请以实际测试为准。

NetKVM驱动参数说明

本章供您查看和调整网卡高级参数时参考。各参数的默认值与取值范围以实例中设备管理器实际显示的取值为准(不同驱动版本可能存在差异)。

说明

如遇偶发丢包等网络性能问题,或需评估调整RxCapacity/RSS队列数,请参见偶发丢包问题排查

参数配置方法

您可以通过设备管理器配置参数,步骤如下:

  1. 打开设备管理器>网络适配器,找到virtio网卡;

  2. 右键单击该网卡,选择属性>高级选项卡;

  3. 在左侧属性列表中选中参数(如Init.MaxRxBuffers),在右侧修改取值,单击确定

下图为设备属性高级选项卡的界面全貌:

image (19)

说明
  • 高级选项卡左侧列表显示的即为参数的显示名(如Init.MaxRxBuffers)。本章均以显示名标识参数,与设备管理器界面一一对应。

  • 在设备管理器中单击确定保存修改后,系统会自动重启该网卡(网络会瞬断数秒)。

生效方式

在设备管理器中单击确定保存修改后,系统会自动重启该网卡(网络会瞬断数秒)。

参数速查表

NetKVM驱动提供以下23个可配置参数:

高级属性显示名

默认值

取值范围

功能说明

Assign MAC

(空)

12位十六进制

覆盖网卡MAC地址(可选参数)

Init.Do802.1PQ

1

0 / 1

是否启用802.1P/Q优先级与VLAN标签支持(总开关)

Init.MaxRxBuffers

256

16/32/64/128/256/512/1024/2048/4096

每个接收队列的缓冲区数量

Init.MaxTxBuffers

1024

16/32/64/128/256/512/1024

每个发送队列的缓冲区数量

IPv4 Checksum Offload

3

0–3

IPv4头校验和卸载

Jumbo Packet

1514

590–65500

最大帧长度(含14字节以太网头)

Large Send Offload V2 (IPv4)

1

0 / 1

IPv4大包发送卸载(LSO v2)

Large Send Offload V2 (IPv6)

1

0 / 1

IPv6大包发送卸载(LSO v2)

Logging.Enable

1

0 / 1

驱动日志开关

Logging.Level

0

0–8

驱动日志级别

Maximum Number of RSS Queues

8

1–16

RSS最大队列数

Offload.Rx.Checksum

31

0/1/3/27/31

接收方向校验和卸载(总开关)

Offload.Tx.Checksum

31

0/1/3/27/31

发送方向校验和卸载(总开关)

Offload.Tx.LSO

2

0/1/2

大包发送卸载(总开关)

Priority and VLAN tagging

3

0–3

优先级与VLAN标签处理模式

Receive Side Scaling

1

0 / 1

接收端多队列分流(RSS)开关

Recv Segment Coalescing (IPv4)

1

0 / 1

IPv4接收段合并(RSC)开关

Recv Segment Coalescing (IPv6)

1

0 / 1

IPv6接收段合并(RSC)开关

TCP Checksum Offload (IPv4)

3

0–3

IPv4 TCP校验和卸载

TCP Checksum Offload (IPv6)

3

0–3

IPv6 TCP校验和卸载

UDP Checksum Offload (IPv4)

3

0–3

IPv4 UDP校验和卸载

UDP Checksum Offload (IPv6)

3

0–3

IPv6 UDP校验和卸载

VLan ID

0

0–4094

网卡所属VLAN ID,0表示不启用VLAN过滤

参数分类详解

校验和卸载(Checksum Offload)

校验和卸载指由网卡代替CPU计算和校验IP、TCP、UDP校验和,可降低实例内CPU占用。这些参数是向设备发起的能力请求,实际是否生效取决于设备是否支持。校验和相关参数较多(下表7个),推荐全部保持默认值。

显示名

默认值

可选值

Offload.Tx.Checksum

31(All)

31 = All;27 = TCP/UDP(v4,v6);3 = TCP/UDP(v4);1 = TCP(v4);0 = Disabled

Offload.Rx.Checksum

31(All)

同上

IPv4 Checksum Offload

3

3 = Rx & Tx Enabled;2 = Rx Enabled;1 = Tx Enabled;0 = Disabled

TCP Checksum Offload (IPv4)

3

同上

UDP Checksum Offload (IPv4)

3

同上

TCP Checksum Offload (IPv6)

3

同上

UDP Checksum Offload (IPv6)

3

同上

修改建议:全部保持默认值。关闭任一项都会使对应协议的校验和改由实例CPU计算,大流量下CPU占用上升、吞吐下降;关闭TCP校验和卸载还会导致对应的大包发送卸载(LSO)一并失效。仅在排查校验和相关的疑难网络故障时,才建议临时调整。

大包发送卸载(LSO / Large Send Offload)

LSO将大块TCP数据的分段工作交给网卡完成,可显著降低发送方向的CPU占用。与校验和卸载类似,此类参数也是向设备发起的能力请求,实际是否生效取决于设备是否支持。

LSO由两层参数控制,两者是AND关系(都开才生效):

层级

参数

作用

能力声明(总开关)

Offload.Tx.LSO

声明驱动支持哪些版本的LSO(0=全关, 1=IPv4, 2=IPv4+IPv6)

启停控制(子开关)

Large Send Offload V2 (IPv4/IPv6)

在能力范围内按IP版本单独开关

默认值下两层均为全开状态,无需调整。

显示名

Offload.Tx.LSO

默认值

2(Maximal)

可选值

2 = Maximal(IPv4 + IPv6);1 = IPv4(仅IPv4);0 = Disabled

显示名

Large Send Offload V2 (IPv4)、Large Send Offload V2 (IPv6)

默认值

均为1(Enabled)

可选值

1 = Enabled;0 = Disabled

修改建议:全部保持默认值。关闭任一层都会禁用对应版本的LSO,TCP发送吞吐可能下降、CPU占用上升,仅建议在排查发送方向疑难问题时临时使用。

RSS(接收端多队列分流)

Receive Side Scaling

显示名

Receive Side Scaling

默认值

1(Enabled)

可选值

1 = Enabled;0 = Disabled

功能说明:控制是否启用基于流哈希的收包负载均衡。开启后,驱动会对每个收包计算哈希并按indirection table分发到指定CPU处理,确保同一连接的报文始终由同一CPU处理;关闭后,收包不再在多CPU间均衡分发,均由单个CPU处理。

修改建议:保持默认值1。关闭RSS会失去负载均衡的可控性,在多流并发场景下可能导致部分CPU过载。

Maximum Number of RSS Queues

显示名

Maximum Number of RSS Queues

默认值

8

可选值

1–16的整数(步长1)

在设备管理器高级选项卡中,该参数显示为Maximum Number of RSS Queues,下图为取值为默认值8时的界面:

image (20)

功能说明:同时参与收包处理的队列数量上限,队列越多可参与收包的CPU越多。实际生效队列数不超过实例vCPU数。

修改建议:保持默认值8。vCPU较多(>8)且网络吞吐要求高的场景可评估调大,方法与注意事项详见调优路径二:调大RSS队列数(让更多CPU参与收包)

RSC(接收段合并)

Recv Segment Coalescing (IPv4/IPv6)

显示名

Recv Segment Coalescing (IPv4)、Recv Segment Coalescing (IPv6)

默认值

均为1(Enabled)

可选值

1 = Enabled;0 = Disabled

功能说明:开启后,驱动向设备声明“可以接收合并后的大包”,设备端将多个同一TCP连接的小报文合并成大包后交给驱动,减少收包次数,降低CPU占用。此参数是一种能力声明(请求),实际是否生效取决于设备是否支持。

修改建议:保持默认值1。关闭后收包方向CPU占用可能上升。

队列容量

Init.MaxTxBuffers

显示名

Init.MaxTxBuffers

默认值

1024

可选值

16、32、64、128、256、512、1024

功能说明:每个发送队列的缓冲区数量。数值越大,突发发送时越不容易因缓冲区耗尽而暂缓发送。

修改建议:保持默认值1024。调小会在高并发发送时造成发包排队、吞吐抖动,无实际收益。

Init.MaxRxBuffers

显示名

Init.MaxRxBuffers

默认值

256

可选值

16、32、64、128、256、512、1024、2048、4096

在设备管理器高级选项卡中,该参数显示为Init.MaxRxBuffers,如下图所示:

image (21)

功能说明:每个接收队列的缓冲区数量。调大可减少突发流量下的丢包,代价是占用更多内存。

修改建议:保持默认值256。如需评估调大:实际可配置的上限与实例规格及镜像有关,内存开销也需事先估算,详见RxCapacity深入说明。调小会增加突发流量下的丢包风险,一般不建议低于默认值。

VLAN与优先级

控制驱动是否在发送/接收的以太网帧中插入或剥离802.1Q VLAN tag。开启后,发送方向会在帧头中插入4字节VLAN tag(包含优先级和VLAN ID),接收方向会剥离帧中的VLAN tag并上报给操作系统。

三个参数形成层级控制关系:

层级

参数

作用

总开关

Init.Do802.1PQ

关闭后下层参数全部失效

功能选择

Priority and VLAN tagging

按位选择启用优先级(bit0)和/或VLAN ID(bit1)

VLAN ID

VLan ID

指定具体VLAN,开启后仅收发该VLAN的报文

Init.Do802.1PQ

显示名

Init.Do802.1PQ

默认值

1(Enabled)

可选值

1 = Enabled;0 = Disabled

Priority and VLAN tagging

显示名

Priority and VLAN tagging

默认值

3(All)

可选值

3 = All(优先级 + VLAN都启用);2 = VLan(仅VLAN);1 = Priority(仅优先级);0 = Disabled

VLan ID

显示名

VLan ID

默认值

0

可选值

0–4094,0表示不启用VLAN过滤

修改建议:保持默认值。此功能是否有实际效果取决于平台网络是否支持VLAN透传;标准VPC网络下通常无需配置。

MTU(Jumbo Packet)

显示名

Jumbo Packet

默认值

1514

可选值

590–65500的整数(步长1)

功能说明:网卡收发的最大以太网帧长度。该值包含14字节以太网头,即IPMTU = 本参数 − 14;默认1514对应标准MTU 1500。

说明

此参数的实际生效取决于平台网络层是否下发了MTU配置。若平台已下发,驱动会直接使用平台提供的MTU值,用户在设备管理器中的修改不会生效;若平台未下发,则此处的配置值作为实际MTU使用。

修改建议:保持默认值。

MAC地址

Assign MAC

显示名

Assign MAC

默认值

空(不设置,使用平台分配的MAC)

可选值

12位十六进制字符串(如021122334455),可选参数

功能说明:覆盖网卡当前使用的MAC地址。设置生效后,发包源MAC和收包过滤均使用新地址。地址必须为单播本地管理地址(第一字节低2位 = 10,即第一字节为02/06/0A/0E/...);设置的地址不合法时,该设置不生效,网卡继续使用平台分配的MAC地址。

修改建议:保持默认值。

日志与调试

显示名

Logging.Enable、Logging.Level

默认值

Logging.Enable = 1;Logging.Level = 0

用于驱动内部诊断,保持默认值即可。