3.负载均衡简述

kernel/sched.c 
struct rq { 
... 
#ifdef CONFIG_SMP 
  struct sched_domain *sd; 
/* 用于主动均衡 */ 
  int active_balance; 
  int push_cpu;   //表示需要迁移进程的目的CPU
/*该就绪队列的CPU: */ 
  int cpu; 
  struct task_struct *migration_thread; 迁移线程,可被唤醒
  struct list_head migration_queue; 迁移进程请求,表示需要迁移到其它CPU
#endif 
... 
}
核为每个就绪队列提供了一个迁移线程,可以接收迁移请求,这些请求保存在链表migration_queue中。这样的请求通常发源于调度器自身,但如果进程被限制在某一特定的CPU集合上,而不能在当前执行的CPU上继续运行时,也可能出现这样的请求。内核试图周期性地均衡就绪队列,但如果对某个就绪队列效果不佳,则必须使用主动均衡(active balancing)。如果需要主动均衡,则将active_balance设置为非零值,而cpu则记录了从哪个处理器发起的主动均衡请求。

 

迁移线程用于两个目的。一个是用于完成发自调度器的迁移请求,另外一个是用于实现主动均衡。

 

migration_thread内部是一个无限循环,在无事可做时进入睡眠状态。首先,该函数检测是否需要主动均衡。如果需要,则调用active_load_balance满足该请求。该函数试图从当前就绪队列移出一个进程,且移至发起主动均衡请求CPU的就绪队列。它使用move_one_task完成该工作,后者又对所有的调度器类,分别调用特定于调度器类的move_one_task函数,直至其中一个成功。

 

完成主动负载均衡之后,迁移线程会检测migrate_req链表中是否有来自调度器的待决迁移请求。如果没有,则线程发出重调度请求。否则,用__migrate_task完成相关请求,该函数会直接移出所要求的进程,而不再与调度器类进一步交互。
posted @ 2022-04-27 23:59  while(true);;  阅读(40)  评论(0编辑  收藏  举报