Load averages 采样是从 /proc/loadavg 中获取的:
如果你看到 load average 数值是 10,则表明平均有 10 个进程在运行或等待状态。有可能系统有很高的负载但是 CPU 使用率却很低,或者负载很低而 CPU 利用率很高,因为这两者没有直接关系。
从这个函数中可以看到,内核计算load采用的是一种平滑移动的算法,Linux的系统负载指运行队列的平均长度,需要注意的是:可运行的进程是指处于运行队列的进程,不是指正在运行的进程。即进程的状态是TASK_RUNNING或者TASK_ UNINTERRUPTIBLE。
Linux 内核定义一个长度为 3 的双字数组 avenrun,双字的低 11 位用于存放负载的小数部分,高 21 位用于存放整数部分。当进程所耗的 CPU 时间片数超过 CPU 在 5秒内能够提供的时间片数时,内核计算上述的三个负载,负载初始化为 0。
假设最近 1、5、15 分钟内的平均负载分别为 load1、load5 和 load15,那么下一个计算时刻到来时,内核通过下面的算式计算负载:
load1 -= load1 - exp(-5 / 60) -+ n (1 - exp(-5 / 60 )) load5 -= load5 - exp(-5 / 300) + n (1 - exp(-5 / 300)) load15 = load15 exp(-5 / 900) + n (1 - exp(-5 / 900))
其中,exp(x) 为 e 的 x 次幂,n 为当前运行队列的长度。
资料来源:电子书《ECS运维指南之Linux系统诊断》,下载链接:https://developer.aliyun.com/topic/download?id=143
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。