1. 首页 > 知识问答

指数加权移动平均详解(快速定位平均负载升高的原因)

平均负载的定义是:单位时间内,系统中处于可运行状态(TASK_RUNNING)和不可中断状态(TASK_UNINTERRUPTIBLE)的平均进程数。

简单来说,平均负载就是指运行队列的平均长度但是这里的“平均”并非我们理解的简单算术平均,而是指数加权移动平均

算术平均理解起来虽然简单,但是有两点不足:

  • 需要存储过去每一个采样周期的数据
  • 不能准确表示当前变化趋势

再来看看指数加权移动平均:

 

假设最近1、5、15分钟内的平均负载分别为 load1、load5 和 load15,那么下一个计算时刻到来时,内核通过下面的算式计算负载:

 

其中,exp(x) 为e的x次幂,n为当前运行队列的长度。也就是说,指数加权移动平均只需要记录最近一次的平均负载,就可以根据最新的采样(当前时刻运行队列的长度)计算当前时刻的平均负载。

平均负载和 CPU 使用率的区别是:平均负载不仅包括了正在使用 CPU 的进程,还包括等待 CPU 和等待 I/O 的进程;而 CPU 使用率指的是正在使用 CPU 的进程,由此可见它们两者是不同的。

理解了平均负载就是运行队列的平均长度,我们就可以利用下面脚本定位平均负载升高的原因:

#!/bin/bash
LANG=C
PATH=/sbin:/usr/sbin:/bin:/usr/bin
interval=1
length=86400
for i in $(seq 1 $(expr ${length} / ${interval}))
do
  date
  LANG=C ps -eTo stat,pid,tid,ppid,comm --no-header | sed -e 's/^ \*//' | perl -nE 'chomp;say if (m!^\S*[RD]+\S*!)'
  date
  cat /proc/loadavg
  echo -e "\n"
  sleep ${interval}
done

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站不拥有所有权,不承担相关法律责任。如发现有侵权/违规的内容, 联系QQ15101117,本站将立刻清除。

联系我们

在线咨询:点击这里给我发消息

微信号:666666