我们经常会使用 top
命令来查看系统的性能情况,在 top
命令的第一行可以看到 load average
这个数据,如下图所示:
load average
包含 3 列,分别表示 1 分钟、5 分钟和 15 分钟的 系统平均负载
。
对于系统平均负载这个数值,可能很多同学并不完全理解其意义,并不知道数值达到多少时才表示系统负载过高。本文将会以简单的语言来介绍系统平均负载这个概念,并且会介绍 Linux 内核是怎么计算这个数值。
《Understanding Linux CPU Load(链接在文章最后)》这篇文章已经非常通俗的解释了什么是 系统平均负载
,这里借用一下此文中的例子。
如果将 CPU 比作是桥梁,对于单核的 CPU 就好比是单车道的桥梁。每次桥梁只能让一辆汽车通过,并且要以规定的速度通过。那么:
系统的平均负载与上面的例子一样,在单核 CPU 的环境下:
对于单核 CPU 来说,平均负载 1.0 表示使用率最高。但对于多核 CPU 来说,平均负载要乘以核心数。比如在 4 核 CPU 的系统中,当平均负载为 4.0 时,才表示 CPU 的使用率最高。
在介绍系统平均负载的计算原理前,先要介绍一下什么是系统负载。在 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)
解释一下上面公式的意思:
所以,我们就可以使用上面的公式来预测任何时间的系统平均负载了。比如,我们要预测时间点 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)
其中:
也就是说,要计算一分钟的系统平均负载时,需要使用上面的 衰减系数
。对于 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 内核中,使用了 avenrun
数组来存储 1 分钟、5 分钟和 15 分钟的系统平均负载,如下代码所示:
unsigned long avenrun[3];
如元素 avenrun[0]
用于存储 1 分钟内的系统平均负载,而元素 avenrun[1]
用于存储 5 分钟的系统平均负载,如此类推。
由于统计需要定时进行,所以内核把统计过程放置到 时钟中断
中进行。当 时钟中断
触发时,将会调用 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 件事情:
从上面的分析可知,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()
函数的各个参数意义如下:
t-1
时间点的系统负载。可以看出,calc_load()
函数的实现就是按照 指数平滑法
来计算的。
参考文献:
- 《Understanding Linux CPU Load》https://scoutapm.com/blog/unders> tanding-load-averages
- 《Linux系统平均负载是如何计算的》https://blog.csdn.net/rikeyone/article/details/108309665
本文由哈喽比特于2年以前收录,如有侵权请联系我们。
文章来源:https://mp.weixin.qq.com/s/aVCQvxAA8itQ3PheEUFBcg
京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。
日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。
据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。
今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。
日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。
近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。
据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。
9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...
9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。
据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。
特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。
据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。
近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。
据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。
9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。
《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。
近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。
社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”
2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。
罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。