我正在尝试了解load_balance
函数期间发生的情况。
我正在检查3.14版,但我也查看了4.3版,因为有人告诉我机制已更改,并且在此版本中更加清楚。
在 v3.14 中, call 来自 move_tasks
在 v4.3 中, call 来自 detach_tasks
从我所看到的是相同的功能,只是名称不同。
此功能根据env->balance
参数将任务从一个队列移到另一个队列。
我不明白的是 task_h_load
中的负载计算方式/方式。
有谁知道加载成员代表什么以及如何在 task_h_load
函数中计算它?
最佳答案
CFS包含“计划实体”树。每个调度实体可以有自己的树,以递归的方式依此类推...
(例如,这对于将特定用户的所有进程分组到一个调度实体中很有用;因此,与具有较少进程的用户相比,可以防止具有许多任务的用户消耗更多的cpu时间)
task_h_load-代表“任务分层加载”
由于任务可以嵌套在几棵树中,因此计算任务的负载并不是那么简单...
static unsigned long task_h_load(struct task_struct *p){
struct cfs_rq *cfs_rq = task_cfbs_rq(p);
update_cfs_rq_h_load(cfs_rq);
return div64_ul(p->se.avg.load_avg * cfs_rq->h_load,
cfs_rq_load_avg(cfs_rq) + 1);
}
在开头,
cfs_rq
指向在其中找到p的直接树。如果我们只有两个嵌套树,则计算p的负载将很简单:但这种情况并非如此。我们的树可能是调度实体中的嵌套树,调度实体本身只是另一棵树中的叶子。
因此,我们要做的第一件事是调用
update_cfs_rq_h_load(cfs_rq)
,它计算cfs_rq
及其所有上升点(祖先)的分层负载因子:此函数一直将树的层次结构向上扩展到根,然后从根向下扩展到我们的cfs_rq
计算层次结构中每棵树的层次负载因子。计算以类似的方式进行:
因此,最后我们得到了
cfs_rq
的分数负载,而我们要做的就是使用相同的公式计算h_load。关于c - Linux内核-task_h_load,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34442691/