http://www.penglixun.com/tech/system/how_to_calc_load_cpu.html

#define FSHIFT      11          /* nr of bits of precision */
#define FIXED_1 (1<>= FSHIFT; unsigned long avenrun[3]; EXPORT_SYMBOL(avenrun); /*
* calc_load - given tick count, update the avenrun load estimates.
* This is called while holding a write_lock on xtime_lock.
*/
static inline void calc_load(unsigned long ticks)
{
unsigned long active_tasks; /* fixed-point */
static int count = LOAD_FREQ;
count -= ticks;
if (count < 0) {
count += LOAD_FREQ;
active_tasks = count_active_tasks();
CALC_LOAD(avenrun[0], EXP_1, active_tasks);
CALC_LOAD(avenrun[1], EXP_5, active_tasks);
CALC_LOAD(avenrun[2], EXP_15, active_tasks);
}
}

看了大师的文章,理解了这些代码。
所以可以明白:Linux的系统负载指运行队列的平均长度,也就是等待CPU的平均进程数。
Linux的系统负载指运行队列的平均长度,也就是等待CPU的平均进程数。因为Linux内禁止浮点运算,因此系统的负载只能通过计算变化的次数这一修
正值来计算。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为当前运行队列的长度。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()计算负载的数学依据。

所以“Load值=CPU核数”,这是最理想的状态,没有任何竞争,一个任务分配一个核。
由于数据是每隔5秒钟检查一次活跃的进程数,然后根据这个数值算出来的。如果这个数除以CPU的核数,结果高于5的时候就表明系统在超负荷运转了。

最新文章

  1. 干货!表达式树解析&quot;框架&quot;(2)
  2. tomcat启动时候报错Can&#39;t convert argument: null
  3. java classpath getResource getResourceAsStream
  4. OAF_开发系列29_实现OAF中批次处理迭代器RowSet/RowSetIterator(案例)
  5. 跟我学-Java底层技术系列文章
  6. SQLite主键自增需要设置为integer PRIMARY KEY
  7. sql server触发器中增删改判断
  8. Andorid-如何为你的Android应用缩放图片
  9. python:redis简单操作
  10. CTime,Systemtime的比较还有转换成日期格式。
  11. .NET2.0下的对象生成JSON数据
  12. 【百度地图API】获取行政区域的边界
  13. akka 入门
  14. (五)聊一聊深Copy与浅Copy
  15. 在IIS上部署(托管).NET Core站点
  16. 在Unity3D里使用WinForm
  17. SoapUI Pro Project Solution Collection-XML assert
  18. 深入hash
  19. RxJS之转化操作符 ( Angular环境 )
  20. python 多进程和子进程1

热门文章

  1. django基础 -- 1. 前奏 web框架的本质
  2. vba编程基础1
  3. 【做题】51NOD1753 相似子串——哈希
  4. 【做题】Codeforces Round #453 (Div. 1) D. Weighting a Tree——拆环
  5. 51nod 1689 逛街(优先队列)
  6. JS相关重点知识 (概况)
  7. python学习 day09打卡 初识函数
  8. File操作-将txt里的内容写入到数据库表
  9. 【Ruby】【YAML】
  10. vs 2015 编译cocos2d-x-3.9