当前位置: 首页 > article >正文

linux Load Average 计算

在内核代码 kernel/sched/loadavg.c 中有一个公式:

a1 = a0 * e + a * (1 - e)


此算法是指数加权移动平均法(Exponential Weighted Moving Average,EMWA),是一种特殊的加权移动平均法,它考虑当前和历史的所有数据,强调当前样本的重要性,逐渐淡化历史样本的重要程度。EWMA的权重随着时间呈指数式递减,越靠近当前时刻的数值加权系数就越大。

其中a0是上一时刻的值,a1是当前时刻的值,e 是一个系数,取值范围是[0,1],a是当前时刻的某个指标采样值。

具体到linux load的计算,a0是上一时刻的load,a1是当前时刻的load,e是一个常量系数,a 是当前时刻的active的进程/线程数量。

linux 内核计算了三个load  值,分别是1分钟/5分钟/15分钟 load 。计算这三个load 值时,使用了三个不同的常量系数e,内核代码中定义如下:


#define FSHIFT        11        /* nr of bits of precision */
#define FIXED_1        (1<<FSHIFT)    /* 1.0 as fixed-point */
#define LOAD_FREQ    (5*HZ+1)    /* 5 sec intervals */
#define EXP_1        1884        /* 1/exp(5sec/1min) as fixed-point */
#define EXP_5        2014        /* 1/exp(5sec/5min) */
#define EXP_15        2037        /* 1/exp(5sec/15min) */

EXP_* 这三个值为以下计算出来:
    1884 = 2048/(power(e,(5/(60*1))))          /* e = 2.71828 */
    2014 = 2048/(power(e,(5/(60*5))))
    2037 = 2048/(power(e,(5/(60*15))))

    5是指每五秒采样一次,60是指每分钟60秒,1、5、15则分别是1分钟、5分钟和15分钟。

/**
 * calc_load - Load Average 计算
 *  @load : 上一时刻的load
 *  @exp  : 常量系数
 *  @active : active的进程/线程数量
 */
/* * a1 = a0 * e + a * (1 - e) */
static inline unsigned long calc_load(unsigned long load, unsigned long exp, unsigned long active)
{
    unsigned long newload;

    newload = load * exp + active * (FIXED_1 - exp);

    if (active >= load)
        newload += FIXED_1-1;

    return newload / FIXED_1;
}

/*
 * a1 = a0 * e + a * (1 - e)
 *
 * a2 = a1 * e + a * (1 - e)
 *    = (a0 * e + a * (1 - e)) * e + a * (1 - e)
 *    = a0 * e^2 + a * (1 - e) * (1 + e)
 *
 * a3 = a2 * e + a * (1 - e)
 *    = (a0 * e^2 + a * (1 - e) * (1 + e)) * e + a * (1 - e)
 *    = a0 * e^3 + a * (1 - e) * (1 + e + e^2)
 *
 *  ...
 *
 * an = a0 * e^n + a * (1 - e) * (1 + e + ... + e^n-1) [1]
 *    = a0 * e^n + a * (1 - e) * (1 - e^n)/(1 - e)
 *    = a0 * e^n + a * (1 - e^n)
 *
 * [1] application of the geometric series:
 *
 *              n         1 - x^(n+1)
 *     S_n := \Sum x^i = -------------
 *             i=0          1 - x
 */
static unsigned long
calc_load_n(unsigned long load, unsigned long exp,
        unsigned long active, unsigned int n)
{
    return calc_load(load, fixed_power_int(exp, FSHIFT, n), active);
}


http://www.kler.cn/a/349554.html

相关文章:

  • 【Proteus仿真】【51单片机】多功能计算器系统设计
  • 联想拯救者R720笔记本外接显示屏方法,显示屏是2K屏27英寸
  • Vue+Echarts 实现青岛自定义样式地图
  • 计算机网络 (62)移动通信的展望
  • 富文本 tinyMCE Vue2 组件使用简易教程
  • Maven的单元测试
  • 元数据 - iXML
  • ubuntu24开启启动脚本
  • 全面掌握 Linux 服务管理:从入门到精通
  • Json-Rpc框架(项目设计 —— 服务端客户端 模块功能划分简介)
  • 不启动容器直接进入Docker镜像里执行命令
  • 超声波测距
  • 青少年编程能力等级测评CPA C++一级试卷(1)
  • Java 17 面向对象编程(基础篇),快速了解面试对象编程
  • 跟着小土堆学习pytorch(一)——Dataset
  • 基于Verilog的简单调制解调器(MODEM)设计
  • 论文 期刊论文
  • RHCE第一天
  • 大厂面试真题-说一下推和拉的模式以及常见的使用
  • python画图|在三维空间的不同平面上分别绘制不同类型二维图
  • Java面向对象六大设计原则总结1
  • YOLOv11改进策略【卷积层】| HWD,引入`Haar小波变换`到下采样模块中,减少信息丢失
  • 阿里云+frp内网穿透工作站远程开机
  • git的提取和拉取有啥区别
  • 配置环境windows-IIS默认拒绝put,delete的解决方案
  • MySQL-约束Constraint详解