虚拟机网卡掉包,先别急着重装系统,绝大多数情况下是宿主机物理网卡、虚拟交换机或网卡驱动三者中某处出了状况,按“物理层→虚拟层→Guest系统”顺序排查即可。
很多朋友在虚拟机里ping网关,发现丢包一多就怀疑是虚拟机有问题,其实虚拟机只是个“租客”,数据要经过宿主机网卡、虚拟交换机、虚拟网卡三道门,任何一道门卡住,丢包都会出现在虚拟机里,与其瞎折腾系统设置,不如先搞清楚数据到底卡在哪一层。
虚拟机网卡掉包怎么办?先分清丢包发生在哪一层
丢包看起来很吓人,实际上定位起来不复杂,你只需要做三个小实验:在虚拟机里ping宿主机,在宿主机里ping虚拟机,再在物理机器上ping宿主机,如果其中某一步丢包严重,问题就锁定了。
从Guest虚拟机里看丢包现象
在Windows虚拟机里,打开命令提示符,执行 ping -t 192.168.1.1 观察延迟和丢包率,同时在Linux虚拟机里,用 ip -s link 查看网卡收发统计,重点看 dropped 和 errors 计数,如果丢包计数不断上涨,说明虚拟机网卡驱动或排队层有问题;如果没有计数,丢包可能发生在更靠前的位置。
从宿主机看物理网卡和虚拟交换机
在VMware ESXi宿主机上,可以执行 esxcli network nic stats get -n vmnic0,观察物理网卡的 rxdrop 和 txdrop 数值,如果物理网卡丢包高,问题在底层链路;如果物理网卡正常,再查看虚拟交换机的端口统计,esxcli network port stats get,Hyper-V宿主机则可在“网络适配器属性”里开启“网络统计”计数器,查看“丢弃的发送数据包”等性能计数。
虚拟机网络丢包排查的六个实操步骤
排查顺序不固定,但按下面六步走能少走弯路。
- 确认物理链路状态,检查网卡指示灯、协商速率和双工模式,如果物理网卡协商到100Mbps而不是1Gbps,大流量下掉包是必然结果。
- 检查宿主机负载,用
top(Linux宿主机)或任务管理器(Windows宿主机)看CPU是否长时间超过80%,网络中断处理和虚拟交换机转发都会吃CPU,CPU忙不过来就丢包。 - 查看虚拟交换机端口数据,在vSphere Web Client中,选中虚拟交换机,查看“统计信息”页签,关注
dropped RX和dropped TX,数值一直在涨,说明虚拟交换机内部有丢包。 - 核对虚拟机网卡类型,是VMXNET3、e1000还是e1000e?半虚拟化网卡和完全模拟网卡在性能上差别很大,下文会详细展开。
- 进入Guest系统检查驱动和中断,Windows里打开“设备管理器”,看网络适配器是否存在感叹号,Linux里用
ethtool -S eth0查看丢包计数,并留意rx_missed这类指标。 - 排查QoS和流量策略,宿主机或物理交换机上配置了限速,丢包现象通常只在持续大流量时出现,低流量时正常。
这六步走完,大部分“虚拟机网卡掉包”问题都能找到源头,其中有一类尤其常见:VMware虚拟机丢包率高,而宿主机网卡统计完全正常,这时候问题几乎都出在虚拟网卡类型或驱动上。
哪些设置最容易导致虚拟机网卡丢包?
先看一张常见原因对比表,方便你按图索骥。
| 常见场景 | 典型表现 | 排查方向 |
|---|---|---|
| 物理网卡协商到百兆 | 持续大流量时丢包严重,延迟抖动 | 强制网口速率或更换网线/交换机端口 |
| 虚拟交换机VLAN配置错误 | 部分IP能通,部分IP延迟超高或不通 | 核对虚拟交换机端口VLAN ID |
| 虚拟机使用e1000模拟网卡 | 高吞吐时CPU占用高,丢包明显 | 更换为VMXNET3并安装对应驱动 |
| 宿主机开启CPU节能模式 | 空闲时丢包,负载上来后反而正常 | 在BIOS或宿主机电源策略中关闭节能 |
| Guest内网卡RSS被关闭 | 多核虚拟机吞吐上不去,小包丢包多 | 打开RSS队列,平衡CPU中断 |
行业共识认为,e1000模拟网卡的吞吐上限远低于VMXNET3,尤其在高带宽、多队列场景下,e1000的丢包率可能高出数倍,如果你在用虚拟机跑数据库或大文件传输,别省这一步:把虚拟网卡从e1000换成VMXNET3,再装好VMware Tools,丢包率通常能明显下降。
虚拟机网卡驱动怎么选?换驱动能不能解决掉包?
很多用户遇到“虚拟机网卡掉包”后第一反应是重装网卡驱动,但驱动不是万能的,选错了驱动类型,掉包概率反而更高。
半虚拟化网卡 vs 模拟网卡
VMXNET3是半虚拟化网卡,它让Guest系统直接跟虚拟交换机底层设备交互,省去了模拟硬件层的开销,e1000则是完全模拟Intel的千兆网卡,兼容性好,但每次数据传输都要经过一层翻译,CPU占用高,吞吐受限,在这两者之间,优先选VMXNET3。
驱动版本与Guest系统匹配
Windows虚拟机需要安装VMware Tools,里面包含正确的VMXNET3驱动,不装VMware Tools,Windows可能仍然识别为VMXNET3,但缺少中断优化和RSS功能,Linux虚拟机则更要注意内核模块版本,老旧的Linux内核搭配新版本ESXi,VMXNET3驱动可能无法启用所有队列。
业内专家指出,多数情况下,从e1000切换到VMXNET3并重启虚拟机,就能解决相当一部分丢包问题,如果切换后依然丢包,再回看驱动版本和Guest内网卡属性中的“卸载引擎”设置。
虚拟机网络性能差怎么解决?优化配置实例
丢包往往和性能差相伴出现,这里用一个具体场景说明:一台虚拟机跑着Tomcat服务,高峰期出现请求超时,ping网关偶尔丢包,物理机其他虚拟机正常,整个优化过程分三步。
第一步:先确认物理机和宿主机正常
在宿主机上用 iperf3 打流到物理机,确认宿主机本身吞吐和丢包在正常范围,如果宿主机丢包也大,问题在物理链路或交换机配置,先处理那部分。
第二步:更换虚拟网卡并开启多队列
把虚拟机的网卡类型改为VMXNET3,然后在Guest内确认网卡支持多队列,在Windows虚拟机中,打开设备管理器,点击网卡属性,在“高级”选项卡里设置“RX队列数”或“Receive Side Scaling”为开启状态,在Linux虚拟机中,执行 ethtool -l eth0 查看队列数,如果只有1,用 ethtool -L eth0 combined 4 增加队列数。
第三步:调整环形缓冲区和中断参数
再来看丢包计数,Linux里执行 ethtool -g eth0 查看RX/TX环形区大小,默认256可能不够,可以调大到2048:ethtool -G eth0 rx 2048 tx 2048,随后检查软中断是否集中在某个CPU上,执行 cat /proc/interrupts 观察,如果命中不清均,可开启 smp_affinity 将中断分布到多个CPU,这些操作做完,Tomcat服务的超时和丢包现象基本消失。
由此可见,虚拟机网卡掉包不是玄学,问题一定藏在物理链路、虚拟交换机、虚拟网卡驱动或Guest系统四层之间,按照“看物理网卡统计→查虚拟交换机→换对驱动→调内部队列”的顺序走,多数问题能在半小时内解决,别一上来就重装系统,先把层次分清,答案自己会浮出来。
虚拟机网卡掉包常见问题解答
问:虚拟机网卡掉包和物理机网卡掉包怎么区分?
在宿主机上另开一台干净虚拟机,用 ping -c 100 测试外部网关,如果其他虚拟机不丢包,只有目标虚拟机丢包,问题在目标虚拟机内部;如果所有虚拟机都丢包,则问题在宿主机物理网卡或虚拟交换机上。
问:为什么VMware虚拟机丢包率高,但宿主机网络观察一切正常?
优先查看虚拟机使用的网卡类型,即便是VMXNET3,也要确认安装了Open VM Tools或VMware Tools,一个常见情况是:虚拟机在克隆后继承了e1000网卡,而系统内部没有装对应的半虚拟化驱动,导致驱动层频繁失败并丢包,更换网卡类型并重启虚拟机后,多数丢包计数会归零。
问:虚拟机网络丢包排查时,先重启网卡还是先查驱动?
先查驱动版本和网卡类型,再决定是否重启,盲目停用再启用网卡只能清除临时计数,不改变底层驱动行为,正确的做法是先在虚拟机内查看 dmesg | grep -i vmxnet3(Linux)或设备管理器中的网卡硬件ID(Windows),确认驱动匹配后再进行重启操作。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/773291.html


