2.7.2 负载追踪 - 数据结构

与负载相关的字段封装在数据结构 sched_avg 中:

/* file: include/linux/sched.h */
struct sched_avg {
    /* 上一次更新 load 的时间点,用来计算时间间隔 */
    u64 last_update_time;
    /* 基于可运行时间(runnable)的负载总和。
     * runnable状态指任务处于可运行状态的时间,其中包括在rq里等待的时间,以及在CPU上执行的时间
     */
    u64 load_sum;
    /* 在rq里等待的时间计算出来的负载总和 */
    u64 runnable_sum;
    /* 在cpu上执行的时间计算出来的负载总和 */
    u32 util_sum;
    /* 表示最近一次更新负载时,最近一个周期内的那部分时间,
     * 即accumulate_sum()函数上注释中标记为d3的时间
     */
    u32 period_contrib;
    /* 以下字段是平均值,同样基于上述的几个维度分别计算 */
    unsigned long load_avg;
    unsigned long runnable_avg;
    unsigned long util_avg;
    struct util_est util_est;
} ____cacheline_aligned;

当内核开启 CONFIG_SMP=y 时,cfsrq 与 schedentity 中都会包含跟踪负载的字段:

/* file: include/linux/sched.h */
struct sched_entity {
#ifdef CONFIG_SMP
    struct sched_avg avg;
#endif
};

/* file: kernel/sched/sched.h */
struct cfs_rq {
#ifdef CONFIG_SMP
    /* CFS load tracking */
    struct sched_avg avg;

    struct {
        raw_spinlock_t lock ____cacheline_aligned;
        int nr;
        unsigned long load_avg;
        unsigned long util_avg;
        unsigned long runnable_avg;
    } removed;

#endif /* CONFIG_SMP */
};

Last updated