深入解析Linux进程调度器-CPU负载_多task怎么计算cpuload-程序员宅基地

技术标签: CPU负载  Linux内核  运维  linux  服务器  

说明:

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

1. 概述

CPU负载(cpu load)指的是某个时间点进程对系统产生的压力。来张图来类比下(参考Understanding Linux CPU Load)

  • CPU的运行能力,就如大桥的通行能力,分别有满负荷,非满负荷,超负荷等状态,这几种状态对应不同的cpu load值;
  • 单CPU满负荷运行时cpu_load为1,当多个CPU或多核时,相当于大桥有多个车道,满负荷运行时cpu_load值为CPU数或多核数;
  • CPU负载的计算(以单CPU为例),假设一分钟内执行10个任务代表满负荷,当一分钟给出30个任务时,CPU只能处理10个,剩余20个不能处理,cpu_load=3;

在实际系统中查看:

  • cat /proc/cpuinfo:查看CPU信息;
  • cat /proc/loadavg:查看cpu最近1/5/15分钟的平均负载:

计算CPU负载,可以让调度器更好的进行负载均衡处理,以便提高系统的运行效率。此外,内核中的其他子系统也可以参考这些CPU负载值来进行相应的调整,比如DVFS等。

目前内核中,有以下几种方式来跟踪CPU负载:

  1. 全局CPU平均负载;
  2. 运行队列CPU负载;
  3. PELT(per entity load tracking);

这也是本文需要探讨的内容,开始吧。

2. 全局CPU平均负载

2.1 基础概念

先来明确两个与CPU负载计算相关的概念:

  1. active task(活动任务):只有知道活动任务数量,才能计算CPU负载,而活动任务包括了TASK_RUNNING和TASK_UNINTERRUPTIBLE两类任务。包含TASK_UNINTERRUPTIBLE任务的原因是,这类任务经常是在等待I/O请求,将其包含在内也合理;
  2. NO_HZ:我们都知道Linux内核每隔固定时间发出timer interrupt,而HZ是用来定义1秒中的timer interrupts次数,HZ的倒数是tick,是系统的节拍器,每个tick会处理包括调度器、时间管理、定时器等事务。周期性的时钟中断带来的问题是,不管CPU空闲或繁忙都会触发,会带来额外的系统损耗,因此引入了NO_HZ模式,可以在CPU空闲时将周期性时钟关掉。在NO_HZ期间,活动任务数量的改变也需要考虑,而它的计算不如周期性时钟模式下直观。

2.2 流程

Linux内核中定义了三个全局变量值avenrun[3],用于存放最近1/5/15分钟的平均CPU负载。

看一下计算流程:

  • 计算活动任务数,这个包括两部分:1)周期性调度中新增加的活动任务;2)在NO_HZ期间增加的活动任务数;
  • 根据活动任务数值,再结合全局变量值avenrun[]中的old value,来计算新的CPU负载值,并最终替换掉avenrun[]中的值;
  • 系统默认每隔5秒钟会计算一次负载,如果由于NO_HZ空闲而错过了下一个CPU负载的计算周期,则需要再次进行更新。比如NO_HZ空闲20秒而无法更新CPU负载,前5秒负载已经更新,需要计算剩余的3个计算周期的负载来继续更新;

2.3 计算方法

Linux内核中,采用11位精度的定点化计算,CPU负载1.0由整数2048表示,宏定义如下:

#define FSHIFT          11		             /* nr of bits of precision */
#define FIXED_1         (1<<FSHIFT)	    /* 1.0 as fixed-point */
#define LOAD_FREQ   (5*HZ+1)	    /* 5 sec intervals */
#define EXP_1           1884		        /* 1/exp(5sec/1min) as fixed-point */
#define EXP_5           2014		        /* 1/exp(5sec/5min) */
#define EXP_15         2037		      /* 1/exp(5sec/15min) */

