2.6.4.1 带宽控制 - 数据结构

如果需要开启CFS的带宽控制功能,编译内核时需要设置 CONFIG_CFS_BANDWIDTH=y, 用于CFS带宽控制的数据结构为:

/* file: kernel/sched/sched.h */
struct cfs_bandwidth {
#ifdef CONFIG_CFS_BANDWIDTH
    raw_spinlock_t lock;
    /* 一个周期的时长 */
    ktime_t period;
    /* 一个周期内的时间限额 */
    u64 quota;
    /* 本周期内剩下的可用时间 */
    u64 runtime;
    s64 hierarchical_quota;

    u8 idle;
    u8 period_active;
    u8 slack_started;
    /* 高精度定时器,每个period内定时更新runtime */
    struct hrtimer period_timer;
    /* 回收时间的定时器 */
    struct hrtimer slack_timer;
    /* 所有throttled的cfs_rq挂到该链表上,在定时器的回调函数中遍历该链表执行unthrottle操作
     */
    struct list_head throttled_cfs_rq;

    /* Statistics: */
    int nr_periods;
    int nr_throttled;
    u64 throttled_time;
#endif
};

与带宽控制相关的所有信息都封装在该结构中,系统主要通过两个量来对带宽进行控制:

  • period: 代表一个周期,带宽控制以周期为单位展开

  • quota: 一个周期内的时间限额

带宽控制是以任务组为单位进行的,因此我们可以在任务组的结构体中看到如下字段:

实际的带宽控制将会下沉到任务组的各个cfsrq中去落实,因此cfsrq也包含了与带宽控制相关的字段:

这里主要的字段是 runtime_enabledruntime_remaining, 调度器主要通过这两个字段来控制cfsrq的带宽,我们在下一节将详细讨论实现细节。

Last updated

Was this helpful?