本文面向使用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。
使用边界(重要):
调优路径二:调大RSS队列数(让更多CPU参与收包)
原理:RSS按网络连接把收到的流量分发到多个接收队列,由不同CPU并行处理。多核实例上调大*NumRssQueues(如从默认8调到接近vCPU数,≤16)可避免收包负载集中在少数核上,提升整体收包处理能力。该参数在设备管理器中显示为Maximum Number of RSS Queues。
前提与边界(重要):
需
*RSS(设备管理器中显示为Receive Side Scaling)保持启用(默认即启用);配置值与实际生效值可能不一致:实际生效队列数不超过实例vCPU数,配置后请通过操作系统的RSS状态信息确认实际生效队列数;
对单条大流量连接无效:同一条连接(单流)的报文始终由同一CPU处理,加队列不能分担单流压力。该路径适用于多流并发场景;单流丢包请优先考虑调优路径一或业务层拆分连接。
决策建议
丢包特征 | 优先调整 | 注意事项 |
瞬时突发丢包,突发过后自行恢复 |
| 先确认实际生效上限(见3.1节)与内存开销(见3.2节) |
多流并发,收包负载集中在少数CPU核 |
| 需 |
持续性过载(CPU处理能力持续不足) | 两者结合 | 调参只能缓解,建议同步考虑升配实例(更多vCPU/更高网络能力规格) |
高吞吐/高PPS场景的预防性调优同样适用上表:RxCapacity可调至1024或2048,*NumRssQueues调至接近vCPU数(≤16),其余卸载参数(校验和/LSO/RSS/RSC)保持默认值(默认均为启用)。
以上参数修改均需重启网卡生效,请在业务低峰期操作,并在调整后持续观察丢包指标验证效果。
RxCapacity深入说明
实际生效上限
在阿里云ECS上,接收缓冲区数量能否用到256以上的值(最大4096),取决于实例规格与镜像版本。以下两个条件同时满足时可确保支持4096:
条件 | 要求 |
实例规格 | 阿里云ECS 8代及以后规格(如g8i) |
镜像 | 2023年09月及之后发布的阿里云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队列数,请参见偶发丢包问题排查。
参数配置方法
您可以通过设备管理器配置参数,步骤如下:
打开设备管理器>网络适配器,找到virtio网卡;
右键单击该网卡,选择属性>高级选项卡;
在左侧属性列表中选中参数(如
Init.MaxRxBuffers),在右侧修改取值,单击确定。
下图为设备属性高级选项卡的界面全貌:

高级选项卡左侧列表显示的即为参数的显示名(如
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时的界面:

功能说明:同时参与收包处理的队列数量上限,队列越多可参与收包的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,如下图所示:

功能说明:每个接收队列的缓冲区数量。调大可减少突发流量下的丢包,代价是占用更多内存。
修改建议:保持默认值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字节以太网头,即IP层MTU = 本参数 − 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 |
用于驱动内部诊断,保持默认值即可。