计算公式如下:

  • load值为旧的CPU负载值avenrun[],整个计算完成后得到新的负载值,再更新avenrun[];
  • EXP_1/EXP_5/EXP_15,分别代表最近1/5/15分钟的定点化值的指数因子;
  • active值,根据读取calc_load_tasks的值来判断,大于0则乘以FIXED_1(2048)传入;
  • 根据active和load值的大小关系来决定是否需要加1,类似于四舍五入的机制;

关键代码如下:

active = atomic_long_read(&calc_load_tasks);
	active = active > 0 ? active * FIXED_1 : 0;


	avenrun[0] = calc_load(avenrun[0], EXP_1, active);
	avenrun[1] = calc_load(avenrun[1], EXP_5, active);
	avenrun[2] = calc_load(avenrun[2], EXP_15, active);
  • NO_HZ模式下活动任务数量更改的计算 由于NO_HZ空闲效应而更改的CPU活动任务数量,存放在全局变量calc_load_nohz[2]中,并且每5秒计算周期交替更换一次存储位置(calc_load_read_idx/calc_load_write_idx),其他程序可以去读取最近5秒内的活动任务变化的增量值。
计算示例 假设在某个CPU上,开始计算时load=0.5,根据calc_load_tasks值获取不同的active,中间进入NO_HZ模式空闲了20秒,整个计算的值如下图:

3. 运行队列CPU负载

  • Linux系统会计算每个tick的平均CPU负载,并将其存储在运行队列中rq->cpu_load[5],用于负载均衡;

下图显示了计算运行队列的CPU负载的处理流程:

最终通过cpu_load_update来计算,逻辑如下:

  • 其中传入的this_load值,为运行队列现有的平均负载值。

上图中的衰减因子,是在NO_HZ模式下去进行计算的。在没有使用tick时,从预先计算的表中计算负载值。Linux内核中定义了两个全局变量:

#define DEGRADE_SHIFT		7


static const u8 degrade_zero_ticks[CPU_LOAD_IDX_MAX] = {0, 8, 32, 64, 128};
static const u8 degrade_factor[CPU_LOAD_IDX_MAX][DEGRADE_SHIFT + 1] = {
	{   0,   0,  0,  0,  0,  0, 0, 0 },
	{  64,  32,  8,  0,  0,  0, 0, 0 },
	{  96,  72, 40, 12,  1,  0, 0, 0 },
	{ 112,  98, 75, 43, 15,  1, 0, 0 },
	{ 120, 112, 98, 76, 45, 16, 2, 0 }
};

衰减因子的计算主要是在delay_load_missed()函数中完成,该函数会返回load * 衰减因子的值,作为上图中的old_load。计算方式如下:

4. PELT

PELT, Per-entity load tracking。在Linux引入PELT之前,CFS调度器在计算CPU负载时,通过跟踪每个运行队列上的负载来计算;在引入PELT之后,通过跟踪每个调度实体的负载贡献来计算。(其中,调度实体:指task或task_group)

4.1 PELT计算方法

总体的计算思路:将调度实体的可运行状态时间(正在运行+等待CPU调度运行),按1024us划分成不同的周期,计算每个周期内该调度实体对系统负载的贡献,最后完成累加。其中,每个计算周期,随着时间的推移,需要乘以衰减因子y进行一次衰减操作。

先来看一下每个调度实体的负载贡献计算公式:

  • 当前时间点的负载贡献 = 当前时间点负载 + 上个周期负载贡献 * 衰减因子;
  • 假设一个调度实体被调度运行,运行时间段可以分成三个段d1/d2/d3,这三个段是被1024us的计算周期分割而成,period_contrib是调度实体last_update_time时在计算周期间的贡献值,;
  • 总体的贡献值,也是根据d1/d2/d3来分段计算,最终相加即可;
  • y为衰减因子,每隔1024us就乘以y来衰减一次;

计算的调用流程如下图:

  • 函数主要是计算时间差,再分成d1/d2/d3来分段计算处理,最终更新相应的字段;
  • decay_load函数要计算val * y^n,内核提供了一张表来避免浮点运算,值存储在runnable_avg_yN_inv数组中;
