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

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

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

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

负载图

这是个很大的差异。

最后我的问题是:

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

答案1

这种差异可以追溯到最初的 Berkeley Unix,并且源于内核实际上无法保持滚动平均值的事实;为此,它需要保留大量过去的读数,尤其是在过去,根本没有足够的内存来存储它。相反使用的算法的优点是内核需要保留的只是先前计算的结果。

请记住,当计算机速度和相应的时钟周期以数十 MHz(而不是 GHz)测量时,算法更接近事实;如今,差异有更多的时间蔓延。

相关内容