发送队列丢弃的定位思路
发送侧丢弃要分清两类原因:一是本地 qdisc 队列已满,内核直接丢弃报文;二是报文已经交给网卡但被链路或对端丢掉。ip -s link 的 TX dropped 与 tc -s qdisc 的 backlog、drops 组合起来看,才能判断瓶颈在本地出口还是下游。txqueuelen 是队列长度,也是本端吸收突发的容量边界。
基本信息
| 接口计数 | ip -s link show eth0,关注 TX dropped |
|---|---|
| 队列统计 | tc -s qdisc show dev eth0,关注 backlog 与 drops |
| 查看队列长度 | ip link show eth0 | grep -o 'qlen [0-9]*' |
| 调整队列长度 | ip link set eth0 txqueuelen 5000 |
| 本地丢弃特征 | qdisc drops 增长且 backlog 长期非零 |
典型使用场景
- 应用日志出现发送失败或超时,确认是否由本地队列溢出引起
- 高 PPS 发送压测中出现丢包,区分本端队列与链路原因
- 网关或代理转发丢包,判断瓶颈在出口队列还是下游设备
- 批量任务与在线业务混跑时,评估队列长度是否成为争抢点
- 变更前后对比 TX dropped 增量,验证调整是否有效
定位与调整
定位与调整
ip -s link show eth0 # 看 TX dropped 是否有增长
tc -s qdisc show dev eth0 | head -8 # 看 backlog 与 drops 字段
ip link show eth0 | grep -o 'qlen [0-9]*' # 查看当前队列长度
ip link set eth0 txqueuelen 5000 # 需要时调大,注意会增加缓冲延迟现象与处理方向
| 现象 | 发生位置 | 处理方向 |
|---|---|---|
| qdisc drops 增长且 backlog 高 | 本地出口队列满 | 评估下游带宽或调大队列,但要注意延迟代价 |
| 本地无积压但对端有丢包计数 | 链路或下游设备 | 检查中间链路与对端端口能力 |
| TX dropped 增长而队列正常 | 网卡或驱动侧 | 结合 ethtool -S 查看网卡错误计数 |
| 发送速率被限制在固定值 | 限速类 qdisc 生效 | 检查是否存在限速规则,而非丢包问题 |
调整前的确认项
- 先确认丢包确实发生在本地队列,而不是链路或对端
- 评估调大队列长度对延迟的影响,高并发下缓冲越大尾延迟越高
- 记录调整前的 txqueuelen 原值
- 调整后重新采样,确认 drops 增量是否下降
调大 txqueuelen 只是增加缓冲,不增加带宽。如果应用持续以超过出口能力的速率发送,队列迟早还是会满,正确的处理方向是限流或扩容。
队列长度是临时值,重启或网络服务重载后可能恢复默认;生产调整需写入网络配置或开机脚本,并纳入基线记录。