一篇读懂|Linux系统平均负载

news2025/7/4 16:59:03

我们经常会使用 top 命令来查看系统的性能情况,在 top 命令的第一行可以看到 load average 这个数据,如下图所示:

load average 包含 3 列,分别表示 1 分钟、5 分钟和 15 分钟的 系统平均负载

对于系统平均负载这个数值,可能很多同学并不完全理解其意义,并不知道数值达到多少时才表示系统负载过高。本文将会以简单的语言来介绍系统平均负载这个概念,并且会介绍 Linux 内核是怎么计算这个数值。

 资料直通车:Linux内核源码技术学习路线+视频教程内核源码

学习直通车:Linux内核源码内存调优文件系统进程管理设备驱动/网络协议栈

系统平均负载

《Understanding Linux CPU Load(链接在文章最后)》这篇文章已经非常通俗的解释了什么是 系统平均负载,这里借用一下此文中的例子。

如果将 CPU 比作是桥梁,对于单核的 CPU 就好比是单车道的桥梁。每次桥梁只能让一辆汽车通过,并且要以规定的速度通过。那么:

  • 如果每个时刻都只有一辆汽车通过,那么所有汽车都不用排队,此时桥梁的使用率最高。以平均负载 1.0 表示,如下图所示:

  • 如果每隔一段时间才有一辆汽车通过,那么表示桥梁部分时间处于空闲的情况。并且间隔的时间越长,表示桥梁空闲率越高。此时的平均负载小于 1.0,如下图所示:

  • 当有大量的汽车通过桥梁时,有些汽车需要等待其他车辆通过后才能继续通行,这时表示桥梁超负荷工作。此时平均负载大于1.0,如下图所示:

系统的平均负载与上面的例子一样,在单核 CPU 的环境下:

  • 当平均负载等于 1.0 时,表示 CPU 使用率最高。
  • 当平均负载小于 1.0 时,表示 CPU 使用率处于空闲状态。
  • 当平均负载大于 1.0 时,表示 CPU 使用率已经超过负荷。

对于单核 CPU 来说,平均负载 1.0 表示使用率最高。但对于多核 CPU 来说,平均负载要乘以核心数。比如在 4 核 CPU 的系统中,当平均负载为 4.0 时,才表示 CPU 的使用率最高。

Linux 平均负载计算原理

在介绍系统平均负载的计算原理前,先要介绍一下什么是系统负载。在 Linux 系统中,系统负载表示 系统中当前正在运行的进程数量 ,其包括 可运行状态 的进程数和 不可中断休眠状态 的进程数的和。注意:不可中断休眠状态的进程一般是在等待 I/O 完成的进程。

系统负载 = 可运行状态进程数 + 不可中断休眠状态进程数

知道了什么是 系统负载,那么 系统平均负载 就容易理解了。比如每 5 秒统计一次系统负载,1 分钟内会统计 12 次。如下所示:

第5秒  -> 系统负载
第10秒 -> 系统负载
第15秒 -> 系统负载
...
第60秒 -> 系统负载

然后把每次统计到的系统负载加起来,再除以统计次数,即可得出 系统平均负载。如下图所示:

但这种计算方式有些缺陷,就是预测系统负载的准确性不够高,因为越老的数据越不能反映现在的情况。打个比方,要预测某条公路今天的车流量,使用昨天的数据作为预测依据,会比使用一个月之前的数据作为依据要准确得多。

所以,时间越近的数据,对未来的预测准确性越高。

Linux 内核使用一种名为 指数平滑法 的算法来解决这个问题,指数平滑法的核心思想是对新老数据进行加权,越老的数据权重越低。

指数平滑法:是由 Robert G..Brown 提出的一种加权移动平均法,有兴趣了解其数学原理的可以搜索相关资料,本文不作详细介绍。

其计算公式如下(来源于 Linux 内核代码 kernel/sched/core.c):

load1 = load0 * e + active * (1 - e)

解释一下上面公式的意思:

  • load1 :表示时间 t + 1 的系统负载。
  • load0 :表示时间 t 的系统负载。
  • e :表示衰减系数。
  • active :表示系统中的活跃进程数(可运行状态进程数 + 不可中断休眠状态进程数)。

所以,我们就可以使用上面的公式来预测任何时间的系统平均负载了。比如,我们要预测时间点 n 的系统平均负载,那么可以这样来计算:

load1 = load0 * e + active * (1 - e)
load2 = load1 * e + active * (1 - e)
load3 = load2 * e + active * (1 - e)
...
loadn = loadn-1 * e + active * (1 - e)

现在就只剩下 衰减系数 该如何计算了。

从 Linux 内核的注释可以了解到,计算 1 分钟内系统平均负载的 衰减系数 的计算方式如下:

1 / exp(5sec / 1min)

其中:

  • 5sec :表示统计的时间间隔,5秒。
  • 1min :表示统计的时长,1分钟。
  • exp :表示以自然常数 e 为底的指数函数。

也就是说,要计算一分钟的系统平均负载时,需要使用上面的 衰减系数。对于 5 分钟和 15 分钟的 衰减系数 的计算方式分别为:

