教你解决Linux进程调度-组调度及带宽控制

说明:

  1. Kernel版本:4.14
  2. ARM64处理器,Contex-A53,双核
  3. 使用工具:Source Insight 3.5, Visio

1. 概述

组调度(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的时间超过了限额值,该用户组内的任务将会受到限制。

由于组调度和带宽控制紧密联系,因此本文将探讨这两个主题,本文的讨论都基于CFS调度器,开始吧。

2. task_group

关于组调度的相关数据结构,组织如下:


对应到实际的运行中,如下:



更多linux内核视频教程文档资料免费领取后台私信【内核】自行获取.


2.2 task_group权重

调用流程如下图:


看一下实际的效果图吧:


3. cfs_bandwidth

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


来一张图直观理解一下:


3.1 数据结构

内核中使用struct cfs_bandwidth来描述带宽,该结构包含在struct task_group中。此外,struct cfs_rq中也有与带宽控制相关的字段。还是来看一下代码吧:

struct cfs_bandwidth {
#ifdef CONFIG_CFS_BANDWIDTH
  raw_spinlock_t lock;
  ktime_t period;
  u64 quota, runtime;
  s64 hierarchical_quota;
  u64 runtime_expires;


  int idle, period_active;
  struct hrtimer period_timer, slack_timer;
  struct list_head throttled_cfs_rq;


  /* statistics */
  int nr_periods, nr_throttled;
  u64 throttled_time;
#endif
};

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

struct cfs_rq {
...
#ifdef CONFIG_CFS_BANDWIDTH
	int runtime_enabled;
	u64 runtime_expires;
	s64 runtime_remaining;


	u64 throttled_clock, throttled_clock_task;
	u64 throttled_clock_task_time;
	int throttled, throttle_count;
	struct list_head throttled_list;
#endif /* CONFIG_CFS_BANDWIDTH */
...
}

3.2 流程分析

3.2.1 初始化流程

先看一下初始化的操作,初始化函数init_cfs_bandwidth本身比较简单,完成的工作就是将struct cfs_bandwidth结构体进程初始化。


do_sched_cfs_period_timer函数与do_sched_cfs_slack_timer()函数都调用了distrbute_cfs_runtime(),该函数用于分发tg->cfs_b的全局运行时间runtime,用于在该task_group中平衡各个CPU上的cfs_rq的运行时间runtime,来一张示意图:


3.2.2 用户设置流程

用户可以通过操作/sys中的节点来进行设置:


3.2.3throttle限流操作

cfs_rq运行队列被限制,是在throttle_cfs_rq函数中实现的,其中调用关系如下图:


3.2.4 总结

总体来说,带宽控制的原理就是通过task_group中的cfs_bandwidth来管理一个全局的时间池,分配给属于这个任务组的运行队列,当超过限额的时候则限制队列的调度。同时,cfs_bandwidth维护两个定时器,一个用于周期性的填充限额并进行时间分发处理,一个用于将未用完的时间再返回到时间池中,大抵如此。


首页 - 内核技术中文网 - 构建全国最权威的内核技术交流分享论坛

转载地址:教你解决Linux进程调度-组调度及带宽控制 - 圈点 - 内核技术中文网 - 构建全国最权威的内核技术交流分享论坛

展开阅读全文

页面更新:2024-04-25

标签:进程   遍历   定时器   队列   限额   节点   内核   函数   周期   带宽   时间

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top