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

use*_*507 29 linux kernel monitoring load algorithms

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

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

负荷图.

这是个很大的差异。

最后我的问题是:

  • 与真正的移动平均线相比,为什么选择这种实现方式,这对任何人都有真正的意义?
  • 为什么每个人都谈论“1 分钟平均负载”,因为算法考虑了比最后一分钟多得多的内容。(数学上,自启动以来的所有度量;在实践中,考虑到舍入误差——仍然有很多度量)

gee*_*aur 24

这种差异可以追溯到最初的 Berkeley Unix,源于内核实际上无法保持滚动平均值;为了做到这一点,它需要保留大量过去的读数,尤其是在过去,根本没有多余的记忆。所使用的算法的优点是所有内核需要保留的是先前计算的结果。

请记住,当计算机速度和相应的时钟周期以数十 MHz 而不是 GHz 为单位测量时,该算法更接近真实情况;这些天有更多的时间出现差异。

  • 因为这就是文档以及从原始 BSD `uptime` 和 `w` 开始报告它们的每个程序所声称的;你必须查看内核源代码才能发现它实际上不是真的。 (5认同)
  • @ user5528 时间`1min/5min/15min` *确实*有道理。它们确定当前负载的影响下降某个固定因素(可能是 e=2.71 .. 或可能是 2)之前的时间。试试吧。 (3认同)
  • 好的,这解释了实现的选择。你知道为什么很多人认为三个平均负载是在过去 1min/5min/15min 内计算的吗?我认为这是错误的,该算法计算了所有最后一个值的平均值。我知道旧值的重要性不如新值,但是,超过 1 分钟的值仍然对 1 分钟平均负载产生不可忽视的影响。所以在我看来“1min/5min/15min”没有意义,但我可能错了(?) (2认同)
  • @maaartinus 是的。1 分钟/5 分钟/15 分钟确定在 EMA 计算中旧度量的权重小于或等于 1/e 之前的时间。此精度不会出现在 _man uptime_ 或 _man top_ 中。 (2认同)