首页/系统/Linux 内核与性能调优速查/发送队列丢弃与 txqueuelen
网络栈调优98 条

发送队列丢弃与 txqueuelen

发送侧丢弃要区分本地队列满与物理链路丢包: ip -s link 的 TX dropped 与 tc 队列统计结合看, 再评估队列长度设置。

发送队列丢弃的定位思路

发送侧丢弃要分清两类原因:一是本地 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 只是增加缓冲,不增加带宽。如果应用持续以超过出口能力的速率发送,队列迟早还是会满,正确的处理方向是限流或扩容。
队列长度是临时值,重启或网络服务重载后可能恢复默认;生产调整需写入网络配置或开机脚本,并纳入基线记录。

易错点

  • 靠调大 txqueuelen 掩盖应用洪泛发送,把问题推到延迟上
  • 把本地队列丢弃与链路丢包混在一起归因,方向错了越调越乱
  • 只在本端看计数,未与对端和交换机的同类计数交叉验证
  • 调整队列长度后未重新采样,无法证明问题是否真正缓解

数据来源与参考

  • man ip-link
  • man tc
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