目录

  • 前言
  • 一、设计原理
  • 二、数据结构

前言

组调度(task_group)是使用Linux cgroup(control group)的cpu子系统来实现的,可以将进程进行分组,按组来分配CPU资源等。比如,看一个实际的例子:A和B两个用户使用同一台机器,A用户16个进程,B用户2个进程,如果按照进程的个数来分配CPU资源,显然A用户会占据大量的CPU时间,这对于B用户是不公平的。组调度就可以解决这个问题,分别将A、B用户进程划分成组,并将两组的权重设置成占比50%即可。

带宽(bandwidth)控制是用于控制用户组(task_group)的CPU带宽,通过设置每个用户组的限额值,可以调整CPU的调度分配。在给定周期内,当用户组消耗CPU的时间超过了限额值,该用户组内的任务将会受到限制,直到下一个周期。


提示:以下是本篇文章正文内容,下面案例可供参考

一、设计原理

先看一下/sys/fs/cgroup/cpu下的内容吧:

(1) 有两个关键的字段:cfs_period_us和cfs_quota_us,这两个与cfs_bandwidth息息相关;
(2) period表示周期,quota表示限额,也就是在period期间内,用户组的CPU限额为quota值,当超过这个值的时候,用户组将会被限制运行(throttle),等到下一个周期开始被解除限制(unthrottle);

如果使用CPU bandwith control,需要配置CONFIG_FAIR_GROUP_SCHED和CONFIG_CFS_BANDWIDTH选项。该功能是限制一个组的最大使用CPU带宽。通过设置两个变量quota和period,period是指一段周期时间,quota是指在period周期时间内,一个组可以使用的CPU时间限额。当一个组的进程运行时间超过quota后,就会被限制运行,这个动作被称作throttle。直到下一个period周期开始,这个组会被重新调度,这个过程称作unthrottle。

总结一下就是,cfs_bandwidth就像是一个全局时间池(时间池管理时间,类比内存池管理内存)。每个group cfs_rq如果想让其管理的红黑树上的调度实体调度,必须首先向全局时间池中申请固定的时间片,然后供其进程消耗。当时间片消耗完,继续从全局时间池中申请时间片。终有一刻,时间池中已经没有时间可供申请。此时就是throttle cfs_rq的大好时机。

二、数据结构

每个task_group都包含cfs_bandwidth结构体,主要记录和管理时间池的时间信息。

struct cfs_bandwidth {#ifdef CONFIG_CFS_BANDWIDTHraw_spinlock_t lock;ktime_t period;         //周期值;u64 quota, runtime;     //quota: 限额值;runtime: 记录限额剩余时间,在每次定时器回调函数中更新值为quota;s64 hierarchical_quota; //层级管理任务组的限额比率;u64 runtime_expires;    //每个周期的到期时间;int idle, period_active; //idle:空闲状态,不需要运行时分配;period_active: 周期性计时已经启动;struct hrtimer period_timer, slack_timer; //period_timer: 高精度周期性定时器,用于重新填充运行时间消耗;//slack_timer: 延迟定时器,在任务出列时,将剩余的运行时间返回到全局池里;struct list_head throttled_cfs_rq; //所有被throttle的cfs_rq挂入此链表,在定时器的回调函数中便利链表执行unthrottle cfs_rq操作;/* statistics */int nr_periods, nr_throttled; //统计值;u64 throttled_time; //统计值;#endif
};

struct cfs_rq结构中相关字段如下:

struct cfs_rq {
#ifdef CONFIG_FAIR_GROUP_SCHEDstruct rq *rq;                  /* cfs_rq依附的cpu runqueue,每个CPU有且仅有一个rq运行队列。 */struct task_group *tg;        /* cfs_rq所属的task_group。 */
#ifdef CONFIG_CFS_BANDWIDTHint runtime_enabled;          /* 该就绪队列是否已经开启带宽限制,默认带宽限制是关闭的,如果带宽限制使能,runtime_enabled的值为1。 */u64 runtime_expires;            /* 周期计时器到期时间 */s64 runtime_remaining;        /* cfs_rq从全局时间池申请的时间片剩余时间,当剩余时间小于等于0的时候,就需要重新申请时间片。 */u64 throttled_clock, throttled_clock_task;     /* 当cfs_rq被throttle的时候,方便统计被throttle的时间,需要记录throttle开始的时间。 */u64 throttled_clock_task_time;int throttled, throttle_count;                 /* throttled:如果cfs_rq被throttle后,throttled变量置1,unthrottle的时候,throttled变量置0;throttle_count:由于task_group支持嵌套,当parent task_group的cfs_rq被throttle的时候,其chaild task_group对应的cfs_rq的throttle_count成员计数增加。 */struct list_head throttled_list;               /* 被throttle的cfs_rq挂入cfs_bandwidth->throttled_cfs_rq链表。 */
#endif /* CONFIG_CFS_BANDWIDTH */
#endif /* CONFIG_FAIR_GROUP_SCHED */
};

