default_qdisc 是什么
net.core.default_qdisc 指定新创建的网卡队列规则(qdisc)使用哪种算法,现代内核常见默认值是 fq_codel。队列规则决定发包排队的方式:fq_codel 通过流隔离与主动丢弃来压低缓冲膨胀带来的延迟,fq 则提供分片与限速能力,常与 bbr 拥塞控制搭配使用。这个参数只影响之后新建的队列规则,已经存在的网卡队列不会因此重建。
基本信息
| 参数 | net.core.default_qdisc |
|---|---|
| 常见取值 | fq_codel(现代内核默认)/ fq / pfifo_fast / noqueue |
| 生效范围 | 之后新建 qdisc 的网卡与虚拟接口 |
| 既有设备 | 需对具体设备执行 tc qdisc replace 才会改变 |
| 查看实际值 | tc qdisc show dev <接口> |
| 搭配关系 | bbr 拥塞控制常与 fq 搭配使用,但不是强制要求 |
典型使用场景
- 降低缓冲膨胀:转发与出口链路上用 fq_codel 类算法抑制排队延迟
- 启用 bbr:按常见实践把队列规则改为 fq,提供更细的发送节奏控制
- 延迟敏感服务:出口设备使用主动队列管理,避免大缓冲造成的延迟堆积
- 排查队列异常:确认目标设备上实际生效的 qdisc 与预期是否一致
- 容器与虚拟网络:veth 接口的队列规则同样受该默认值影响
查看与调整
查看与调整
sysctl net.core.default_qdisc # 读当前默认值
tc qdisc show dev eth0 # 看目标设备实际使用的队列规则
tc -s qdisc show dev eth0 # 带统计信息,观察丢弃与积压
sysctl -w net.core.default_qdisc=fq # 临时改为 fq
tc qdisc replace dev eth0 root fq # 对既有设备重建队列规则
tc qdisc show | head -20 # 概览所有设备的队列规则落盘与回读
落盘与回读
# /etc/sysctl.d/99-net-tuning.conf
net.core.default_qdisc = fq # 新建队列规则默认使用 fq
net.ipv4.tcp_congestion_control = bbr # 常见搭配,按实际链路评估
# 回读命令:sysctl net.core.default_qdisc常见队列规则对照
| 取值 | 特点 | 适用场景 |
|---|---|---|
| fq_codel | 按流隔离并主动管理队列,抑制缓冲膨胀 | 通用默认,适合多数出口链路 |
| fq | 提供分片与 pacing 支持,队列管理较简单 | 与 bbr 搭配的常见选择 |
| pfifo_fast | 按优先级三个队列,无主动管理 | 老内核默认,链路空闲时影响不大 |
| noqueue | 不排队,直接发送 | 虚拟接口常见,无法在此基础上做排队控制 |
已有队列规则不会因为改默认值而重建:改完之后要对目标设备单独执行 tc qdisc replace。排障时以 tc qdisc show 显示的实际规则为准,而不是 sysctl 的回读值。
队列规则与拥塞控制是协议栈的两层:前者管发包排队,后者管发送速率。更换队列规则能改善排队延迟,但不会改变拥塞控制算法本身的行为,两者应分开评估。