网卡环形缓冲与突发丢包是什么
高转发场景下 rx dropped 持续增长,很多时候不是链路故障,而是网卡环形缓冲(ring buffer)或中断处理跟不上:突发流量在缓冲填满后直接被丢弃,抓包看不到任何异常报文。处置方向是调大 ring 大小、合理分配多队列、检查软中断是否集中在少数 CPU 上,而不是去追查上游设备。
基本信息
| 适用平台 | Linux(ethtool、mpstat、/proc/interrupts) |
|---|---|
| 查看命令 | ethtool -g、ethtool -S、ip -s link、mpstat -P ALL |
| 关键区分 | ip -s link 的 dropped 与驱动级 rx_missed 或 no_buffers 含义不同 |
| 权限要求 | 查看不需特殊权限,调 ring 与队列需 root |
典型使用场景
- 突发流量导致响应变慢:确认是否在网卡层就已经丢包
- 万兆卡跑不满带宽:排查单队列与软中断集中问题
- 容器密集部署的宿主机:多个 veth 抢占同一队列,出现间歇丢包
- 虚拟化宿主:确认虚拟交换机与物理口的队列分配是否合理
- 压测结果低于预期:先确认是应用瓶颈、队列瓶颈还是链路上限
查看与调整
查看与调整
# 查看当前 ring 大小(RX/TX)
ethtool -g eth0
# 调大到驱动支持的上限(需 root)
sudo ethtool -G eth0 rx 4096 tx 4096
# 查看并分配多队列
sudo ethtool -l eth0 | head; sudo ethtool -L eth0 combined 8
# 观察软中断分布与 CPU 饱和度
mpstat -P ALL 1 3
cat /proc/interrupts | grep eth0丢包计数判读
| 计数 | 含义 | 处置方向 |
|---|---|---|
| rx dropped(内核) | 协议栈之前丢弃 | 查 ring、队列与驱动计数 |
| rx_missed 或 no_buffers | 驱动视角的缓冲不足 | 调大 ring,检查队列分配 |
| tx dropped | 发送侧排队溢出 | 查发送队列长度与拥塞控制 |
| softnet 丢弃计数 | 网络软中断预算耗尽 | 分散中断、启用 RPS/RSS |
调 ring 前先分清丢包类型:ip -s link 的 dropped 与 ethtool -S 输出的 rx_missed_errors、rx_no_buffer_count 不是同一口径,不同驱动命名也不同,要按语义而不是按名字判断。
临时调大的 ring 与队列配置要在重启后保留(写入网络配置或 systemd 服务):否则重启后失效,问题在下一个高峰期复现且无人记得改过什么。