eCos系统CPU负载测量
原文:http://ecos.sourceware.org/docs-latest/ref/services-cpuload.html
译文:http://blog.csdn.net/zoomdy/article/details/17078995
mingdu.zheng <at> gmail <dot> com
cpuload组件包提供了一种估算CPU负载的方式。它可以估算最近0.1秒、1秒和10秒内的CPU负载百分比。
负载测量API
首先,必须在被测目标机上对测量算法进行校准,一旦校准完成后就可以开始测量。测量是一个连续过程,因此总是提供最近的测量数据,测量过程可以根据需要随时停止。一旦开始测量过程,就可以获取测量结果。
需要注意的是:如果目标机或CPU执行任何节能措施,例如降低时钟频率或者挂起CPU等,这些节能措施将干扰CPU负载测量,在这种情况下,测量结果是未定义的。Synthetic Target就是这样的情况之一。阅读本文后续实现细节章节可以了解更多。
『译注』Cortex-M架构的默认实现会在执行空闲任务时挂起CPU,因此默认情况下,测量结果并非是实际的CPU负载,需要重定义HAL_IDLE_THREAD_ACTION宏取消空闲时挂起,HAL_IDLE_THREAD_ACTION宏的默认实现位于hal/cortexm/arch/<version>/include/hal_arch.h:336。
负载测量不支持SMP系统,仅支持单CPU系统。
负载测量API可以在cyg/cpuload/cpuload.h中找到。
『译注』源代码位于services/cpuload/。
cyg_cpuload_calibrate
这个函数用来校准CPU负载测量算法。它执行一次特别的测量过程确定空闲时的CPU性能。
void cyg_cpuload_calibrate(cyg_uint32* calibration);
该函数通过calibration指针返回校准值。
这个函数是非常特别的,为了获得正确的校准结果需要满足若干条件。该函数使用了2个最高线程优先级,当该函数被使用时,其它线程不能使用这两个优先级。调用该函数时,内核调度器必须已经启动而且调度器未加锁。该函数将花费0.1秒的时间完成校准操作,在这0.1秒校准期间不能有任何其它线程执行。
『译注』这个函数使用了线程优先级1和2,为了获得正确的测量结果,其它线程不能使用优先级1和2。eCos的最高线程优先级是0,如果有优先级为0的线程,必须保证在校准过程该线程处于挂起状态,否则校准过程可能被优先级为0的线程抢占而导致错误的校准结果。
『译注』该函数将会创建一个线程,线程堆栈大小为CYGNUM_HAL_STACK_SIZE_MINIMUM,在Cortex-M架构下约1.5KB,该线程仅在校准过程执行一次,随后被删除永远都不会再执行,如果目标机内存非常有限,应当知晓CPU负载测量校准时使用了1.5KB的堆栈空间。
cyg_cpuload_create
这个函数启动CPU负载测量。
void cyg_cpuload_create(cyg_cpuload_t* cpuload,
cyg_uint32 calibrate,
cyg_handle_t* handle);
调用该函数启动测量过程,handle返回操作句柄,通过该句柄可以读取测量结果以及停止测量过程。
cyg_cpuload_delete
这个函数停止CPU负载测量。
void cyg_cpuload_delete(cyg_handle_t handle);
handle必须是cyg_cpuload_create函数返回的操作句柄。
cyg_cpuload_get
这个函数返回最近的测量结果。
void cyg_cpuload_get(cyg_handle_t handle,
cyg_uint32* average_point1s,
cyg_uint32* average_1s,
cyg_uint32* average_10s);
handle必须是cyg_cpuload_create函数返回的操作句柄。最近0.1秒、1秒和10秒的负载测量结果通过average_point1s、average_1s和average_10s返回。
实现细节
这一节给出一些测量过程的实现细节,这些细节可以帮助我们理解测量结果的意义。
当没有其它线程可以执行时,eCos将执行空闲线程,空闲线程总是可执行的而且使用最低线程优先级。空闲线程只做一点点事情,它有一个永远都不会退出的循环,每次循环将idle_thread_loops变量加1,然后调用HAL_IDLE_THREAD_ACTION宏。CPU负载测量算法就是使用了idle_thread_loops变量,测量算法周期性地检查idle_thread_loops变量,并记录前后两次检查的差值,系统越空这个差值就越大,通过这个简单的手段就可以确定系统的负载。
cyg_cpuload_calibrate函数执行空闲任务0.1秒,从而确定系统空闲0.1秒的时间内idle_thread_loops会被累加多少次。cyg_cpuload_create函数启动一个闹钟,这个闹钟每隔0.1秒调用回调函数,回调函数计算idle_thread_loops从上次检查到本次检查的差值,然后根据这个差值以及校准值计算出CPU负载。回调函数用新的计算结果更新cyg_cpuload结构,0.1秒负载只是简单地复制最近的测量结果,然后通过一个简单的滤波计算1秒和10秒负载。由于舍入误差的存在,即使系统满负载,1秒和10秒测量值也永远都不会达到100%,通常看到的是99%。
如前所述,电源管理代码将干扰上述测量结果。CPU负载测量的基本假设是:空闲线程可以无障碍地运行,而且运行条件与校准时的运行条件保持一致。如果降低CPU时钟频率,那么空闲线程的计数器累加速率将变慢,因此CPU负载测量结果值将偏高,如果CPU被完全挂起,那么CPU负载测量结果将是100%。
eCos系统CPU负载测量的更多相关文章
- 一个快速检测系统CPU负载的小程序
原理说明 在对服务器进行维护时,有时也遇到由于系统 CPU(利用率)负载过高导致业务中断的情况.服务器上可能运行多个进程,查看单个进程的 CPU 都是正常的,但是整个系统的 CPU 负载可能是异常的. ...
- Linux系统排查2——CPU负载篇
本随笔介绍CPU负载的排查手段. 查看系统负载的工具:uptime,w,都能查看系统负载,系统平均负载是处于运行或不可打扰状态的进程的平均数, 可运行:运行态,占用CPU,或就绪态,等待CPU调度. ...
- Linux系统排查——CPU负载篇
本随笔介绍CPU负载的排查手段. 查看系统负载的工具:uptime,w,都能查看系统负载,系统平均负载是处于运行或不可打扰状态的进程的平均数, 可运行:运行态,占用CPU,或就绪态,等待CPU调度. ...
- linux 系统的负载与CPU、内存、硬盘、用户数监控脚本[marked]
转载文章 原始出处 在没有nagios监控的情况下,只要服务器能上互联网,就可通过发邮件的方式来提醒管理员系统资源的使用情况. 一.编写linux系统告警邮件脚本 # vim /scripts/sy ...
- Linux系统的负载与CPU、内存、硬盘、用户数监控的shell脚本
利用Shell脚本来监控Linux系统的负载.CPU.内存.硬盘.用户登录数. 这几天在学习研究shell脚本,写的一些系统负载.CPU.内存.硬盘.用户数监控脚本程序.在没有nagios监控的情况下 ...
- 浅谈Linux下CPU利用率和CPU负载【转】
转自:https://blog.csdn.net/Alisa_xf/article/details/71430406 在Linux/Unix下,CPU利用率(CPU utilization)分为用户态 ...
- centOs 查看系统cpu使用率等--top
原文:centOs 查看系统cpu使用率等--top 在系统维护的过程中,随时可能有需要查看 CPU 使用率,并根据相应信息分析系统状况的需要.在 CentOS 中,可以通过 top 命令来查看 CP ...
- LINUX 查看当前系统的负载情况
uptime linux uptime命令主要用于获取主机运行时间和查询linux系统负载等信息. eg: # uptime 02:03:50 up 126 days, 12:57, 2 users, ...
- Linux CPU负载
昨天查看Nagios警报信息,发现其中一台服务器CPU负载过重,机器为CentOS系统.信息如下: 2011-2-15 (星期二) 17:50 WARNING - load average: 9.73 ...
随机推荐
- 常用sql笔记
Student(S#,Sname,Sage,Ssex) 学生表Course(C#,Cname,T#) 课程表SC(S#,C#,score) 成绩表Teacher(T#,Tname) 教师表问题:1.查 ...
- opencart 百度登录和百度钱包支付插件 响应式适应pc/mobile
OpenCart(http://www.opencart.com/,http://www.opencartchina.com/)是国外著名的开源电子商务系统, 优势在于前台界面的设计非常适合欧美购物者 ...
- jquery前端性能优化(持续添加。。。)
1.选择器的使用 (1)$('#id') 使用id来定位dom元素是性能最高的方法.jQuery底层将直接调用本地方法document.getElementById().如果id直接可以找到所要对 ...
- url、base64 编码规则
UrlEncode 相关: URI所允许的字符分作保留与未保留. 保留字符是那些具有特殊含义的字符. 例如, 斜线字符用于URL (或者更一般的, URI)不同部分的分界符. 未保留字符没有这些特殊含 ...
- iOS中默认样式修改-b
项目中有大量的UITableView都需要显示sectionHeader.iOS中默认sessionHeader上的textLabel样式跟设计图不符. 按照我们之前的解决方案,是在每个UITable ...
- 随着visual studio 2013 发布.带来的一些变化
1.asp.net a.在2013中, asp.net走向了统一.使用不同的asp.net 框架搭(web forms ,api, mvc )建混合应用 b.身份验证 无身份验证 个人用户账户 (窗体 ...
- windows server 2003 服务器
服务器基本知识:可通过我的电脑属性里面查看服务器的系统. 设置固定Ip:本地连接(控制面板-网络连接)使用下面的Ip地址.通过ipconfig/all,查看DNS和ip. 远程访问服务器:我的电脑属性 ...
- TCP连接建立和关闭中的疑难点
TCP连接建立和关闭中的疑难点 作者:夏语岚 撰写日期:2011-10-29 近日在阅读<Unix网络编程>,以前在<计算机网络>课程中学到TCP,当时只是简单了解了TC ...
- Java学习IO篇
来吧,同志们,为复习网络编程做准备-- 一.理论准备 流是个抽象的概念,是对输入输出设备的抽象,Java程序中,对于数据的输入/输出操作都是以"流" ...
- Android 正则表达式匹配汉字中文
关于中文的正则表达式, 应该是^[\\u4E00-\\u9FFF]+$, 和论坛里常被人提起的^[\\u4E00-\\u9FA5]+$很接近需要注意的是论坛里说的^[\\u4E00-\\u9FA5]+ ...