Linux系统负载相关知识汇总( 二 )


通常情况下,对于单CPU的情况,
如果load average 大于 0.7 ,就要开始引起系统管理员注意,查找问题所在;
大于1.0,就要寻找解决方法;
大于5.0,表明系统的问题已经很严重了,可能会死机 。
对于多CPU或者多核的情况,请乘以对应的倍数来判断 。
另外,由于在Linux中,会返回三个时间的观察值,那么就存在一个问题,就是我要以哪个时长的观察值为准了 。在阮一峰老师的博文中也给出了建议:
如果只有1分钟的系统负荷大于1.0,其他两个时间段都小于1.0,这表明只是暂时现象,问题不大 。
如果15分钟内,平均系统负荷大于1.0(调整CPU核心数之后),表明问题持续存在,不是暂时现象 。所以,你应该主要观察”15分钟系统负荷”,将它作为电脑正常运行的指标 。
四: 系统负载是怎么计算出来的
为了搞清楚系统负载是怎么算出来的,我又在网上找到了一些资料 。计算公式涉及了高等数学的运算,如果对此不感兴趣,可以直接跳过 。
通过查看Linux源码,可以得到,Linux计算系统平均负载的公式为:
load(t) = load(t-1) e^(-5/60) + n (1 – e^(-5/60))其中,exp(x)为e的x次幂,
n为当前运行队列的长度 。
Linux内核认为进程的生存时间服从参数为1的指数分布,
指数分布的概率密度为:以内核计算负载load1为例,设相邻两个计算时刻之间系统活动的进程集合为S0 。
从1分钟前到当前计算时刻这段时间里面活动的load1个进程,设他们的集合是 S1,内核认为的概率密度是:λe-λx,
而在当前时刻活动的n个进程,设他们的集合是Sn内核认为的概率密度是1-λe-λx 。
其中x = 5 / 60,因为相邻两个计算时刻之间进程所耗的CPU时间为5秒,而考虑的时间段是1分钟(60秒) 。
那么可以求出最近1分钟系统运行队列的长度:
load1 = |S1| -* λe-λx + |Sn| * (1-λe-λx) = load1 * λe-λx + n * (1-λe-λx)
其中λ = 1,x = 5 / 60,|S1|和|Sn|是集合元素的个数,这就是Linux内核源文件shed.c的函数calc_load()计算负载的数学依据 。

推荐阅读