首页/系统/Linux 内核与性能调优速查/fq_codel 出口排队与缓冲膨胀抑制
网络栈调优98 条

fq_codel 出口排队与缓冲膨胀抑制

fq_codel 是常见默认 qdisc 之一, 通过公平排队与主动管理抑制本地出口排队延迟, 适合高并发发送的服务器。

fq_codel 是什么

fq_codel 是 Linux 常见的默认出口队列规则,先把待发流量按流做公平排队,再用 CoDel 算法主动管理队列停留时间,抑制长时间排队造成的缓冲膨胀。在有多条并发流、出口存在排队延迟的服务器上,它能明显改善尾延迟;代价是每包多一次调度判断。

基本信息

生效方向接口出口(发送方向)
查看命令tc qdisc show dev eth0
切换命令tc qdisc replace dev eth0 root fq_codel
系统默认值net.core.default_qdisc,决定新接口的初始 qdisc
统计查看tc -s qdisc show dev eth0

典型使用场景

  • 高并发发送的服务器出口排队延迟偏高,需要抑制缓冲膨胀
  • 多租户或混跑场景,避免大流量流挤占其他流的发送机会
  • 对比不同 qdisc 对 P99 延迟的影响,为业务选择出口策略
  • 容器化环境确认 veth 与宿主接口各自的队列规则是否符合预期
  • 限速与排队组合使用时,确认统计口径是否正确

查看与切换

查看与切换
tc qdisc show dev eth0                    # 查看当前根队列规则
tc -s qdisc show dev eth0                 # 查看排队与丢弃统计
sysctl net.core.default_qdisc             # 查看新接口的默认 qdisc
tc qdisc replace dev eth0 root fq_codel   # 需要时切换,建议在维护窗口执行

统计字段判读

字段含义判读
qdisc 行当前生效的队列规则与句柄确认切换是否真正生效
backlog当前排队字节数持续非零说明出口存在排队
drops因队列溢出丢弃的包数增长说明出口带宽已不够用
overlimits超过限速或队列限制的次数与限速策略对照查看
requeues因调度冲突重新入队的次数持续增长说明存在竞争
切换 qdisc 会让该接口的队列瞬间重建,短暂影响流量,应放在维护窗口执行,并用 tc qdisc show 确认新规则已经生效。
本地 qdisc 只影响出口排队,端到端延迟还取决于中间设备与对端。把本地队列调好不等于端到端问题解决,仍需分段测量。

同类队列的取舍

  • fq_codel:公平排队加主动队列管理,通用性最好,是多数新发行版的默认值
  • pfifo_fast:旧内核上的常见默认值,只有简单优先级队列,缺少主动管理机制
  • 限速类队列可与 fq_codel 按层级组合,但层级越多每包开销越大
  • 选择依据应当是实测的延迟分布与吞吐变化,而不是只比较默认值

易错点

  • 在容器 veth 场景误改宿主物理接口的队列规则,影响范围远超预期
  • 把 backlog 非零直接判定为故障,未结合延迟与业务指标一起看
  • 认为换了 qdisc 就能解决所有延迟问题,忽略端到端其他环节
  • 切换后不做验证,规则实际未生效但变更记录里写成了已完成

数据来源与参考

  • man tc-fq_codel
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