记录一下那天晚上的排查过程。一台 CentOS 7.9 的网关机,业务偶发超时,ip -s link 显示 eth0 的 dropped 每小时涨几千,CPU 和带宽都不高,errors 一直是零。

刚开始盯着「多队列没开启,只有一个接收队列在工作」,折腾了半个多小时,排掉了。

原因不止一个,得分开看。网卡 ring buffer 太小,突发流量进不来。也可能是软中断集中在单个核上,处理不过来。

另外,内核的接收 backlog 设得太小。

第一件事是看丢包发生在收方向还是发方向

ip -s link show eth0

再往下检查网卡队列与丢弃计数

ethtool -S eth0 | grep -i drop && ethtool -l eth0

随后扩大 ring buffer 与接收 backlog

ethtool -G eth0 rx 4096 tx 4096

等前面都确认过,再开启 RPS 把软中断分散到多核

sysctl -w net.core.netdev_max_backlog=30000

那几天正好在做别的变更,先把时间线对齐才敢动手。

别只看报错消失,验证要多做一步。dropped 计数停止增长,单核软中断占比降到五成以下,业务侧的超时反馈消失。

dropped 涨而 errors 不涨,通常是缓冲不足而不是链路问题;改 ring buffer 会短暂中断流量,放在低峰操作。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。

作者 9823189