Linux 内核队列调度相关内核选项详解

Linux 内核队列调度(Queueing/Scheduling)内核选项详解

Linux 内核中的队列调度器(Queuing Disciplines, Qdisc)是网络数据包处理的核心,负责决定数据包在网络接口上的发送顺序、速率、优先级等。通过配置不同的 Qdisc,可以实现带宽管理、流量整形、延迟控制、优先级保障等功能。下面详细介绍常用 Qdisc 内核选项的功能、原理、使用场景,并配以兼容 CSDN 的 Mermaid 流程图。


1. CBQ - Class-Based Queuing (CONFIG_NET_SCH_CBQ)

  • 功能:基于类别的分层队列调度,允许将带宽分配给不同的流或类别,并支持带宽借贷、延迟保证、流量整形等。
  • 原理:将流量分为多个 class,按树形结构分层,每个 class 有独立的速率限制、优先级等。调度器根据配置动态分配带宽、进行优先级判断和借贷。
  • 使用场景:需要细粒度带宽管理和分层流量控制的场合,如 ISP、企业级 QoS。

Root CBQ qdisc Class 1 Class 2 Subclass A Subclass B Subclass A Subclass B Packet Queue 1 Packet Queue 2 Packet Queue 3 Packet Queue 4


2. HTB - Hierarchical Token Bucket (CONFIG_NET_SCH_HTB)

  • 功能:分层令牌桶,支持带宽分配、速率限制、优先级调度。
  • 原理:每个 class 有主速率(保证带宽)和最大速率(突发带宽),未用带宽可被子 class 借用,实现层级带宽共享。
  • 使用场景:企业、数据中心流量管理、保证和限制带宽。

Root HTB Parent Class Child Class 1 Child Class 2 Packet Queue 1 Packet Queue 2


3. HFSC - Hierarchical Fair Service Curve (CONFIG_NET_SCH_HFSC)

  • 功能:按服务曲线调度,支持延迟/带宽保证。
  • 原理:为每个流量 class 配置服务曲线,实现严格带宽和延迟保证,适用于实时应用。
  • 使用场景:VoIP、音视频等对时延敏感的场合。

Root HFSC Real-time Class Best-effort Class Q1 Q2


4. PRIO - Priority Queuing (CONFIG_NET_SCH_PRIO)

  • 功能:多级优先级队列,优先级高的队列先发包。
  • 原理:包根据优先级分配到不同队列,先检查高优,若有包则先发,没有才轮到低优。
  • 使用场景:简单优先级调度,如语音高于普通流量。

PRIO Qdisc High Priority Medium Priority Low Priority


5. MULTIQ - Multi-Queue (CONFIG_NET_SCH_MULTIQ)

  • 功能:为多队列网卡提供 Qdisc 支持,实现并行处理。
  • 原理:每个硬件队列有独立 Qdisc,包按队列编号分配,实现多核并发。
  • 使用场景:多队列网卡(如万兆网卡)环境。

Root MULTIQ HW Queue 0 HW Queue 1 HW Queue 2


6. RED - Random Early Detection (CONFIG_NET_SCH_RED)

  • 功能:主动丢包算法,防止队列拥塞,提升 TCP 性能。
  • 原理:队列长度超过阈值时,按概率丢包,提前通知发送端减速。
  • 使用场景:路由器、交换机防止队尾丢包。

Below min Above max Between Yes No Packet Arrives Queue Length Check Enqueue Drop Random Drop?


7. SFB - Stochastic Fair Blue (CONFIG_NET_SCH_SFB)

  • 功能:公平丢包算法,防止队列被恶意流占满。
  • 原理:用哈希桶追踪流活跃度,对活跃流增加丢包概率。
  • 使用场景:防止 DoS、P2P 流量挤占带宽。

Yes No Packet Hash Buckets Active? Drop Enqueue


8. SFQ - Stochastic Fairness Queueing (CONFIG_NET_SCH_SFQ)

  • 功能:实现流间公平调度,避免单一流独占带宽。
  • 原理:用 hash 将流映射到多个队列,轮询发包。
  • 使用场景:家庭、办公环境,防止某一主机/端口独占出口带宽。

