// 参考:http://blog.csdn.net/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-01-20 20:31:26 发布
本文详细解析了Linux内核中的负载均衡机制,包括`trigger_load_balance`函数的作用,如何处理不同CPU状态下的负载均衡任务,以及`run_rebalance_domains`和`rebalance_domains`函数在负载均衡过程中的角色。内容涉及`no_hz`特性,如何选择新的idle load balancer CPU以及在多核系统中如何进行域内和域间的负载均衡决策。
摘要由CSDN通过智能技术生成