SMP 多核负载均衡

关键源代码文件位置(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.csched_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() 来评估是否需要迁移任务。整个过程是分布式的,每个核心独立运行调度器逻辑。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值