Root SFQ Flow Queue 0 Flow Queue 1 Flow Queue 2 Round Robin Dequeue


  • 功能:多链路聚合,实现链路捆绑、负载均衡。
  • 原理:包轮流在多链路(接口)间分发,实现带宽叠加。
  • 使用场景:多拨、多 WAN 口聚合。

TEQL Qdisc Eth0 Eth1 Eth2


10. TBF - Token Bucket Filter (CONFIG_NET_SCH_TBF)

  • 功能:令牌桶流控,实现带宽限速和突发流量控制。
  • 原理:按速率生成令牌,包需消耗令牌才可发送,突发时消耗桶中积蓄的令牌。
  • 使用场景:流量整形、用户带宽限速。

Yes No Packet Arrive Token Enough? Transmit Queue or Drop


11. CBS - Credit Based Shaper (CONFIG_NET_SCH_CBS)

  • 功能:用于 TSN(时间敏感网络),为流量分配带宽,保证实时流量。
  • 原理:每个周期根据 credit 计算能否发包,实现带宽和延迟保证。
  • 使用场景:工业以太网、音视频流实时传输。

Yes No Credit Update Credit>0? Transmit Wait


12. ETF - Earliest TxTime First (CONFIG_NET_SCH_ETF)

  • 功能:按调度时间戳(TxTime)发送数据包,支持 TSN。
  • 原理:只有到达指定时间的包才允许发送,保证定时调度。
  • 使用场景:工业自动化,音视频同步传输。

Yes No Packet + TxTime Now >= TxTime? Send Wait


13. TAPRIO - Time-Aware Priority Scheduler (CONFIG_NET_SCH_TAPRIO)

  • 功能:基于时间感知的优先级队列调度,TSN 关键技术。
  • 原理:通过周期性 Gate Schedule,按时间片严格控制各队列发包窗口。
  • 使用场景:工业以太网、汽车以太网、音视频同步。

周期开始 Queue0 Open Queue1 Open Queue2 Open All Gates Closed


14. GRED - Generic Random Early Detection (CONFIG_NET_SCH_GRED)

  • 功能:多队列 RED,支持多种等级服务(如 DiffServ)。
  • 原理:每个队列独立 RED 算法,适配不同服务等级。
  • 使用场景:需区分服务等级的路由器。

Packet Arrives Queue Select RED for Class1 RED for Class2 Out


15. DSMARK - Differentiated Services Marker (CONFIG_NET_SCH_DSMARK)

  • 功能:自动标记包的 DiffServ 字段,实现 QoS 分类。
  • 原理:按规则修改 IP 包的 TOS 字段。
  • 使用场景:企业、运营商级 QoS。

Packet Set DS Field Out


16. NETEM - Network Emulator (CONFIG_NET_SCH_NETEM)

  • 功能:网络仿真,能引入延迟、丢包、乱序等。
  • 原理:按配置随机/固定方式修改包的时延、丢包概率等。
  • 使用场景:测试网络应用在不同网络状况下的表现。

Packet Add Delay Drop? Out


17. DRR - Deficit Round Robin (CONFIG_NET_SCH_DRR)

  • 功能:无饥饿的加权轮询,按权重公平调度各队列。
  • 原理:每轮分配 deficit,若队列包大小小于 deficit 就允许发,未用 deficit 保留到下轮。
  • 使用场景:多流公平带宽分配。

Round Robin Q1 Q2 Q3


18. MQPRIO - MultiQueue Priority Qdisc (CONFIG_NET_SCH_MQPRIO)

  • 功能:多队列优先级调度,适配多队列网卡。
  • 原理:将流量按优先级映射到不同硬件队列。
  • 使用场景:数据中心、企业级多队列网卡。

MQPRIO Qdisc HW Queue 0 HW Queue 1 HW Queue 2


19. SKBPRIO - skb Priority Queue (CONFIG_NET_SCH_SKBPRIO)

  • 功能:按 skb->priority 字段调度。
  • 原理:skb->priority 越小优先级越高。
  • 使用场景:自定义协议、内核模块产生的数据包优先级调度。

Packet Check skb->priority Enqueue by Prio


