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。
2. HTB - Hierarchical Token Bucket (CONFIG_NET_SCH_HTB
)
- 功能:分层令牌桶,支持带宽分配、速率限制、优先级调度。
- 原理:每个 class 有主速率(保证带宽)和最大速率(突发带宽),未用带宽可被子 class 借用,实现层级带宽共享。
- 使用场景:企业、数据中心流量管理、保证和限制带宽。
3. HFSC - Hierarchical Fair Service Curve (CONFIG_NET_SCH_HFSC
)
- 功能:按服务曲线调度,支持延迟/带宽保证。
- 原理:为每个流量 class 配置服务曲线,实现严格带宽和延迟保证,适用于实时应用。
- 使用场景:VoIP、音视频等对时延敏感的场合。
4. PRIO - Priority Queuing (CONFIG_NET_SCH_PRIO
)
- 功能:多级优先级队列,优先级高的队列先发包。
- 原理:包根据优先级分配到不同队列,先检查高优,若有包则先发,没有才轮到低优。
- 使用场景:简单优先级调度,如语音高于普通流量。
5. MULTIQ - Multi-Queue (CONFIG_NET_SCH_MULTIQ
)
- 功能:为多队列网卡提供 Qdisc 支持,实现并行处理。
- 原理:每个硬件队列有独立 Qdisc,包按队列编号分配,实现多核并发。
- 使用场景:多队列网卡(如万兆网卡)环境。
6. RED - Random Early Detection (CONFIG_NET_SCH_RED
)
- 功能:主动丢包算法,防止队列拥塞,提升 TCP 性能。
- 原理:队列长度超过阈值时,按概率丢包,提前通知发送端减速。
- 使用场景:路由器、交换机防止队尾丢包。
7. SFB - Stochastic Fair Blue (CONFIG_NET_SCH_SFB
)
- 功能:公平丢包算法,防止队列被恶意流占满。
- 原理:用哈希桶追踪流活跃度,对活跃流增加丢包概率。
- 使用场景:防止 DoS、P2P 流量挤占带宽。
8. SFQ - Stochastic Fairness Queueing (CONFIG_NET_SCH_SFQ
)
- 功能:实现流间公平调度,避免单一流独占带宽。
- 原理:用 hash 将流映射到多个队列,轮询发包。
- 使用场景:家庭、办公环境,防止某一主机/端口独占出口带宽。
9. TEQL - True Link Equalizer (CONFIG_NET_SCH_TEQL
)
- 功能:多链路聚合,实现链路捆绑、负载均衡。
- 原理:包轮流在多链路(接口)间分发,实现带宽叠加。
- 使用场景:多拨、多 WAN 口聚合。
10. TBF - Token Bucket Filter (CONFIG_NET_SCH_TBF
)
- 功能:令牌桶流控,实现带宽限速和突发流量控制。
- 原理:按速率生成令牌,包需消耗令牌才可发送,突发时消耗桶中积蓄的令牌。
- 使用场景:流量整形、用户带宽限速。
11. CBS - Credit Based Shaper (CONFIG_NET_SCH_CBS
)
- 功能:用于 TSN(时间敏感网络),为流量分配带宽,保证实时流量。
- 原理:每个周期根据 credit 计算能否发包,实现带宽和延迟保证。
- 使用场景:工业以太网、音视频流实时传输。
12. ETF - Earliest TxTime First (CONFIG_NET_SCH_ETF
)
- 功能:按调度时间戳(TxTime)发送数据包,支持 TSN。
- 原理:只有到达指定时间的包才允许发送,保证定时调度。
- 使用场景:工业自动化,音视频同步传输。
13. TAPRIO - Time-Aware Priority Scheduler (CONFIG_NET_SCH_TAPRIO
)
- 功能:基于时间感知的优先级队列调度,TSN 关键技术。
- 原理:通过周期性 Gate Schedule,按时间片严格控制各队列发包窗口。
- 使用场景:工业以太网、汽车以太网、音视频同步。
14. GRED - Generic Random Early Detection (CONFIG_NET_SCH_GRED
)
- 功能:多队列 RED,支持多种等级服务(如 DiffServ)。
- 原理:每个队列独立 RED 算法,适配不同服务等级。
- 使用场景:需区分服务等级的路由器。
15. DSMARK - Differentiated Services Marker (CONFIG_NET_SCH_DSMARK
)
- 功能:自动标记包的 DiffServ 字段,实现 QoS 分类。
- 原理:按规则修改 IP 包的 TOS 字段。
- 使用场景:企业、运营商级 QoS。
16. NETEM - Network Emulator (CONFIG_NET_SCH_NETEM
)
- 功能:网络仿真,能引入延迟、丢包、乱序等。
- 原理:按配置随机/固定方式修改包的时延、丢包概率等。
- 使用场景:测试网络应用在不同网络状况下的表现。
17. DRR - Deficit Round Robin (CONFIG_NET_SCH_DRR
)
- 功能:无饥饿的加权轮询,按权重公平调度各队列。
- 原理:每轮分配 deficit,若队列包大小小于 deficit 就允许发,未用 deficit 保留到下轮。
- 使用场景:多流公平带宽分配。
18. MQPRIO - MultiQueue Priority Qdisc (CONFIG_NET_SCH_MQPRIO
)
- 功能:多队列优先级调度,适配多队列网卡。
- 原理:将流量按优先级映射到不同硬件队列。
- 使用场景:数据中心、企业级多队列网卡。
19. SKBPRIO - skb Priority Queue (CONFIG_NET_SCH_SKBPRIO
)
- 功能:按 skb->priority 字段调度。
- 原理:skb->priority 越小优先级越高。
- 使用场景:自定义协议、内核模块产生的数据包优先级调度。
20. CHOKE - CHOose and Keep for responsive flows, drop Else (CONFIG_NET_SCH_CHOKE
)
- 功能:基于 RED 的自适应丢包,防止非响应流滥用。
- 原理:与 RED 类似,但检测到非响应流时会更激进丢包。
- 使用场景:防止 P2P、DoS 占用带宽。
21. QFQ - Quick Fair Queueing (CONFIG_NET_SCH_QFQ
)
- 功能:高效、近似精确的公平队列。
- 原理:为每个流分配独立队列,依据权重调度,近似 GPS。
- 使用场景:需要低复杂度高公平的环境。
22. CODEL - Controlled Delay (CONFIG_NET_SCH_CODEL
)
- 功能:自适应队列管理,控制延迟,防止 bufferbloat。
- 原理:检测包在队列中延迟,延迟高时丢包,低时放行。
- 使用场景:家庭、企业网关控制延迟。
23. FQ_CODEL - Fair Queue Controlled Delay (CONFIG_NET_SCH_FQ_CODEL
)
- 功能:结合 SFQ 和 CODEL,既能公平调度又能控制延迟。
- 原理:为每个流分队列,队内用 CODEL 控制延迟。
- 使用场景:家庭宽带、数据中心。
24. CAKE - Common Applications Kept Enhanced (CONFIG_NET_SCH_CAKE
)
- 功能:一体化智能队列管理,自动分类、队列、整形和延迟控制。
- 原理:集成 FQ、CODEL、流识别、整形等多功能于一体。
- 使用场景:家庭、SOHO 网关,易用高效。
25. FQ - Fair Queueing (CONFIG_NET_SCH_FQ
)
- 功能:基于流的公平队列,可结合 pacing(速率控制)。
- 原理:每个流独立队列,按公平和速率限制出队。
- 使用场景:TCP pacing,数据中心。
26. HHF - Heavy-Hitter Filter (CONFIG_NET_SCH_HHF
)
- 功能:检测并限制大流(heavy-hitter),提升公平性。
- 原理:跟踪流活跃度,活跃流被限制,促进公平。
- 使用场景:防止单一流爆发占用带宽。
27. PIE - Proportional Integral controller Enhanced (CONFIG_NET_SCH_PIE
)
- 功能:延迟控制算法,主动丢包,防止 bufferbloat。
- 原理:根据队列延迟动态调整丢包概率。
- 使用场景:宽带网关、运营商设备。
28. PLUG - Simple Packet Plug (CONFIG_NET_SCH_PLUG
)
- 功能:简单的“塞车”队列,可暂存包直到被手动释放。
- 原理:所有包暂存,直到明确释放。
- 使用场景:调试、测试、流量捕获。
29. ETS - Enhanced Transmission Selection (CONFIG_NET_SCH_ETS
)
- 功能:多队列加权轮询调度,支持严格优先级和带宽分配。
- 原理:部分队列为 Strict Priority,部分为 Weighted Round Robin。
- 使用场景:数据中心、以太网交换机。
30. DEFAULT - Default Qdisc (CONFIG_NET_SCH_DEFAULT
)
- 功能:指定默认 Qdisc 类型。
- 原理:内核启动或接口 up 时,自动应用本配置。
- 使用场景:简化部署,指定全局队列管理策略。
结语
Linux 网络队列调度器为各种业务场景提供了丰富的流量管理手段。合理选择和配置 Qdisc 能显著提升网络性能与服务质量。
注:如需进一步配置和调优,推荐阅读
tc
工具官方文档与内核源码。