负载是查看Linux服务器运行状态时很常用的一个性能指标。|你真的了解linux中的负载吗?( 三 )
由于calc_load_tasks是一个长期存在的数据 。 所以在刷新rq里的进程数到其上的时候 , 只需要刷变化的量就行 , 不用全部重算 。 因此上述函数返回的是一个delta 。 2.2定时计算系统平均负载
上一小节中我们找到了系统当前瞬时负载calc_load_tasks变量的更新过程 。 现在我们还缺一个计算过去1分钟、过去5分钟、过去15分钟平均负载的机制 。
传统意义上 , 我们在计算平均数的时候采取的方法都是把过去一段时间的数字都加起来然后平均一下 。 把过去N个时间点的所有瞬时负载都加起来取一个平均数不完事了 。 这其实是我们传统意义上理解的平均数 , 假如有n个数字 , 分别是x1,x2,...,xn 。 那么这个数据集合的平均数就是(x1+x2+...+xn)/N 。
但是如果用这种简单的算法来计算平均负载的话 , 存在以下几个问题:
1.需要存储过去每一个采样周期的数据
假设我们每10毫秒都采集一次 , 那么就需要使用一个比较大的数组将每一次采样的数据全部都存起来 , 那么统计过去15分钟的平均数就得存1500个数据(15分钟*每分钟100次) 。 而且每出现一个新的观察值 , 就要从移动平均中减去一个最早的观察值 , 再加上一个最新的观察值 , 内存数组会频繁地修改和更新 。
2.计算过程较为复杂
计算的时候再把整个数组全加起来 , 再除以样本总数 。 虽然加法很简单 , 但是成百上千个数字的累加仍然很是繁琐 。
3.不能准确表示当前变化趋势传统的平均数计算过程中 , 所有数字的权重是一样的 。 但对于平均负载这种实时应用来说 , 其实越靠近当前时刻的数值权重应该越要大一些才好 。 因为这样能更好反应近期变化的趋势 。
所以 , 在Linux里使用的并不是我们所以为的传统的平均数的计算方法 , 而是采用的一种指数加权移动平均(ExponentialWeightedMovingAverage , EMWA)的平均数计算法 。
这种指数加权移动平均数计算法在深度学习中有很广泛的应用 。 另外股票市场里的EMA均线也是使用的是类似的方法求均值的方法 。 该算法的数学表达式是:a1=a0*factor+a*(1-factor) 。 这个算法想理解起来有点小复杂 , 感兴趣的同学可以Google自行搜索 。
我们只需要知道这种方法在实际计算的时候只需要上一个时间的平均数即可 , 不需要保存所有瞬时负载值 。 另外就是越靠近现在的时间点权重越高 , 能够很好地表示近期变化趋势 。
这其实也是在时间子系统中定时完成的 , 通过一种叫做指数加权移动平均计算的方法 , 计算这三个平均数 。
文章图片
我们来详细看下上图中的执行过程 。 时间子系统将在时钟中断中会注册时钟中断的处理函数为timer_interrupt 。 //file:arch/ia64/kernel/time.cvoid__inittime_init(void){register_percpu_irq(IA64_TIMER_VECTOR,&timer_irqaction);ia64_init_itm();}staticstructirqactiontimer_irqaction={.handler=timer_interrupt,.flags=IRQF_DISABLED|IRQF_IRQPOLL,.name="timer
- 华为mate|华为Mate60Pro概念机:屏幕有大突破,不愧是华为
- 比尔盖茨|盖茨自曝他的主力机是三星Galaxy Z Fold4:李在镕送的
- 微信|黑鲨手机突发暴雷!停薪欠薪背后,据说是自己玩死了自己
- 微信|微信发语音,声音太难听?原来是方法没用对,看完涨知识了
- 爆炸性消息!ChatGPT要被整合进Office里了?一个是AI语言模型中的「当红炸子鸡...|微软又给谷歌「双重暴击」或将加入word、ppt和excel
- 直播|女子直播间买牛肋排到货全是骨头 平台:已对商家停业整顿
- 一加科技|一加11只是玩游戏稳?不凑数旗舰镜头+哈苏影像,过年随手拍大片
- 社交|黑鲨科技CEO遭员工微博讨薪,雷军是公司最终受益人
- |是谁在凌晨两三点,动了女副区长的手机?
- 在近期公布了财报中|育碧对《马里奥疯兔》销量失望:在线游戏才是趋势