// 参考:http://blog.youkuaiyun.com/dog250/article/details/5303561
// 负载均衡
// 当rq->next_balance到时,触发负载均衡
// 调用路径:scheduler_tick->trigger_load_balance
// 注:
// nohz.cpu_mask中的cpu表示停用了周期时钟
// 函数任务:
// 1.如果进入tick的时候rq变得有事可做,并且之前由本cpu执行idle load balance
// 1.1 不再做idle load balance
// 1.2 nohz.cpu_mask中选择一个cpu负责idle load balance
// 1.3 通过ipi通知彼cpu负责ilb
// 2.如果所有cpu均处于idle状态,之前由本cpu做idle load balance
// 2.1 没有必要再做idb,通知本cpu停止idle load balance
// 3.如果本cpu处于idle状态,其他cpu做idle load balance
// 3.1 ilb的cpu会代此cpu执行load balance,不需要raise SCHED_SOFTIRQ
// 4.本cpu没有加入到任何domain,则不需要在domain间load balance
// 5.如果到达执行load balance时间点
// 5.1 raise SCHED_SOFTIRQ
1.1 static inline void trigger_load_balance(struct rq *rq, int cpu)
{
#ifdef CONFIG_NO_HZ
// rq->idle_at_tick = 0表示rq上运行的非idle进程
// rq->in_nohz_recently表示最近关闭了周期时钟
if (rq->in_nohz_recently && !rq->idle_at_tick) {
rq->in_nohz_recently = 0;
//如果之前由本cpu执行idle load balance
if (atomic_read(&nohz.load_balancer) == cpu) {
//nohz.cpu_mask中的cpu表示停用了周期时钟,在select_nohz_load_balancer中被加入
cpumask_clear_cpu(cpu, nohz.cpu_mask);
//进入tick的时候rq变得有事可做,则不再做idle load balance
atomic_set(&nohz.load_balancer,
调度子系统4_负载均衡(一)
最新推荐文章于 2024-11-25 18:37:12 发布