为什么在Linux负载计算中没有使用简单的1/5/15分钟移动平均值?


28

直到最近,我还认为负载平均(如顶部所示)是状态“可运行”或“正在运行”的进程数的n个最后值的移动平均值。并且n将由移动平均线的“长度”定义:由于计算平均负载的算法似乎每5秒触发一次,因此对于1分钟的平均负载,n将为12,对于5分钟的平均负载,n将为12x5,而12x15 15分钟的平均负载。

但是后来我读了这篇文章:http : //www.linuxjournal.com/article/9001。这篇文章很老,但是今天在Linux内核中实现了相同的算法。平均负载不是移动平均,而是一种我不知道名称的算法。无论如何,我在一个假想的周期性负载下对Linux内核算法和移动平均值进行了比较:

负荷图

这是个很大的差异。

最后,我的问题是:

  • 为什么选择这种实现方式而不是对任何人都具有真正意义的真实移动平均值?
  • 为什么每个人都说“ 1分钟平均负载”,因为算法考虑了比最后一分钟更多的时间。(从数学上讲,是自启动以来的所有度量;实际上,考虑到舍入误差-仍然是很多度量)

5
这是指数移动平均线(EMA),也用于金融(技术分析)。优点大概是相同的-EMA可以仅根据先前的值和当前值进行计算,而与较早的值相比,最新的值具有更大的权重。在标准MA中,最旧的值对平均值的贡献与最新值相同,有时我们认为较新的值更重要。
jg-faustus

Answers:


24

这种差异可以追溯到最初的Berkeley Unix,其原因是内核实际上无法保持滚动平均值。为此,它需要保留大量过去的读数,尤其是在过去,没有记忆可以保留它。相反,使用的算法的优点是,内核需要保留的所有内容都是先前计算的结果。

请记住,当计算机速度和相应的时钟周期以数十兆赫而不是GHz进行测量时,该算法稍微接近真实情况。在这些日子里,差异有更多的时间蔓延。


2
好的,这说明了实现的选择。您知道为什么很多人认为这三个平均负载是在最近1分钟/ 5分钟/ 15分钟内计算的吗?我认为这是错误的,该算法会计算所有最后一个值的平均值。我知道旧值的重要性不如新值重要,但是,超过1分钟的值在1min的平均负载中的影响仍然微不足道。因此,我认为“ 1min / 5min / 15min”没有任何意义,但我可能是错的(?)
user368507 2011年

5
因为这就是文档以及所有报告这些文档的程序,它们都从原始BSD uptimew声明开始;您必须查看内核源代码才能发现它实际上不是真的。
geekosaur 2011年

1
真的很可惜
user368507 2011年

3
@ user5528时代1min/5min/15min 确实有意义。他们确定了一段时间后,电流负载的影响将下降某个固定因子(可能为e = 2.71 ..或2)。尝试一下。
maaartinus 2011年

2
@maaartinus是的。1min / 5min / 15min确定在EMA计算中较早的度量权重小于或等于1 / e的时间。这种精确度不会出现在人的正常运行时间人的高层中
user368507 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.