负载均衡之均衡

何时均衡

在linux内核中,有一些场景会触发任务均衡的分布在系统的各个cpu上,可以分为以下几个场景:

  • 任务放置:task placement,fork创建的任务、sched_exec的任务或者阻塞被唤醒的任务,这些任务加入就绪队列时,可以确定放置任务到那个cpu上。
  • 主动均衡:active upmigration,一个低算力的cpu无法运行某个重载任务时(misfit task),可以主动将misfit task向上迁移到算力更高的cpu上。
  • 周期均衡:tick load balance,周期性的触发均衡。
  • new idle均衡:new idle load balance,调度器在选择下一个任务时,发现cfs 就绪队列中没有可运行任务,只能指向idle任务,进入idle状态会触发负载均衡。
  • nohz idle均衡:某个cpu任务太重,而其他cpu都进入idle,这时候任务重cpu会唤醒idle的cpu进行均衡负载。

laod balance

(1)找出最繁忙的调度组
(2)在最繁忙调度组范围CPU找出最繁忙的CPU
(3)从最繁忙的CPU就绪队列中出队任务
(4)将出队的任务挂到当前的cpu上。

负载均衡总结

图来自窝蜗科技

PELT的缺陷:
(1)算法迟钝,负载的变化需要一定的时间,在一些嵌入式场景如手机,在浏览网页等情况下,需要迅速识别重活来提高CPU频率或者迁移任务,保证手机流程型。
(2)对于睡眠或阻塞的进程,PELT还会继续计算其衰减负载,这些继续贡献的负载对于下一次唤醒没有实际用处,会推迟降低cpu频率的速度,导致功耗升高。

参考文献

1.蜗窝科技:http://www.wowotech.net/
2.奔跑吧linux内核卷1基础架构