1 / exp(5sec / 5min)
1 / exp(5sec / 15min)

Linux 内核已经把 1 分钟、5 分钟和 15 分钟的 衰减系数 结果计算出来,并且定义在 include/linux/sched.h 文件中,如下所示:

#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) */

通过上述公式计算出来的 衰减系数 是个浮点数,而在内核中是不能进行浮点数运行的。解决方法是先对 衰减系数 进行扩大,然后在展示时最缩小。所以,上面的 衰减系数 数值是经过扩大 2048 倍后的结果。

Linux 平均负载计算实现

万事俱备,只欠东风 。上面我们已经把所有的知识点介绍了,现在来分析一下 Linux 内核代码是怎样实现的。

1. 数据存储

在 Linux 内核中,使用了 avenrun 数组来存储 1 分钟、5 分钟和 15 分钟的系统平均负载,如下代码所示:

unsigned long avenrun[3];

如元素 avenrun[0] 用于存储 1 分钟内的系统平均负载,而元素 avenrun[1] 用于存储 5 分钟的系统平均负载,如此类推。

2. 统计过程

由于统计需要定时进行,所以内核把统计过程放置到 时钟中断 中进行。当 时钟中断 触发时,将会调用 do_timer() 函数,而 do_timer() 函数将会调用 calc_global_load() 来统计系统平均负载。

我们来看看 calc_global_load() 函数的实现:

void calc_global_load(unsigned long ticks)
{
    long active, delta;

    // 1. 如果还没到统计的时间间隔,那么将不进行统计(5秒统计一次)
    if (time_before(jiffies, calc_load_update + 10))
        return;

    // 2. 获取活跃进程数
    delta = calc_load_fold_idle();
    if (delta)
        atomic_long_add(delta, &calc_load_tasks);

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

    // 3. 统计各个时间段系统平均负载
    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);

    // 4. 更新下次统计的时间(增加5秒)
    calc_load_update += LOAD_FREQ;

    ...
}

calc_global_load() 函数主要完成 4 件事情:

  1. 判断当前时间是否需要进行统计,如果还没到统计的时间间隔,那么将不进行统计(5秒统计一次)。
  2. 获取活跃进程数(可运行状态进程数 + 不可中断休眠状态进程数)。
  3. 统计各个时间段系统平均负载(1分钟、5分钟和15分钟)。
  4. 更新下次统计的时间(增加5秒)。

从上面的分析可知,calc_global_load() 函数将会调用 calc_load() 来计算系统平均负载。其代码如下:

/*
 * a1 = a0 * e + a * (1 - e)
 */
static unsigned long
calc_load(unsigned long load, unsigned long exp, unsigned long active)
{
    load *= exp;
    load += active * (FIXED_1 - exp);
    load += 1UL << (FSHIFT - 1);

    return load >> FSHIFT;
}

calc_load() 函数的各个参数意义如下:

  • load :t-1 时间点的系统负载。
  • exp :衰减系数。
  • active :活跃进程数。

可以看出,calc_load() 函数的实现就是按照 指数平滑法 来计算的。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/7138.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

红杉官网已删长文:伴随SBF一路走来的救世主情结(上)

每个创业公司都有一个创业故事。苹果是洛斯阿尔托斯车库里的两个黑客。谷歌是斯坦福大学宿舍里的两个研究生。而Alameda Research是伯克利公寓里做着加密货币交易的一个人。这个人叫山姆班克曼弗里德&#xff0c;朋友们都叫他SBF。然而&#xff0c;他所做的交易——最终催生了加…

ERP系统如何改善企业的业务?

ERP代表 "企业资源计划"&#xff0c;指的是企业用来计划和管理日常活动的一种软件或系统&#xff0c;如供应链、制造、服务、财务和其他流程。ERP系统可用于自动化和简化整个企业或组织的个别活动&#xff0c;如会计和采购、项目管理、客户关系管理、风险管理、合规和…

springboot常用组件的集成

目录 springboot常用组件的集成 1.创建项目 2. web服务器配置 3. 配置数据库 4. 配置mybatis 5. 开启事务 6.aop配置 7. pagehelper分页 3. druid数据库连接池 4. 集成redis 编写一个controller用于测试 2.手动装配redis 1.创建项目 1.idea创建项目 创建步骤 &am…

PDF文档编辑Acrobat Pro DC

acrobat dc2022不仅可以轻松的帮助用户打开任意的PDF格式文件&#xff0c;还能随意的对其进行编辑、压缩、合并、剪裁、旋转。删除、分割、重新排序页面等操作。全新的统一分享体验使您能够跨桌面&#xff0c;移动和Web进行文档协作。共享PDF链接以查看或评论。在任何设备上的任…

初识jQuery

jQuery简介 What is jQuery? jQuery is a fast, small, and feature-rich JavaScript library. It makes things like HTML document traversal and manipulation, event handling, animation, and Ajax much simpler with an easy-to-use API that works across a multitud…

【附源码】计算机毕业设计JAVA宠物医院管理

【附源码】计算机毕业设计JAVA宠物医院管理 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JAVA mybati…