static const u32 runnable_avg_yN_inv[] = {
	0xffffffff, 0xfa83b2da, 0xf5257d14, 0xefe4b99a, 0xeac0c6e6, 0xe5b906e6,
	0xe0ccdeeb, 0xdbfbb796, 0xd744fcc9, 0xd2a81d91, 0xce248c14, 0xc9b9bd85,
	0xc5672a10, 0xc12c4cc9, 0xbd08a39e, 0xb8fbaf46, 0xb504f333, 0xb123f581,
	0xad583ee9, 0xa9a15ab4, 0xa5fed6a9, 0xa2704302, 0x9ef5325f, 0x9b8d39b9,
	0x9837f050, 0x94f4efa8, 0x91c3d373, 0x8ea4398a, 0x8b95c1e3, 0x88980e80,
	0x85aac367, 0x82cd8698,
};

Linux中使用struct sched_avg来记录调度实体和CFS运行队列的负载信息,因此struct sched_entity和struct cfs_rq结构体中,都包含了struct sched_avg,字段介绍如下:

struct sched_avg {
	u64				last_update_time;       //上一次负载更新的时间,主要用于计算时间差;
	u64				load_sum;                   //可运行时间带来的负载贡献总和,包括等待调度时间和正在运行时间;
	u32				util_sum;                     //正在运行时间带来的负载贡献总和;
	u32				period_contrib;           //上一次负载更新时,对1024求余的值;
	unsigned long			load_avg;           //可运行时间的平均负载贡献;
	unsigned long			util_avg;           //正在运行时间的平均负载贡献;
};

4.2 PELT计算调用

PELT计算的发生时机如下图所示:

  • 调度实体的相关操作,包括入列出列操作,都会进行负载贡献的计算.

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/youzhangjing_/article/details/128316567

智能推荐

路漫漫其修远兮:js的成长经历(十七)—— vue基础(一)-程序员宅基地

文章浏览阅读241次。目录什么是Vue.js为什么要学习流行框架框架和库的区别Node(后端)中的 MVC 与 前端中的 MVVM 之间的区别Vue.js 基本代码 和 MVVM 之间的对应关系Vue之 - 基本的代码结构`Vue指令之`插值表达式`、`v-cloak``v-text`和`v-html`Vue指令之`v-bind`的三种用法Vue指令之`v-on`和`跑马灯效果`跑马灯效果Vue指令之`v-on的缩写...

node.js云学堂微信小程序学习系统的设计与实现毕业设计源码011735_基于微信平台的《javascript程序设计》学习系统的设计与实现-程序员宅基地

文章浏览阅读246次。用户:免费好课、直播公开课、课程信息推荐、云学堂资讯、精选好课管理员:首页、用户管理、课程信息管理、精选好课管理、直播公开管理、免费分类管理、云学堂资讯管理_基于微信平台的《javascript程序设计》学习系统的设计与实现

【解决Anaconda3安装问题】conda --version 不是内部命令、没有script文件_conda --version没反应-程序员宅基地

文章浏览阅读9.7k次,点赞11次,收藏9次。这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Ma..._conda --version没反应

flex绑定数据-程序员宅基地

文章浏览阅读664次。在使用Flex开发的过程中,数据绑定是一定会遇到的,这种技术简单,又有点好玩,重要的是它让开发变得简单了。 在Flex中,数据绑定的方式有这么三种:直接在“{}”中填写绑定变量 使用标签绑定 使用ActionScript中的BindingUtils类绑定 示例1中的绑定方式即是第一种绑定方式,在“{}”中直接填写inputUnit.text,表

超融合、软件定义存储(SDS)、分布式存储以及Server SAN的区别与联系_部署方式包括集中式存储、分布式存储、超融合等-程序员宅基地