20. CHOKE - CHOose and Keep for responsive flows, drop Else (CONFIG_NET_SCH_CHOKE)

  • 功能:基于 RED 的自适应丢包,防止非响应流滥用。
  • 原理:与 RED 类似,但检测到非响应流时会更激进丢包。
  • 使用场景:防止 P2P、DoS 占用带宽。

Queue Check RED Algorithm Drop/Keep


21. QFQ - Quick Fair Queueing (CONFIG_NET_SCH_QFQ)

  • 功能:高效、近似精确的公平队列。
  • 原理:为每个流分配独立队列,依据权重调度,近似 GPS。
  • 使用场景:需要低复杂度高公平的环境。

QFQ Root Flow 1 Flow 2 Flow 3


22. CODEL - Controlled Delay (CONFIG_NET_SCH_CODEL)

  • 功能:自适应队列管理,控制延迟,防止 bufferbloat。
  • 原理:检测包在队列中延迟,延迟高时丢包,低时放行。
  • 使用场景:家庭、企业网关控制延迟。

High Low Packet Check Sojourn Time Drop Enqueue


23. FQ_CODEL - Fair Queue Controlled Delay (CONFIG_NET_SCH_FQ_CODEL)

  • 功能:结合 SFQ 和 CODEL,既能公平调度又能控制延迟。
  • 原理:为每个流分队列,队内用 CODEL 控制延迟。
  • 使用场景:家庭宽带、数据中心。

Root Flow Queue 0 Flow Queue 1 CODEL


24. CAKE - Common Applications Kept Enhanced (CONFIG_NET_SCH_CAKE)

  • 功能:一体化智能队列管理,自动分类、队列、整形和延迟控制。
  • 原理:集成 FQ、CODEL、流识别、整形等多功能于一体。
  • 使用场景:家庭、SOHO 网关,易用高效。

CAKE Qdisc AutoClassify PerFlowQ FQ_CODEL


25. FQ - Fair Queueing (CONFIG_NET_SCH_FQ)

  • 功能:基于流的公平队列,可结合 pacing(速率控制)。
  • 原理:每个流独立队列,按公平和速率限制出队。
  • 使用场景:TCP pacing,数据中心。

Root Flow0 Flow1 Flow2


26. HHF - Heavy-Hitter Filter (CONFIG_NET_SCH_HHF)

  • 功能:检测并限制大流(heavy-hitter),提升公平性。
  • 原理:跟踪流活跃度,活跃流被限制,促进公平。
  • 使用场景:防止单一流爆发占用带宽。

Yes No Packet Heavy Hitter? Penalize Normal


27. PIE - Proportional Integral controller Enhanced (CONFIG_NET_SCH_PIE)

  • 功能:延迟控制算法,主动丢包,防止 bufferbloat。
  • 原理:根据队列延迟动态调整丢包概率。
  • 使用场景:宽带网关、运营商设备。

Delay High Delay Low Packet Check Queue Delay Drop Enqueue


28. PLUG - Simple Packet Plug (CONFIG_NET_SCH_PLUG)

  • 功能:简单的"塞车"队列,可暂存包直到被手动释放。
  • 原理:所有包暂存,直到明确释放。
  • 使用场景:调试、测试、流量捕获。

Release Packet Buffer Out


29. ETS - Enhanced Transmission Selection (CONFIG_NET_SCH_ETS)

  • 功能:多队列加权轮询调度,支持严格优先级和带宽分配。
  • 原理:部分队列为 Strict Priority,部分为 Weighted Round Robin。
  • 使用场景:数据中心、以太网交换机。

ETS Qdisc Strict Prio 1 Strict Prio 2 Weighted RR Queues


30. DEFAULT - Default Qdisc (CONFIG_NET_SCH_DEFAULT)

  • 功能:指定默认 Qdisc 类型。
  • 原理:内核启动或接口 up 时,自动应用本配置。
  • 使用场景:简化部署,指定全局队列管理策略。

结语

Linux 网络队列调度器为各种业务场景提供了丰富的流量管理手段。合理选择和配置 Qdisc 能显著提升网络性能与服务质量。

注:如需进一步配置和调优,推荐阅读 tc 工具官方文档与内核源码。