服务器负载

under linux

in tech

Published: 2020-03-01

在类Unix操作系统中,服务器的负载(Server Load)反映了系统中在运行和等待中的任务数量的统计值,通常显示过去1分钟、5分钟和15分钟这3个时间窗口的统计值(uptime、top、htop)。

在Linux系统中,这个数值反映了正在运行的以及在CPU和IO等待队列中的线程数量(其它操作系统可能只统计了进程的数量,或者没有计算IO等待队列中的任务数量)。在Linux中运行同样数量的IO密集任务时的系统负载,很容易超过运行同样数量的计算密集的任务时的系统负载,就是因为Linux把IO等待队列中的任务纳入了负载统计。

多CPU的情况下,服务器的负载是所有CPU的负载之和,因此要除以CPU数量才能估计平均每个CPU的负载是多少。

负载的统计采用了权重系数按指数衰减的滑动平均统计方式,其包含了从系统启动以来所有数据的计算结果,只是越早的数据的权重越小。假设统计窗口为T,从时间t-T到当前时间t这段时间的数据约占1-1/e(约63%)的权重,t-T之前的数据约占1/e(约37%)的权重,开机时间t越长,权重占比越接近这些数值。

这种统计方式最大的好处是,当前系统负载是原系统负载和当前采样值的加权平均,而权重是统计窗口T、开机时间t和采样频率f的函数,系统无需保存历史采样数据。如果这个假设成立,不难得出以下推论:

  1. 系统负载的计算依赖于开机时间,uptime的输出结果中包含系统负载数据并不奇怪
  2. 系统负载必须从开机起连续不断地计算,系统负载数据应该是操作系统计算出来的,可以看到Linux把系统负载的数据放在/proc/loadavg里,供用户查看
  3. 统计窗口一旦确定就不能更改了,Linux中的系统负载应该只有1分钟、5分钟和15分钟这3个时间窗口的统计值

以上内容来自维基百科