什么是Misfit task,满足如下几个条件的task就是Misfit task,是做负载均衡的一个条件
- 当前cpu的capacity不是系统最大的cpu capacity
- 当前task的util(修正后的)不超过当前cpu的capacity的90%
调度器什么时候检测Misfit task?
- 当pick next task时候,检测是否有Misfit task
- 当更新task group的负载均衡状态时,检测这个group是否有Misfit task
如果一个group内有Misfit task,则立即强制把Misfit task负载均衡出去。
判断是否是Misfit task的source code如下:
有两条路径判断是否有Misfit task
- task_tick_fair 时钟中断触发
- pick_next_task_fair 挑选下一个task做负载均衡还是进入到rq触发
实现原理如下:
rq->misfit_task = !task_fits_max(p, rq->cpu);
static inline bool task_fits_max(struct task_struct *p, int cpu)
{
unsigned long capacity_orig = capacity_orig_of(cpu);
unsigned long max_capacity = cpu_rq(cpu)->rd->max_cpu_capacity.val;
if (capacity_orig == max_capacity)
return true;
return __task_fits(p, cpu, 0);
}
static inline bool __task_fits(struct task_struct *p, int cpu, int util)
{
unsigned long capacity = capacity_of(cpu);
util += boosted_task_util(p);
return (capacity * 1024) > (util * capacity_margin);
}
比较简单!