您好,欢迎来到思海网络,我们将竭诚为您提供优质的服务! 诚征网络推广 | 网站备案 | 帮助中心 | 软件下载 | 购买流程 | 付款方式 | 联系我们 [ 会员登录/注册 ]
促销推广
客服中心
业务咨询
有事点击这里…  531199185
有事点击这里…  61352289
点击这里给我发消息  81721488
有事点击这里…  376585780
有事点击这里…  872642803
有事点击这里…  459248018
有事点击这里…  61352288
有事点击这里…  380791050
技术支持
有事点击这里…  714236853
有事点击这里…  719304487
有事点击这里…  1208894568
有事点击这里…  61352289
在线客服
有事点击这里…  531199185
有事点击这里…  61352288
有事点击这里…  983054746
有事点击这里…  893984210
当前位置:首页 >> 技术文章 >> 文章浏览
技术文章

Linux操作系统关于负载的定义

添加时间:2010-11-21  添加: admin 
 使用uptime或者top命令,都可以看到一个负载的输出,形如load average: 0.00, 0.03, 0.00,这个负载到底是什么东西呢,man文档里只是一笔带过,没有具体的给出负载的定义。

  负载的统计,必然是由内核完成的,因此在内核源码中找答案是再好不过的事情了,找来2.6.21的内核源码,开始探索。

  节选部分源码:

  //kernel/timer.c

  1254 active_tasks = count_active_tasks();

  1256 CALC_LOAD(avenrun[0], EXP_1, active_tasks);

  1257 CALC_LOAD(avenrun[1], EXP_5, active_tasks);

  1258 CALC_LOAD(avenrun[2], EXP_15, active_tasks);

  //include/linux/sched.h

  110 #define FSHIFT 11 /* nr of bits of precision */

  111 #define FIXED_1 (1<

  112 #define LOAD_FREQ (5*HZ) /* 5 sec intervals */

  113 #define EXP_1 1884 /* 1/exp(5sec/1min) as fixed-point */

  114 #define EXP_5 2014 /* 1/exp(5sec/5min) */

  115 #define EXP_15 2037 /* 1/exp(5sec/15min) */

  117 #define CALC_LOAD(load,exp,n)

  118 load *= exp;

  119 load += n*(FIXED_1-exp);

  120 load >>= FSHIFT;

  load(t) = ( load(t-1)*exp(i) + n(t)*(2048-exp(i)) ) / 2048

  load(t-1)为上次计算出的结果

  n(t)为t时刻的活动进程数

  计算方式是累加各个CPU的运行队列中running和uninterruptible的值 再乘以2048

  计算方式如下:

  1946 unsigned long nr_active(void)

  1947 {

  1948 unsigned long i, running = 0, uninterruptible = 0;

  1949

  1950 for_each_online_cpu(i) {

  1951 running += cpu_rq(i)->nr_running;

  1952 uninterruptible += cpu_rq(i)->nr_uninterruptible;

  1953 }

  1954

  1955 if (unlikely((long)uninterruptible < 0))

  1956 uninterruptible = 0;

  1957

  1958 return running + uninterruptible;

  1959 }

  1226 static unsigned long count_active_tasks(void)

  1227 {

  1228 return nr_active() * FIXED_1;

  1229 }

  exp(1) = 1884

  exp(5) = 2014

  exp(15) = 2037

  exp(i) = 2048 * e^(-1/12/i)

  从本质上看负载是完全由过去的一段时间里每个CPU上的活动进程数决定的,但并不是在数值上等同于每秒钟需要进行调度的进程数,具体的计算过程是个比较复杂的过程。

分享到:

顶部 】 【 关闭
版权所有:佛山思海电脑网络有限公司 ©1998-2024 All Rights Reserved.
联系电话:(0757)22630313、22633833
中华人民共和国增值电信业务经营许可证: 粤B1.B2-20030321 备案号:粤B2-20030321-1
网站公安备案编号:44060602000007 交互式栏目专项备案编号:200303DD003  
察察 工商 网安 举报有奖  警警  手机打开网站