免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3652 | 回复: 1
打印 上一主题 下一主题

请教系统负载loadavg是如何计算的 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-10-26 22:50 |只看该作者 |倒序浏览
我们在top查看系统负载情况,1,5,15分钟的负载情况,查看top代码,知道其是读取proc下的/proc/loadavg文件
而又知道内核中设置loadavg文件的代码是(版本2.6.12):

  1. static int loadavg_read_proc(char *page, char **start, off_t off,
  2.                                  int count, int *eof, void *data)
  3. {
  4.         int a, b, c;
  5.         int len;

  6.         a = avenrun[0] + (FIXED_1/200);
  7.         b = avenrun[1] + (FIXED_1/200);
  8.         c = avenrun[2] + (FIXED_1/200);
  9.         len = sprintf(page,"%d.%02d %d.%02d %d.%02d %ld/%d %d\n",
  10.                 LOAD_INT(a), LOAD_FRAC(a),
  11.                 LOAD_INT(b), LOAD_FRAC(b),
  12.                 LOAD_INT(c), LOAD_FRAC(c),
  13.                 nr_running(), nr_threads, last_pid);
  14.         return proc_calc_metrics(page, start, off, count, eof, len);
  15. }
复制代码


另外找到了:

  1. unsigned long avenrun[3];

  2. EXPORT_SYMBOL(avenrun);

  3. /*
  4. * calc_load - given tick count, update the avenrun load estimates.
  5. * This is called while holding a write_lock on xtime_lock.
  6. */
  7. static inline void calc_load(unsigned long ticks)
  8. {
  9.         unsigned long active_tasks; /* fixed-point */
  10.         static int count = LOAD_FREQ;

  11.         count -= ticks;
  12.         if (count < 0) {
  13.                 count += LOAD_FREQ;
  14.                 active_tasks = count_active_tasks();
  15.                 CALC_LOAD(avenrun[0], EXP_1, active_tasks);
  16.                 CALC_LOAD(avenrun[1], EXP_5, active_tasks);
  17.                 CALC_LOAD(avenrun[2], EXP_15, active_tasks);
  18.         }
  19. }
复制代码


哪位大侠能帮忙讲解下,这个负载具体是如何计算出来的吗?
谢谢!

论坛徽章:
0
2 [报告]
发表于 2009-10-27 16:10 |只看该作者
sorry, 我的错,没有先soso一下
找到了,备份下,尽管还是不太明白这个数学公式,:)

http://www.qqread.com/php/e082432101.html

linux loadavg 算法


发表人:biti_rainy



今天读linux source code关于cpu load 的计算方法,同时在google上搜索到处参考,晕乎了半天,终于弄明白cpu load 的计算方法了,并不是简单的移动算术平均。


对于linux来说,采样计算load时间间隔为5秒,这都是在source code里面定义的固定数字,其采样结构通过动态内存文件系统 /proc/loadavg 可以动态的得到适时数据,其他工具的输出,比如 uptime / top/sar 等都是读该内存数据所产生的。我们在这里主要考究kernel的算法。

对于5秒的间隔,是动态地采样cpu状态数据,也就是run queue size ,这包括正在cpu中running的进程数量以及在cpu等待队列里面的进程数量。对于linux来说,实际上会计算1分钟、5分钟、15分钟的移动平均。为此首先我们要介绍linux 里面定义的3个常量:

#define EXP_1 1884 /* 1/exp(5sec/1min) */
#define EXP_5 2014 /* 1/exp(5sec/5min) */
#define EXP_15 2037 /* 1/exp(5sec/15min) */

三个常量分别表示1/5/15分钟的常量,计算方法是:

1884 = 2048/(power(e,(5/(60*1)))) /* e = 2.71828 */

2014 = 2048/(power(e,(5/(60*5))))

2037 = 2048/(power(e,(5/(60*15))))

我们假定前一时刻按常量1884计算的load为 load1(t-1),当前采样run queue size 为 rq1,则当前load1(t) = ((load1(t-1) * 1884) + rq1 * (2048 - 1884))/2048

同理可以5分钟和15分钟移动平均的算法分别为 load5(t) = ((load5(t-1) * 2014) + rq1 * (2048 - 2014))/2048和load_15(t) = ((load15(t-1) * 2037) + rq1 * (2048 - 2037))/2048

由此可以看出,移动平均间隔越大,当前run queue size 对移动平均的影响趋向减小。

至于为什么取这个数,涉及到微积分方面的知识了,这样做出的图象更平滑。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP