c - Linux内核-task_h_load

标签 c linux linux-kernel load-balancing

我正在尝试了解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的负载将很简单:

task_h_load = task_load_in_its_tree * ( load_of_immediate_tree / load_of_containing_tree);

(while immediate_tree refers to the tree that contains the task, and containing_tree refers to the tree that contains the tree that contains the task.)



但这种情况并非如此。我们的树可能是调度实体中的嵌套树,调度实体本身只是另一棵树中的叶子。

因此,我们要做的第一件事是调用update_cfs_rq_h_load(cfs_rq),它计算cfs_rq及其所有上升点(祖先)的分层负载因子:此函数一直将树的层次结构向上扩展到根,然后从根向下扩展到我们的cfs_rq计算层次结构中每棵树的层次负载因子。

计算以类似的方式进行:

cfs_rq_h_load = cfs_rq_load_in_its_tree * (load_of_immediate_tree / load_of_containing_tree)



因此,最后我们得到了cfs_rq的分数负载,而我们要做的就是使用相同的公式计算h_load。

task_h_load = task_load_in_its_tree * (load_of_immediate_tree / load_of_containing_tree)

关于c - Linux内核-task_h_load,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34442691/

相关文章:

linux - 为什么 iptables 在与 --src-range 一起使用时给出错误

hardware - USB和PCI之间的关系

c - 分配动态二维字符数组

c - 对 x 进行算术左移 n 位 (C)

c - 结构体和结构体指针之间的区别

c - 使用递归反转单词

linux - awk 只能打印整行;无法访问特定字段

linux - 如何找到隐藏文件

linux - 在这种情况下如何从 Linux 内核模块导出符号?

c - Linux (2.6.30) 中的 getrusage 是否损坏