一、问题背景
近日在云平台运维过程中,平台监控系统频繁报出如下告警:
节点网卡接收数据包错误数(5 分钟累计)超过阈值
进一步排查发现,该告警主要集中在某些存储节点的业务网卡上。通过 ip -s link show
与 ethtool -S
查看网卡统计信息,发现 rx_missed_errors
等计数器持续增长。这类计数意味着 网卡在接收数据包时发生了硬件层丢包。
虽然业务层面暂未出现明显的功能性故障,但对于存储集群、数据库、高并发应用而言,这类错误会直接带来性能下降、请求超时甚至节点异常的风险,因此必须深入分析并解决。
二、告警出现的原因
1. 数据接收路径简述
数据包到达主机的流程大致如下:
物理链路 → 网卡芯片 → DMA 写入主机内存中的 RX ring buffer
→ 触发中断 / NAPI 轮询 → 驱动取包 → 内核协议栈 → 应用
- RX ring buffer:是网卡驱动在主机内存中开辟的环形队列,用来暂存网卡 DMA 写入的数据包。
- CPU/驱动:负责从 RX ring 中取走包并交给协议栈处理。
2. 问题成因
当突发流量过大或CPU 处理不够及时时,RX ring 很快被占满。此时新到的数据包无法写入,网卡只能丢弃这些帧,并在驱动统计中增加 rx_missed_errors
或 rx_over_errors
计数。
出现这种情况的常见诱因包括:
- 默认 RX ring 尺寸过小(通常只有 256~512 个槽位);
- 突发 PPS(包/秒)过高,超过了队列容量与 CPU 处理能力的乘积;
- 中断合并延迟过大,驱动批量取包的周期变长;
- RSS 队列配置不足,导致流量集中在少数队列/核心上;
- CPU 繁忙,导致驱动处理 ring 的速度下降。
本案例中,主要问题就是 RX ring 容量不足,无法抵御流量高峰,导致接收方向丢包。
三、解决方案与原理
1. 解决措施
通过 ethtool
调整网卡 ring buffer 大小,将 RX ring 从默认值扩展至 2048:
# 查看当前 ring buffer 大小
ethtool -g ens2f1
# 调整 RX/TX ring 大小
ethtool -G ens2f1 rx 2048 tx 2048
调整后,监控告警消失,rx_missed_errors
计数不再增长。
2. 原理解析
RX ring buffer 就像是网卡与 CPU 之间的“仓库”或“水桶”:
- 流量突发时,数据包先进入 ring;
- CPU/驱动稍后再批量取走处理;
- ring 太小 → 突发流量很快顶满 → 新来的包无法写入 → 丢包;
- 扩容 ring → 提高缓冲容量 → 短时间的流量高峰可以被“盛住”,CPU 来得及清理 → 丢包消失。
这种方法等于把“水桶做大”,不会改变网卡带宽或 CPU 算力,但能大幅缓解瞬时突发造成的硬件层丢包。
四、存在的隐患与优化建议
虽然增大 ring buffer 能有效解决问题,但也有一些需要注意的点:
- 内存占用增加:ring 越大,占用的主机内存越多(通常是 MB 级别)。
- 延迟可能上升:队列更深时,包在队列中等待的时间可能增加。
- 掩盖性能瓶颈:如果 CPU/软中断处理能力不足,ring 再大也只是延迟丢包的时间。
- 物理层问题:若错误是 CRC/对齐错误,调整 ring 无效,需要检查光模块、线缆、速率/MTU/FEC 配置。
五、总结
本次事件中,告警的根因是网卡接收队列(RX ring buffer)过小,在突发流量下被顶满,导致接收方向丢包。
通过增大 ring buffer,提升了网卡的抗突发能力,从而解决了告警问题。
这类问题也可以提醒我们:
- 监控层面的“接收错误”并不一定是物理链路问题,也可能是 NIC/驱动队列配置不合理导致;
- 合理调整 ring buffer、大流量场景下进行中断和队列优化,是云平台网络性能调优的关键手段。