最近给一台老工作站装了ESXi 8.0,板载的瑞昱RTL8125BG螃蟹网卡差点把我心态搞崩。原生镜像不认这张卡,折腾了半天才把社区版驱动VIB集成进系统,网卡总算是被识别了。结果跑起来之后,网络隔三差五就断一下:ping网关延迟突然飙到几百毫秒,虚拟机里做大规模文件复制甚至会直接掉线,管理界面偶尔登不进去。这不是物理断线,link灯始终亮着,但数据面就是不正常。
我相信很多用消费级主板跑虚拟化的朋友都有同感。这篇文章就是我这次完整的排障记录,从定性“断流到底是谁的锅”,到用esxcli一条条关闭螃蟹卡的低功耗特性、改电源策略、固定协商速率,最后把问题压下去的全过程。内容不绕弯子,命令和思路都能直接抄,适合那些已经装上社区驱动、但被断流折磨得想砸键盘的人。
1. 为什么ESXi 8.0会对瑞昱网卡“区别对待”
1.1 原生不支持的原因:企业认证与稳定性门槛
先说说根子上的问题。VMware的硬件兼容性列表里,网卡这一项基本被Intel、Broadcom、Mellanox这些传统服务器网卡厂商包揽,瑞昱Realtek的产品极少出现。这不是什么“技术歧视”,而是vSphere对网卡驱动的要求非常苛刻,必须通过VMware的认证,并且要能在VMkernel这个独立内核上稳定工作。
瑞昱的网卡芯片绝大多数用在消费级主板、迷你主机和DIY整机上,官方几乎没有针对ESXi做驱动开发,更不会去走认证流程。ESXi 8.0内核升级之后,很多老驱动直接失效,社区只能在Linux r8168/r8125驱动的基础上做移植,编译成VIB包供大家使用。也就是说,你装进去的驱动本质上不是VMware官方认可的东西,而是“能用就好”的民间方案。
1.2 集成驱动后的“假装稳定”与断流的典型特征
驱动VIB装完,esxcli network nic list里能看到vmnic0,link状态也显示Up,但这只能说明驱动加载成功、网卡和交换机之间完成了物理协商。ESXi里“能识别”和“能稳定跑满”是两个完全不同的世界。
我这次遇到的断流现象很有代表性:
- 空闲一段时间后,第一次ping包延迟飙到200ms以上,甚至直接丢包;
- 持续ping时,偶发性丢失3到5个包,然后又恢复正常;
- 大流量传输(比如vMotion、备份、虚拟机间拷贝)时网络连接直接卡死;
- 虚拟机内部访问外网时好时坏,但管理口vSphere Client却不掉线;
- 网卡link灯全程正常,交换机端口也没有告警。
出现这种情况,不要一上来就怪驱动垃圾。虽然社区驱动确实容易背锅,但更常见的原因是螃蟹卡默认开启的节能特性和ESXi的电源策略打架。你要先搞清楚断流的具体触发场景,再对号入座去修。
1.3 断流的大致三类原因:驱动本身、电源管理、协商配置
以我实际踩坑的经验,断流可以归纳成三类。
第一类是驱动本身处理能力不够。瑞昱社区驱动在中断处理、环形缓冲区分配、多队列支持上,和Intel企业级网卡驱动有差距。一旦虚拟交换机流量增大,单队列或者缓冲区太小就会丢包。
第二类是电源管理导致的链路假死。螃蟹卡为了省电,默认可能开启EEE(节能以太网)、ASPM(PCIe主动电源管理)这些特性。流量一低,链路和PCIe总线就进入低功耗状态,等下一波数据来的时候,网卡唤醒不及时,延迟尖峰和丢包就出现了。
第三类是自动协商不稳定。2.5G网卡和交换机端口协商不干净,或者网线质量差导致误码率高,也会表现为间歇性断流。
这三类原因不是互斥的,往往同时存在。所以我的解决思路是层层收紧,从驱动参数到系统策略,再到物理协商,一步一步把问题的空间压缩到最小。
2. 排障之前先做三件事:确认网卡、确定驱动模块和建立基线
2.1 把网卡型号和驱动模块真实身份搞清楚
别急着改参数,先花五分钟做信息收集。在ESXi Shell里执行:
lspci | grep -i realtek esxcli network nic listlspci能确认网卡芯片型号,比如我的机器就是RTL8125BG。esxcli network nic list能拿到vmnic编号、速率和驱动名称。
然后确认当前加载的驱动模块名,这一步很关键,因为后面所有参数设置都要用到模块名:
esxcli system module list | grep -i r8168不同VIB包对应的模块名不一样。有的叫r8168,有的叫r8125,还有的驱动叫net-r8168。我这边RTL8125BG对应的模块名是r8125。如果模块名搞错了,后面设置参数会直接报“模块不存在”。
另外,建议顺手看一下当前VIB版本:
esxcli software vib list | grep -i realtek记录下版本号,方便后面升级或者回退。
2.2 建立“断流基线”:用什么工具量化“断”
没有基线数据,你改完参数就没法判断有没有效果。我的方法是三个工具配合使用。
第一个是vmkping,专门用来Ping管理口的:
vmkping -I vmk0 -c 200 -i 0.2 <网关IP>-I指定源接口,-i 0.2表示每200毫秒发一个包,连续200个。重点看丢包率和最大延迟。如果这里已经有丢包,说明问题出在网卡本身、驱动栈或物理链路。
第二个是esxcli network nic stats get:
esxcli network nic stats get -n vmnic0看输出里的rx_errors、tx_errors、rx_dropped这些计数器。如果错误包在增长,说明驱动或链路层有异常。
第三个是iperf3。ESXi本体没有iperf3,但在虚拟机里可以装。在虚拟机和另一台物理主机之间跑TCP带宽测试,观察吞吐是否稳定。如果吞吐曲线大幅波动,或者中途连接断开,断流问题就非常明确了。
2.3 别急着改参数,先排除物理层和交换机
软件层的问题经常被物理层问题掩盖。如果网线是那种两块钱一米的劣质超五类线,或者水晶头压得不好,2.5G协商状态下的误码率会非常高,断流只是表象。
我这次排查时特意检查了三个地方:
- 网线换了一根成品六类线,排除线序和氧化问题;
- 交换机端口强制成了2.5G Full,看协商是否稳定;
- 把同一根线插到另一台非ESXi机器上跑满速测试,确认物理链路本身没有丢包。
如果你用的是家用交换机,还要注意交换机的节能模式,部分交换机会主动把空闲端口降到低速率。ESXi这边也要确保网卡速率没有被自动协商搞成100M。
提示:如果管理口只有一个网卡,后续修改驱动参数、固定速率之前,一定确认有本地控制台或者BMC/IPMI通道。不然一条命令下去网络断了,你又没法远程救回来,就只能跑机房了。
3. 解决断流的五个核心方法:从软件到硬件逐级收紧
3.1 方法一:确认驱动VIB是否装对,不要一股脑用最新版
社区版驱动不是越新越好。ESXi 8.0本身还有Update 1、Update 2这些版本,VIB在编译时只针对特定build,跨版本硬装经常会有兼容问题。
如果你是通过离线VIB直接安装的,先确认一下VIB是否真的加载:
esxcli software vib list | grep -i realtek esxcli system module list | grep -i r8125如果驱动模块加载了,但断流严重,可以先换一个历史稳定版本,或者反过来升级到最新版,以实测为准。我遇到过某个版本1.8.0的RTL8125驱动在8.0 U1上断流严重,回退到1.7.2反而非常稳。
更换VIB的标准流程是这样的:
esxcli system maintenanceMode set -e true esxcli software vib remove -n r8125 esxcli software vib install -v /tmp/r8125-xxx.vib esxcli system maintenanceMode set -e false注意所有驱动模块的卸载和安装,都建议在维护模式下做,避免正在使用的业务虚拟机流量中断。
3.2 方法二:关闭网卡低功耗特性(EEE/ASPM)——大多数断流的元凶
这是整个排障过程中最关键的一步。螃蟹卡默认的节能特性,在虚拟化场景下非常容易变成“卡死”的元凶。EEE和ASPM这些特性,本质上都是让网卡在没有流量的时候进入低功耗状态,等数据来的时候再快速唤醒。问题在于,虚拟机网络流量是突发性的,唤醒速度跟不上,延迟和丢包就来了。
ESXi里可以通过驱动模块参数关闭这些特性:
esxcli system module param set -m r8125 -p eee_enable=0 esxcli system module param set -m r8125 -p aspm_enable=0不同版本驱动暴露的参数名不一定完全一样。执行之前先用下面的命令看看当前驱动支持哪些参数:
esxcli system module param list -m r8125如果列表里出现了eee_enable、aspm_enable、pcie_aspm这类关键字,就说明支持。如果找不到,千万不要自己瞎猜参数名硬塞进去,最好去查一下VIB包自带的README文档。
我在实际操作中只改了eee_enable=0和aspm_enable=0,效果立竿见影。修改之后需要重启,或者重载驱动模块。重载模块的命令是:
vmkload_mod -u r8125 vmkload_mod r8125但要注意,卸载正在被vmnic0使用的驱动会导致管理网断开,远程操作会瞬间失联。所以我当时的做法是直接重启主机,重启后参数依然生效,因为esxcli system module param set会把配置持久化到系统配置里。
3.3 方法三:把电源策略切到HighPerformance并关闭PCIe链路节能
除了网卡自身的节能,ESXi的全局电源策略也会影响PCIe设备的链路状态。默认情况下,ESXi的电源策略是Balanced,它允许CPU和PCIe设备在低负载时降频、降功耗。
用下面的命令查看当前策略:
esxcli system settings power list切换到HighPerformance:
esxcli system settings power set -p HighPerformance这个设置同样建议修改后重启主机。在BIOS层面,顺手把以下几个选项全部关掉:
- ASPM(Active State Power Management)
- Global C-States
- C6/C7节能
- Green Ethernet、EEE(有些主板也叫Energy Efficient Ethernet)
不同厂商的主板BIOS叫法不一样,但关键字基本都是这些。BIOS里的电源管理选项对网卡稳定性的影响,往往比ESXi里还大。我一开始没关BIOS的ASPM,只改了ESXi参数,断流频率下降了不少,但偶尔还会有延迟尖峰;把BIOS里的ASPM关掉之后,问题才算彻底干净。
3.4 方法四:用固定速率和双工模式替代自动协商
如果断流发生在特定的速率协商场景下,固定速率是最快的暴力解法。比如你的交换机只有千兆口,但螃蟹卡支持2.5G,它会尝试协商2.5G,交换机端支持不了就会退回到千兆。这种反复协商的过程有时候不稳定。
在ESXi里可以强制指定速率:
esxcli network nic set -n vmnic0 -S 1000 -d full -A false-S后面是速率,单位Mbps;-d指定双工模式,这里写full;-A false关闭自动协商。
这条命令有风险,如果网卡不支持你指定的速率,链路可能起不来。我建议在本地控制台前面操作,改完如果ping不通,马上用下面的命令恢复自动协商:
esxcli network nic set -n vmnic0 -A true固定速率对于排查问题非常有效。它能帮你确认断流到底是不是自动协商的锅。如果固定到千兆之后完全不丢包,说明链路协商或网线质量有猫腻;如果固定速率后依然丢包,问题大概率在驱动或电源管理。
3.5 方法五:调整中断和环形缓冲区参数(进阶)
有些螃蟹卡驱动即使关闭了低功耗,在大流量下依然会有丢包,这是因为驱动默认的Ring Buffer(环形缓冲区)大小或中断模式不适合虚拟化环境。
如果你在驱动文档里看到了类似RxRingSize、TxRingSize、IntrMode这类的参数,可以试着调大环形缓冲区,减少因缓冲区满导致的丢包。示例如下:
esxcli system module param set -m r8125 -p RxRingSize=4096注意,并不是缓冲区越大越好。缓冲区太大,数据在驱动层排队时间变长,延迟反而会升高。我最终是把接收环形缓冲区调到4096,发送缓冲区保持默认值,因为这个问题主要出在接收方向上。
中断模式的调整要更谨慎。某些螃蟹卡驱动在MSI中断和传统中断之间切换会影响CPU占用和丢包表现。这类参数在不同版本驱动之间变化很大,我就不给固定答案了,原则是:一次只改一个参数,改完重启,然后立刻用基线操作做对比。如果连续改了多个参数出了新问题,你将很难判断是哪个参数导致的。
4. 完整实操过程:我的RTL8125BG断流修复实录
4.1 修改驱动参数的完整命令序列(含重启)
下面是我在ESXi 8.0 U1上完整跑过的流程,网卡是板载RTL8125BG,驱动模块名r8125,VIB版本为社区提供的1.8.0。整个过程依赖本地控制台或带外管理,不建议纯SSH远程操作。
先进入维护模式,避免业务流量在改动过程中受影响:
esxcli system maintenanceMode set -e true确认模块名和当前参数:
esxcli system module list | grep -i r8125 esxcli system module param list -m r8125关闭EEE和ASPM,我是逐条执行的:
esxcli system module param set -m r8125 -p eee_enable=0 esxcli system module param set -m r8125 -p aspm_enable=0然后切换电源策略:
esxcli system settings power set -p HighPerformance退出维护模式并重启:
esxcli system maintenanceMode set -e false reboot重启后再次查询驱动参数,确认之前的设置还在:
esxcli system module param list -m r8125 | grep -E "eee|aspm"我当时看到的输出里,eee_enable和aspm_enable都变成了0,说明修改生效且持久化成功。
4.2 电源策略和BIOS层面的修改过程
ESXi电源策略改成HighPerformance之后,我又进了主板BIOS。这一步很关键,因为ESXi层面的设置只能约束系统自己,改不了主板固件里对PCIe链路功耗的默认策略。
我的板子是华硕的,BIOS里需要改动的地方:
Advanced > PCH Configuration > PCIe Link Power Management设为Disabled;Advanced > CPU Configuration > CPU Power Management关闭C6/C7,C-State设为Disabled;Advanced > Onboard Devices Configuration > Realtek LAN Controller > Green Ethernet设为Disabled。
不同品牌BIOS菜单位置差异巨大,但核心逻辑是一致的:凡是和PCIe ASPM、CPU节能、网卡节能相关的选项,全部关掉。这一步做完,相当于把网卡的“低功耗自动刹车”彻底拆掉了。
4.3 修改后的验证:ping、iperf3、持续时间
改完重启后,我先用vmkping做了一轮高强度测试:
vmkping -I vmk0 -c 1000 -i 0.2 <网关IP>结果:1000个包,丢包0,最大延迟2.1ms,平均延迟0.3ms。和修改前对比非常明显,修改前同样测试丢包率在1%到3%之间,最大延迟经常超过200ms。
接着在虚拟机里用iperf3打流,物理机作为服务端:
iperf3 -c <物理机IP> -t 60 -P 4TCP吞吐稳定在2.35Gbps左右,没有出现断流或吞吐塌陷。使用UDP模式连续打了5分钟,rx_errors和rx_dropped计数器没有任何增长。
最后是长时间的稳定性观察。修改完成后,这台主机连续运行了14天,期间没有一次断流,vCenter里也没有网络告警。期间跑过两台虚拟机之间的约200GB数据迁移,网络始终稳定。
注意:如果你的驱动模块是
r8168而不是r8125,命令里的模块名一定要相应替换。参数名以esxcli system module param list输出的实际结果为准,不要生搬硬套。
5. 常见问题与避坑指南速查
5.1 常见断流场景与处理对照
我把排查过程中有价值的信息整理成了一张表,方便你根据自己的现象直接对号入座。
| 现象 | 可能原因 | 处理建议 |
|---|---|---|
| 空闲几分钟后第一次ping延迟高,甚至丢包 | EEE/ASPM低功耗唤醒延迟 | 关闭eee和aspm,BIOS关闭ASP M |
| 大流量传输时断流,VM拷贝任务中断 | 驱动环形缓冲区不足或中断处理瓶颈 | 调大RxRingSize,检查驱动版本 |
| 网卡link灯正常,但ESXi管理口间歇性失效 | PCIe链路进入低功耗状态后被重置 | 关闭BIOS的C-State和ASPM |
| 长时间运行后速率从2.5G跌到100M | 网线质量差、协商不稳定 | 换六类网线,固定速率到千兆测试 |
| 修改参数重启后又恢复默认 | 驱动模块名错误或VIB未持久化 | 用module param list确认模块名,重新set |
| 驱动升级后出现新的断流 | VIB版本与ESXi build不兼容 | 回退到之前稳定的VIB版本 |
5.2 参数修改和速率调整时最容易翻车的几个地方
先说说最容易踩的坑。第一个坑是远程改网卡参数,网络瞬间断开后无法恢复。我自己就犯过这个错,固定速率的命令刚按下去,SSH连接直接卡死,好在旁边有IPMI,重启后恢复了。所以在做任何可能影响管理网络的修改前,必须确保有本地控制台或带外管理通道。
第二个坑是参数名写错。esxcli system module param set如果指定了模块不支持的参数,命令通常会报错,但有些驱动版本会静默忽略。你不要执行完看命令返回0就认为成功了,一定要用param list再查一遍。
第三个坑是BIOS设置和ESXi设置冲突。ESXi里关了ASPM,但BIOS里没有关,那么网卡仍然可能进入低功耗状态。因为BIOS对PCIe链路电源管理的优先级更高,ESXi驱动未必能完全覆盖。
第四个坑是只改参数不测试。改完一个参数后,至少要稳定观察一两天再做结论。有些断流问题本身是偶发的,改完立刻ping 200个包没丢,并不能说明问题根除。我建议至少做24小时连续监控,再看统计结果。
5.3 调完仍然断流的退路
如果上面这些方法全部试完,断流问题依然顽固,那就不建议继续在螃蟹卡上死磕了。社区驱动毕竟不是官方认证的东西,在某些主板、某些PCIe通道环境下,兼容性问题不是靠参数能解决的。
我会考虑的退路有这几条:
- 加一块Intel i210/i225/i226的PCIe网卡,几十到一百多块钱,稳定性完全不一样;
- 用双网卡做管理口的active/standby,至少断流时不会彻底失联;
- 把螃蟹卡降级到千兆固定速率使用,降低处理压力;
- 检查是否为PCIe插槽或主板供电问题,换个插槽测试。
我自己在测试环境里依然保留螃蟹卡,毕竟白嫖一张2.5G口挺香。但生产环境或者跑重要业务虚拟机的主机,我最终还是会换成Intel网卡。这不是看不起瑞昱,而是在虚拟化这个场景里,稳定性的优先级永远高于性价比。
最后再分享一个操作习惯:每次修改驱动参数前,我都会把esxcli system module param list -m r8125的完整输出存一份,改完后对比差异。这个习惯帮了我很多次,至少回退的时候不用瞎猜之前改了什么。另外,/var/log/vmkernel.log里如果频繁出现网卡reset或link down/up的日志,记得先看日志再动手,那说明问题很可能在PCIe链路稳定性上,而不是单纯的节能问题。