1. 课程导论:组调度与CPU域迁移的基本概念、课程目标与学习路径
1.1 为什么需要组调度?
在现代Linux服务器与容器化环境中,多个任务(进程/线程)往往归属于不同的控制组(cgroup)。如果内核只按单个任务进行负载均衡,会导致以下问题:
- 资源争抢失控:高优先级组内的任务可能被频繁迁移到空闲CPU,而低优先级组却独占本地CPU,造成服务质量(QoS)抖动。
- 缓存污染:跨CPU域迁移会刷新L1/L2缓存,若迁移过于频繁,有效计算时间被访存延迟吞噬。
- NUMA失衡:跨NUMA节点迁移带来的远端内存访问延迟可达本地访问的1.5~3倍。
组调度(Group Scheduling)将调度决策的单位从“单个任务”提升到“任务组”,内核在负载均衡时以组为单位计算权重与负载,从而保证组间资源分配的公平性。
关键指标:组调度场景下,CPU域迁移参数直接影响 组间公平性 与 系统吞吐量 的平衡。调优不当可能导致迁移抖动增加30%以上。
1.2 CPU域迁移的基本概念
Linux内核将CPU拓扑组织为层级化的“调度域”(Scheduling Domain)。每个域包含一组CPU核心,域内可以进行负载均衡与任务迁移。常见的域层级如下:
| 域层级 | 包含关系 | 迁移代价 | 典型场景 |
|---|---|---|---|
| SMT域 | 同一物理核心的多个超线程 | 极低(共享L1/L2) | 超线程负载均衡 |
| MC域 | 同一NUMA节点内的物理核心 | 低(共享L3缓存) | 单节点内负载均衡 |
| NUMA域 | 跨NUMA节点的所有核心 | 高(远端内存访问) | 跨节点负载均衡 |
当内核在某个域内发现负载不均衡时,会触发CPU域迁移——将任务从高负载CPU迁移到低负载CPU。迁移参数(如 sched_migration_cost_ns、sched_nr_migrate)控制迁移的触发阈值、频率与批量大小。
1.3 组调度场景下的迁移挑战
当组调度与CPU域迁移叠加时,内核面临三个核心矛盾:
- 公平性 vs. 局部性:为了组间公平,内核可能将任务迁移到远端CPU,但牺牲了缓存局部性。
- 迁移粒度:以“组”为单位迁移还是以“组内任务”为单位迁移?粒度过粗导致负载不均,过细增加迁移开销。
- 参数耦合:
sched_migration_cost_ns(迁移成本估算)与sched_nr_migrate(批量迁移数)相互影响,调优需联合考虑。
常见误区:直接套用单任务场景的迁移参数到组调度环境。例如,将
sched_migration_cost_ns 设置过小,会导致组内任务被频繁迁移,组间公平性反而恶化。
1.4 课程目标
完成本课程后,你将能够:
- 理解Linux内核组调度与CPU域迁移的协同机制。
- 掌握
sched_migration_cost_ns、sched_nr_migrate、sched_balance_policy等核心参数的含义与调优方法。 - 针对容器、数据库、实时任务等典型组调度场景,制定参数配置方案。
- 使用
perf、trace-cmd、/proc/sched_debug等工具验证调优效果。
1.5 学习路径
课程分为四个阶段,建议按顺序学习:
| 阶段 | 章节范围 | 核心内容 | 实践任务 |
|---|---|---|---|
| 基础篇 | 第1~5章 | 组调度原理、CPU域拓扑、迁移参数概览 | 查看本机CPU域拓扑与默认参数 |
| 参数详解篇 | 第6~15章 | 逐个参数原理、影响范围、调优公式 | 使用sysctl调整参数并观察效果 |
| 场景实战篇 | 第16~25章 | 容器混部、数据库、实时任务等场景调优 | 搭建测试环境,对比调优前后性能 |
| 进阶与工具篇 | 第26~30章 | 动态调优、perf/trace-cmd分析、内核补丁 | 编写自动化调优脚本 |
1.6 前置知识准备
学习本课程前,建议具备以下基础:
- 熟悉Linux进程调度基本概念(CFS调度器、nice值、时间片)。
- 了解cgroup v1/v2的基本用法(
cpu、cpuset子系统)。 - 能够使用
sysctl、cat /proc/cpuinfo、lscpu查看系统信息。