CFS调度下带宽控制(Bandwidth Control)相关推荐

  1. (4)Linux进程调度-组调度及带宽控制

    目录 背景 1. 概述 2. task_group 2.2 task_group权重 3. cfs_bandwidth 3.1 数据结构 3.2 流程分析 3.2.1 初始化流程 3.2.2 用户设置 ...

  2. Linux进程调度 - 组调度及带宽控制 LoyenWang

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...

  3. Linux CFS调度

    本文代码均基于主线4.19 LTS ,欢迎指正,持续更新. 目录 1. 度量 1.1 优先级 1.2 Weight 1.3 virtual runtime 1.4 physical runtime 1 ...

  4. (5)Linux进程调度-CFS调度器

    目录 背景 1. 概述 2. 数据结构 2.1 调度类 2.2 rq/cfs_rq/task_struct/task_group/sched_entity 3. 流程分析 3.1 runtime与vr ...

  5. Linux进程调度 - CFS调度器 LoyenWang

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...

  6. Linux进程调度-CFS调度器原理分析及实现,懂了

    1. 概述 (1) Completely Fair Scheduler,完全公平调度器,用于Linux系统中普通进程的调度. (2) CFS采用了红黑树算法来管理所有的调度实体 sched_entit ...

  7. [Linux][内核学习笔记]--CFS调度器

    文章目录 1. 进程的状态转换 2. 内核调度器的发展 3. 调度策略 4. 与调度相关的系统调用 5. 优先级 6. CFS调度器的实现 6.1 相关结构体 6.1.1 sched_entity 结 ...

  8. cpu调度的最小单位_Linux CFS调度器

    一直没有写过关于Linux内核调度器的内容,这几天被问起,简单的讲了讲,收到一堆challenge,这次决定做一个通篇总结方便自己整理思路. 要说Linux2.4和2.6最大的差异就在于CFS调度器的 ...

  9. CFS调度时间片计算

    参考:Linux-5.10内核代码 调度周期 三个参数 CFS中理论上的调度周期计算,主要由三个参数控制: /** Targeted preemption latency for CPU-bound ...

  10. 风暴控制(storm control)

    风暴控制(storm control) 风暴控制特性会不断地监控端口的入站流量,最高的频率为每秒进行一次监控,然后再把所获得的数据与配置在设备上的风暴抑制级别进行对比. 理解风暴控制 风暴控制防止交换 ...

最新文章

  1. java调用存储过程 oracle_java调用oracle存储过程
  2. 登陆工行网上银行报60058017错误及输入正确网银密码提示密码不正确
  3. Gauss高斯消元——模板
  4. shell字段拼接日期_shell 脚本字符串拼接
  5. 计算机视觉——openCV的简介
  6. vm虚拟机安装包_一次Miniconda虚拟机安装的神奇踩坑记录
  7. BugkuCTF-MISC题神奇宝贝
  8. L2-029 特立独行的幸福 (25 分)-PAT 团体程序设计天梯赛 GPLT
  9. 阙值,阈值,阀值,傻傻分不清
  10. 计算机音乐蜡笔小新,蜡笔小新背景音乐-原创
  11. dva 路由/导航/
  12. ASP.Net+XML打造留言薄
  13. 软件测试面试题避雷(HR面试题)最常见的面试问题和技巧性答复
  14. 学习Java第十九天(一):1、Java中的网络编程
  15. latex-多个表格引用
  16. 解决开机提示High Severity Error问题
  17. python100day day22 -Requests
  18. nyoj663弟弟的作业
  19. 极客时间-左耳听风-程序员攻略-机器学习和人工智能
  20. ibm+x3650+m4+linux+raid驱动,IBM X3650M4阵列卡驱动

热门文章

  1. 实战|教你爬取全国火锅店数量,并利用地图可视化展示
  2. WeChatTweak-微信小助手 v1.2.2 详细安装教程
  3. Spring AOP Introductions
  4. 网站实现扫描二维码关注微信公众号,实现自动登陆
  5. npm install没有node_文件,并且package.json文件缺失
  6. hdoj 1163 Eddy's digital Roots(数学问题,继续分析) .
  7. NEO智能合约开发(二)再续不可能的任务
  8. 2022-07-02 Android 进入app 后 距离传感器控制手机屏幕熄灭的方法-接近传感器Proximity Sensor的信号
  9. 如何用一台普通相机拍照红蓝立体3D图片
  10. 单片机c51语言中 两个位变量类型是什么,51单片机中的数据类型解析