关键源代码文件位置(Linux 5.4)
功能描述 | 文件路径 |
---|---|
主调度器逻辑入口 | kernel/sched/core.c |
CFS(公平调度器)实现 | kernel/sched/fair.c |
负载均衡核心函数 load_balance() | kernel/sched/fair.c |
调度域与调度组结构定义 | include/linux/sched/topology.h |
调度器初始化 | kernel/sched/core.c → sched_init() |
我们来构建一个清晰的 调用关系树(call tree),展示 Linux 5.4 内核中调度器的关键函数如何协同工作,特别是围绕 SMP 负载均衡 和 load_balance()
的调用路径。
🌳 总览:调度器负载均衡调用树(Linux 5.4)
text
kernel/sched/core.c
└── scheduler_tick() // 每个CPU周期性触发
└── trigger_load_balance()
└── raise_softirq(SCHED_SOFTIRQ)
kernel/sched/fair.c
└── run_rebalance_domains() // SCHED_SOFTIRQ处理函数
└── rebalance_domains()
└── load_balance() // 核心负载均衡函数
├── find_busiest_group()
│ └── update_group_capacity()
├── find_busiest_queue()
└── move_tasks()
🔍 详细解释每个关键函数
1. scheduler_tick()
📁 文件:kernel/sched/core.c
每个 CPU 核心的时钟中断触发调度器 tick:
c
void scheduler_tick(void) {
...
trigger_load_balance(rq);
}
2. trigger_load_balance()
📁 文件:kernel/sched/core.c
触发软中断 SCHED_SOFTIRQ
:
c
void trigger_load_balance(struct rq *rq) {
raise_softirq(SCHED_SOFTIRQ);
}
3. run_rebalance_domains()
📁 文件:kernel/sched/fair.c
这是 SCHED_SOFTIRQ
的处理函数:
c
void run_rebalance_domains(struct softirq_action *h) {
rebalance_domains(cpu, idle);
}
4. rebalance_domains()
📁 文件:kernel/sched/fair.c
判断是否需要负载均衡,并调用 load_balance()
:
c
int rebalance_domains(int cpu, enum cpu_idle_type idle) {
...
load_balance(cpu, this_rq, sd, idle);
}
5. load_balance()
📁 文件:kernel/sched/fair.c
核心负载均衡逻辑:
c
int load_balance(...) {
busiest_group = find_busiest_group(...);
busiest_rq = find_busiest_queue(...);
move_tasks(busiest_rq, this_rq, ...);
}
🧩 关键辅助函数调用树
text
load_balance()
├── find_busiest_group()
│ └── update_group_capacity()
├── find_busiest_queue()
└── move_tasks()
这些函数负责:
-
评估哪个调度组最繁忙
-
找出最繁忙的运行队列
-
将任务从繁忙核心迁移到空闲核心
📘 调度器初始化调用树
text
kernel/sched/core.c
└── sched_init()
├── init_sched_domains()
│ └── build_sched_domains()
│ └── partition_sched_domains()
└── init_task()
这些函数在系统启动时构建调度域和调度组,为负载均衡提供结构支持。
✅ 总结
Linux 调度器在每个 CPU tick 时触发软中断,进入 run_rebalance_domains()
,最终调用 load_balance()
来评估是否需要迁移任务。整个过程是分布式的,每个核心独立运行调度器逻辑。