经典动画库 animate.css 的应用

一、animate.css animate.css&#xff1a;&#xff1a;Animate.css 就像嗑水那么简单的CSS动画。 官网&#xff1a;Redirecting to Animate.css Animate.css是一个纯CSS动画库&#xff0c;其核心技术使用了 CSS3 里的 keyframes 和 animation。 不兼容IE10以下的 IE 浏览器。…

SpringMVC基于注解使用:异常处理

SpringMVC基于注解使用&#xff1a;异常处理 1、内置异常处理解析器 2、统一异常处理 ControllerAdvice 是Spring3.2提供的新注解,它是对Controller的增强,可对 controller中被 RequestMapping注解的方法加一些逻辑处理: 全局异常处理&#xff08;较为常用)全局数据绑定全局…

基于PSO的UAV三维路径规划(Matlab代码实现)

&#x1f352;&#x1f352;&#x1f352;欢迎关注&#x1f308;&#x1f308;&#x1f308; &#x1f4dd;个人主页&#xff1a;我爱Matlab &#x1f44d;点赞➕评论➕收藏 养成习惯&#xff08;一键三连&#xff09;&#x1f33b;&#x1f33b;&#x1f33b; &#x1f34c;希…

ArcGIS计算地形湿度指数

TWI是区域地形对径流流向和蓄积影响的物理指标&#xff0c;有助于识别降雨径流模式、潜在土壤含水量增加区域和积水区域。 计算方法&#xff1a;TWI是通过细尺度地形与上梯度对地表面积的贡献相互作用&#xff0c;根据以下关系得到的(Beven et al.,1979) [1] : TWI ln [CA/…

行深智能亮相乌镇互联网大会,荣获直通乌镇全球互联网大赛一等奖

11月9-11日&#xff0c;2022年世界互联网大会在浙江乌镇举行&#xff0c;本届大会以“共建网络世界、共创数字未来——携手构建网络空间命运共同体”为主题&#xff0c;吸引了来自世界各地的政府、国际组织、企业参加。 行深智能携系列无人车及解决方案在乌镇运河智能汽车文化…

react-hooks的节流与闭包,以及useCallback的用处

目录 useThrottle: 封装了一个节流的hook useCallback的作用&#xff08;性能优化&#xff09; 不用Hook封装节流方法的情况&#xff0c;看是怎么形成闭包的&#xff1a; useThrottle: 封装了一个节流的hook import { useEffect, useCallback, useRef } from react;function…

2023年软件测试的发展如何?

近些年&#xff0c;自动化测试在很多软件公司已经成为一种必备的测试方式。即使那些还没运用自动化测试手段的公司&#xff0c;也正开始着手筹划了。每年&#xff0c;我们从举办的各种测试论坛和峰会上可以发现&#xff0c;自动化测试和敏捷测试必定是会议的主角。再看看最具有…

IPV6地址详解

♥️作者&#xff1a;小刘在C站 ♥️每天分享课堂笔记&#xff0c;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的&#xff0c;绽放。 目录 一.为什么要使用IPv6 二. ipv4 三. ipv6 地址&#xff0c; 四 ipv6与 ipv4 地址相比 1.v4…

MySQL数据库 -- 表的增删查改

今天来讲MySQL数据库的表增删查改操作。今天主要是通过栗子来演示语法使用的&#xff0c;话不多说&#xff0c;直奔主题~ 表的增删查改&#xff1a; CRUD : Create(创建), Retrieve(读取)&#xff0c;Update(更新)&#xff0c;Delete&#xff08;删除&#xff09; 目录 Cre…

你适合做自动化测试吗?

上一篇对于自动化测试有了基础了解&#xff0c;这一篇我们来看看你适合做自动化测试吗&#xff1f; 你适合走自动化测试这条路吗&#xff1f; 不管是UI自动化还是接口自动化&#xff0c;肯定的一点是&#xff0c;必须有代码基础&#xff0c;不管是java还是python。所以如果你…

Docker 安装Oracle 11g免费版—无坑小白白版(值得拥有)

​ Docker 安装Oracle 11g免费版—无坑小白白版&#xff08;值得拥有&#xff09; 第一步&#xff1a;登录自己的服务器&#xff08;root用户/或授权用户&#xff09; 第二步&#xff1a;下载 1、下载镜像 docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_…

基于概率距离削减法、蒙特卡洛削减法的风光场景不确定性削减附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

MySQL数据库期末考试试题及参考答案(01)

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 一、 填空题 ___在20世纪80年代被美国国家标准学会和国际标准化组织定义为关系型数据库语言的标准。数据模型所描述的内容包括3个部分&#xff0c;分别是数据结构、数据操作…

[论文阅读] Generative Adversarial Networks for Video-to-Video Domain Adaptation

[论文地址] [代码] [AAAI 20] Abstract 来自多中心的内窥镜视频通常有不同的成像条件&#xff0c;如颜色和光照&#xff0c;这使得在一个领域训练的模型通常不能很好地推广到另一个领域。领域适应是解决这一问题的潜在方案之一。然而&#xff0c;现有的工作很少关注基于视频的…