文章浏览阅读5.7k次。一时让人眼花缭乱的技术概念存储设备一直作为计算机系统的重要组成部分,过去很长一段时间,用户习惯于使用 SAN 存储作为保存企业关键业务数据的不二选择。基于 SAN 存储为核心的三层式基础架构(服务器-存储网络-存储设备),成为企业中最常用的基础架构,也称作传统架构。互联网的出现,信息量呈现爆炸式增长,人类产生数据的速度超越了以往所有时代的总和,需要存储的数据量也是急剧地增长。大数据,人工智能,物联网等新技术出现,对存储提出了新的需求。于是市面涌现了一系列的关于存储的新的技术概念和名词(包括 软件定义存储_部署方式包括集中式存储、分布式存储、超融合等

【Unity3d】百度AI人脸识别实例——描绘人脸特征点_unity 如何判断texture2d 是否黑色-程序员宅基地

文章浏览阅读5.1k次。上一篇文章介绍了在Unity3d中使用百度AI人脸识别功能,本文将用一个描绘人脸特征点的程序来讲解对SDK的调用。首先我们需要搭建一个简单的场景:一个开始测试的按钮,一张供测试和绘制特征点的图片,和显示debug信息的文字框: 然后新建一个叫FaceDetector的脚本,定义变量:public Text debugInfo; // 显示d_unity 如何判断texture2d 是否黑色

随便推点

操作系统 - 进程管理_实现生产者—消费者问题基于消息队列-程序员宅基地

文章浏览阅读385次。目录进程与线程1. 进程2. 线程3. 区别进程状态的切换进程调度算法1. 批处理系统1.1 先来先服务 first-come first-serverd(FCFS)1.2 短作业优先 shortest job first(SJF)1.3 最短剩余时间优先 shortest remaining time next(SRTN)1.4 最高相应比优先..._实现生产者—消费者问题基于消息队列

C语言实验4:指针-程序员宅基地

文章浏览阅读1.5k次,点赞39次,收藏18次。指针是一个变量,其值是另一个变量的地址。通过指针,可以直接访问存储在该地址上的数据。

SQL 数据库 学习 024 查询-07 order by 的用法 --- 以某个字段排序_sql使数据按字段排序-程序员宅基地

文章浏览阅读1.3w次。我的电脑系统:Windows 10 64位SQL Server 软件版本: SQL Server 2014 Express 本篇博客里面使用了 scott 库,如何你现在还没有添加这个库到你的服务器里面,请在查看本篇博客前,访问这篇博文来在你的服务器里面附加scott库。order by — 以某个字段排序例子:select * from emp order by sal; --默认_sql使数据按字段排序

解决360浏览器不支持IDM下载的问题_360下载失败怎么用idm安装-程序员宅基地

文章浏览阅读4.5w次,点赞2次,收藏2次。像360安全浏览器和360极速浏览器的设置中,下载工具都只能选择自己。不能选择IDM下载。 如图: 如何让它们支持IDM下载呢? 在IDM的文件夹中,可以看到一个扩展文件,将它拖动的浏览器中进行安装即可。 如图: 然后打开IDM,可以看到360安全/技术浏览器了。如果没有手动添加浏览器。 然后就可以用IDM下载了。..._360下载失败怎么用idm安装

scala方法中的变量_Scala中的变量-程序员宅基地

文章浏览阅读405次。scala方法中的变量 Scala变量 (Scala variables)A variable is named a reference to a memory location. The location stores the data that is used by the program. 变量被称为对存储位置的引用。 该位置存储程序使用的数据。 Based on the data t..._scala 方法 变量

研报回测:华泰期货《CTA 量化策略因子系列(二):动量因子》_华泰期货cta量化策略因子-程序员宅基地

文章浏览阅读5.9k次,点赞4次,收藏17次。我们都知道做投资最难的地方在于投资逻辑是否准确,如何验证逻辑的准确性是一门工程,从工科思维考虑就是通过历史数据做回测验证,以检验投资逻辑在历史中的表现,从而衡量投资逻辑的有效性。本文从华泰期货研报《20170925-华泰期货-CTA量化策略因子系列(二):动量因子》入手,去论证动量因子是否有效。一、准备巧妇难为无米之炊,首先我们需要准备成交量、动量和收益率的数据,收益率我们采用每天的涨跌幅来计..._华泰期货cta量化策略因子

推荐文章

热门文章

相关标签