当前位置--> 首 页 --> 文 章 -->PHP

※阅读文章※

linux loadavg 算法


作者:biti_rainy [文章出自: www.itpub.net]

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 对移动平均的影响趋向减小。

至于为什么取这个数,涉及到微积分方面的知识了,这样做出的图象更平滑。







文章加入时间: 2004-11-29 16:19:09 责任编辑: sadly   (3943 人次查阅)
 
Copyright © 1998-2004 中国PHP联盟 All rights reserved.