如果配置了SMP,则会调用负载均衡。Linux使用完全公平调度器(CFS)对每个任务进行调度,以便每个任务都能获得“公平”的处理器时间份额。CFS使用红黑树的概念。
![enter image description here](https://istack.dev59.com/ZlNeJ.webp)
调度程序在任务进入运行队列时记录当前时间。当进程等待处理器时间时,其“wait”值会增加一个由当前运行队列中的任务总数和进程优先级导出的数量。当处理器运行此任务时,此“wait”值会减少。如果此值降至某个值以下,则调度程序将抢占该任务,并使其他任务更接近处理器以执行。CFS始终尝试通过保持“wait”值为零来保持理想状态。
Linux中有两个函数
load_balance
和
select_task_rq_fair()
用于执行负载平衡任务。
简单来说,CFS负载平衡机制将繁忙的CPU转移到不那么繁忙或理想的CPU上。
task_h_load
用于计算任务的权重。
引用:
我不明白的是,在task_h_load函数中如何计算负载,以及如何计算负载?
此权重因子取决于进程的nice值。
weighting factor = weight of process with nice value 0 / weight of current task;
其中 'weight' 大致等于 1024 * (1.25)^(-nice)
例如:
当 nice 值为 1 时,weight 为 820
当 nice 值为 -1 时,weight 为 1277
task_h_load
有关更多负载均衡方法和基础知识,请参阅 kernel comment
task_h_load
使用 update_cfs_rq_h_load
计算公平时间调度的运行队列的分层负载,并使用 cfs_rq_load_avg 返回运行队列的平均负载 load_avg。
虚拟运行时间是任务在CPU上运行的加权时间。CFS始终尝试保持
this红黑树平衡。
![enter image description here](https://istack.dev59.com/FPUao.webp)
<--较小的值 ----------- vruntime 值--------较大的值-->
每个可运行任务都根据 vruntime
放置在自平衡红黑树中。如果任务准备好运行(表示任务没有等待任何资源),则将其放置到树中。如果任务正在等待某些资源(即等待 I/O ),则将其移除。处理时间较短的任务(即较小的 vruntime
)位于树的左侧,处理时间更长的任务位于树的右侧。
左节点具有最小的键值(对于 CFS 来说,它是优先级较高的任务)。自平衡红黑树需要 O(lgN) 操作才能导航到左节点。调度程序将此值缓存到 rb_leftmost
中。通过仅检索此值,调度程序确定下一个要运行的任务
这种负载平衡仅用于非实时任务 对于实时任务,使用了由 Steven Rostedt 和 Gregory Haskins 开发的推拉操作。
关于CFS还有一点在公平组调度中也非常有帮助。请参考下图。
![enter image description here](https://istack.dev59.com/UBMYm.webp)
move_task
的作用是尝试将不平衡的加权负载(即在上述计算负载因子后)从繁忙的队列移动到this_rq
中。它试图平衡两个运行队列的负载,以便两者都可以获得“公平”的处理器时间。
detach_task
将任务从Linux内核的env
指针指定的迁移中分离出来。
detach_one_task
尝试从env->src_rq中精确地出队一个任务。
detach_tasks()
尝试从busiest_rq
中分离多达不平衡加权负载的任务。如果无法分离,则返回已分离任务的数量,否则返回零。
要将此已分离任务附加到新的rq
(运行队列),根据情况使用attach_task、attach_one_task、attach_tasks
。
New warning check
lockdep_assert_held()
is introduced in
detach_tasks
which was not present in
move_tasks
在多处理器上移动任务并不容易,因此cfs会针对特定域进行负载平衡,如下所示:
![enter image description here](https://istack.dev59.com/NoCBr.webp)
为了理解所有这些内容,我希望您可以查阅以下参考资料。
Per-Entity-Load-Tracking指标用于负载均衡
权重因子
OpenSUSE
Robert Love第三章
CPU调度
我特别阅读了所有这些文档,以回答您的问题。如果有遗漏之处,请不吝赐教。