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)控制迁移的触发阈值、频率与批量大小。

组调度与CPU域迁移概念关系 组调度与CPU域迁移概念关系 组调度 (cgroup) 公平分配CPU时间 组权重与负载计算 跨组迁移决策 CPU域层级:SMT域 → MC域 → NUMA域 关键迁移参数 sched_migration_cost_ns | sched_nr_migrate | sched_balance_policy

1.3 组调度场景下的迁移挑战

当组调度与CPU域迁移叠加时,内核面临三个核心矛盾:

  1. 公平性 vs. 局部性:为了组间公平,内核可能将任务迁移到远端CPU,但牺牲了缓存局部性。
  2. 迁移粒度:以“组”为单位迁移还是以“组内任务”为单位迁移?粒度过粗导致负载不均,过细增加迁移开销。
  3. 参数耦合: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~5章 参数详解篇 第6~15章 场景实战篇 第16~25章 进阶工具篇 第26~30章 学习建议 每章结束后完成实践任务,使用 /proc/sched_debug 验证参数效果 建议在虚拟机或容器环境中进行参数调整,避免影响生产系统

1.6 前置知识准备

学习本课程前,建议具备以下基础:

  • 熟悉Linux进程调度基本概念(CFS调度器、nice值、时间片)。
  • 了解cgroup v1/v2的基本用法(cpu、cpuset子系统)。
  • 能够使用 sysctl、cat /proc/cpuinfo、lscpu 查看系统信息。