目录
net.core.default_qdisc
是 Linux 内核中的一个关键参数,用于设置系统默认的网络数据包队列规则(Queueing Discipline,简称 qdisc)。这个参数直接影响网络接口如何处理流量排队和调度,对网络性能、延迟和公平性起着至关重要的作用。
一、核心概念
当网络接口的发送速率低于数据包到达速率时,数据包会在队列中等待发送。qdisc 决定了这些数据包的排队方式:
- 如何排序:按优先级?按连接?
- 如何处理拥塞:丢弃哪些包?标记哪些包?
- 如何分配带宽:公平分配?优先保障关键流量?
二、常见 qdisc 类型及适用场景
1. fq_codel(推荐默认值)
- 原理:结合公平队列(Fair Queueing)和控制延迟(Controlled Delay)机制。
- FQ:为每个流(通常按 IP+端口区分)创建独立队列,公平分配带宽。
- CoDel:主动检测并丢弃可能导致高延迟的数据包,避免队列膨胀。
- 优势:
- 低延迟:避免 Bufferbloat(缓冲区膨胀)问题,适合实时应用(视频会议、游戏)。
- 公平性:防止大流量连接垄断带宽,保障小流量连接的响应速度。
- 自适应性:无需手动调优,自动适应网络变化。
- 适用场景:所有现代网络环境(家庭、企业、移动设备)。
2. pfifo_fast(传统默认值)
- 原理:基于优先级的先进先出队列,分为 3 个优先级(0 最高,2 最低)。
- 劣势:
- 高延迟:高负载下队列会膨胀,导致延迟显著增加。
- 不公平:大流量连接可能长时间占用队列,饿死小流量。
- 适用场景:简单网络,流量少且无特殊优先级需求。
3. htb(Hierarchical Token Bucket)
- 原理:树形结构,支持多级带宽分配和优先级控制。
- 优势:
- 精确限速:为不同类别的流量设置硬上限(例:保证语音流量 200Mbps,限制下载流量 50Mbps)。
- 优先级保障:通过树形结构实现流量分级。
- 劣势:配置复杂,需了解网络流量模型。
- 适用场景:企业网络、多租户环境,需严格带宽控制。
4. tbf(Token Bucket Filter)
- 原理:基于令牌桶算法,限制流量平均速率和突发大小。
- 优势:简单有效的限速工具。
- 适用场景:上行带宽限速(例:限制服务器对外流量为 1Mbps)。
5. fq(Fair Queueing)
- 原理:公平队列,但不包含 CoDel 延迟控制。
- 适用场景:与其他 qdisc 组合使用(如
fq + codel
)。
三、如何配置
1. 查看当前值
sysctl net.core.default_qdisc
输出示例:
net.core.default_qdisc = fq_codel
2. 临时修改(重启后失效)
# 设置为 fq_codel
sudo sysctl -w net.core.default_qdisc=fq_codel
# 设置为 pfifo_fast
sudo sysctl -w net.core.default_qdisc=pfifo_fast
3. 永久修改
编辑 /etc/sysctl.conf
或 /etc/sysctl.d/99-sysctl.conf
,添加:
net.core.default_qdisc = fq_codel
保存后执行:
sudo sysctl -p
四、为什么推荐 fq_codel
?
在现代网络中,fq_codel
相比 pfifo_fast
有显著优势:
- 解决 Bufferbloat 问题:当网络拥塞时,传统队列会积累大量数据包(缓冲区膨胀),导致延迟飙升(甚至可达数秒)。CoDel 通过主动丢弃数据包来控制队列长度,保持低延迟(通常<50ms)。
- 公平性保障:FQ 机制确保每个连接(如视频、游戏、下载)获得公平的带宽份额,避免某个连接独占带宽导致其他连接卡顿。
- 自动优化:无需手动调整参数,适合普通用户和复杂网络环境。
五、特殊场景调整
场景 | 推荐 qdisc | 额外配置建议 |
---|---|---|
默认配置 | fq_codel | 无需额外配置 |
企业网络带宽控制 | htb + fq_codel | 为关键业务流量创建高优先级队列 |
家庭网络(多设备) | fq_codel | 启用 net.ipv4.tcp_congestion_control=bbr 提升整体性能 |
低内核版本(❤️.12) | pfifo_fast | 升级内核或使用 sfq 替代 |
多队列网卡 | mq + fq_codel | 利用多队列并行处理 |
六、验证配置效果
1. 使用 ss
查看队列状态
ss -it | grep -A5 <目标IP>
关注 rto
(重传超时)和 inflight
(飞行中的数据包):
- 理想状态下,
rto
应保持稳定(如 200ms 左右)。 inflight
不应持续增长,避免队列积压。
2. 使用 tc
查看队列长度
tc -s qdisc show dev eth0
对于 fq_codel
,队列长度应接近 0(CoDel 会主动控制队列)。
七、注意事项
- 内核支持:
fq_codel
需要 Linux 3.12+ 内核,较旧系统可能不支持。 - 接口级覆盖:若某个网络接口通过
tc
命令单独配置了 qdisc(例:tc qdisc add dev eth0 root fq_codel
),则该接口会使用单独配置的 qdisc,忽略default_qdisc
。 - 与 TCP 拥塞控制配合:
fq_codel
通常与BBR
拥塞控制算法配合使用,进一步优化性能:sysctl -w net.ipv4.tcp_congestion_control=bbr
总结
- 默认选择:推荐使用
fq_codel
,它能自动优化大多数网络场景的延迟和公平性。 - 特殊需求:根据具体网络环境(如企业限速、多队列网卡)选择其他 qdisc。
- 监控优化:定期检查网络性能,必要时调整配置。