本文共 1022 字,大约阅读时间需要 3 分钟。
include/linux/sched.h有定义
struct sched_avg {
load_avg 包含进程睡眠所花的时间
runnalbe_load_avg只包含任务在rq上面所花费的时间代码区别查看分析确认:
util_sum仅考虑running时间 load_sum 包含running+runnablecontribut=delda_time * scale_freq;
sa->load_sum += load * contrib;task_struct -> sched_entity -> sched_avg
cfs_rq-> sched_entity(curr, last, next)-> -> sched_avg和cgoup的关系
说明:包含睡眠进程的时间
__update_load_avg_se -》 ___update_load_sum (kernel/sched/pelt.c)1) 唤醒时计算睡眠任务时间
enqueue_entity_fair -> enqueue_entity-> update_load_avg-> __update_load_avg_se -> __update_load_avg_se -> update_cfs_rq_load_avg — 更新rq上面的负载 如下: runnalbe 参数和 running 参数都被设置成0, 因为 on_rq为0最终会调用accumulate_sum对负载进行计算:
如下有两个runnable和running参数决定如何对running任务以及runnable任务进行计算 入队时, runnable和running都被设置成0,所以不会更新这个两部分负载。注意load_sum会被无条件追加, 从这里可以看出load_sum是会被加上睡眠时间的。注意:load_sum完全是统计时间没有包含load. load_avg 是和weight相乘之后得到的值。
如下为rq上面负载更新流程,可以看出load_sum* weight 了。
内核工匠 pelt算法浅析
https://www.cnblogs.com/Linux-tech/p/13873884.html