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 按层级组合,但层级越多每包开销越大
- 选择依据应当是实测的延迟分布与吞吐变化,而不是只比较默认值