负载定义
load_avg/util_avg
include/linux/sched.h有定义
struct sched_avg {
load_avg 包含进程睡眠所花的时间
runnalbe_load_avg只包含任务在rq上面所花费的时间
代码区别查看分析确认:
util_sum仅考虑running时间
load_sum 包含running+runnable
contribut=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的关系
负载更新流程梳理
load_sum load_avg流程
说明:包含睡眠进程的时间
__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 了。
从running 编程runnable
参考资料
内核工匠 pelt算法浅析
https://www.cnblogs.com/Linux-tech/p/13873884.html