【网络】Linux 内核优化实战 - net.core.default_qdisc

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 有显著优势:

  1. 解决 Bufferbloat 问题:当网络拥塞时,传统队列会积累大量数据包(缓冲区膨胀),导致延迟飙升(甚至可达数秒)。CoDel 通过主动丢弃数据包来控制队列长度,保持低延迟(通常<50ms)。
  2. 公平性保障:FQ 机制确保每个连接(如视频、游戏、下载)获得公平的带宽份额,避免某个连接独占带宽导致其他连接卡顿。
  3. 自动优化:无需手动调整参数,适合普通用户和复杂网络环境。

五、特殊场景调整

场景推荐 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 会主动控制队列)。

七、注意事项

  1. 内核支持fq_codel 需要 Linux 3.12+ 内核,较旧系统可能不支持。
  2. 接口级覆盖:若某个网络接口通过 tc 命令单独配置了 qdisc(例:tc qdisc add dev eth0 root fq_codel),则该接口会使用单独配置的 qdisc,忽略 default_qdisc
  3. 与 TCP 拥塞控制配合fq_codel 通常与 BBR 拥塞控制算法配合使用,进一步优化性能:
    sysctl -w net.ipv4.tcp_congestion_control=bbr
    

总结

  • 默认选择:推荐使用 fq_codel,它能自动优化大多数网络场景的延迟和公平性。
  • 特殊需求:根据具体网络环境(如企业限速、多队列网卡)选择其他 qdisc。
  • 监控优化:定期检查网络性能,必要时调整配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值