计算CPU使用率
来源:互联网 发布:柯尔莫哥洛夫 知乎 编辑:程序博客网 时间:2024/04/27 21:19
<!--[if !supportAnnotations]--><!--[endif]-->
<!--[if !supportLists]-->一. <!--[endif]-->有关Windows平台下CPU使用率的计算
<!--[if !supportLists]-->1. <!--[endif]-->Windows下CPU使用率的定义
<!--[if !supportLists]-->a) <!--[endif]-->CPU使用率:在任务管理器的刷新周期内CPU忙的时间与整个刷新周期的比值。
<!--[if !supportLists]-->b) <!--[endif]-->任务管理器默认的刷新周期是1s。
<!--[if !supportLists]-->2. <!--[endif]-->CPU使用率计算公式
根据CPU使用率的定义我们可以得出在某一段时间内总的CPU使用率的计算公式:
sysTime:表示该时间段内总的CPU时间=CPU处于用户态和内核态CPU时间的总和,即sysTime =kerneTimel + userTime(注:这里并不包括idleTime,因为当CPU处于空闲状态时,实在内核模式下运行System Idle Process这个进程,所以kernelTime实际上已经包含了idleTime);
idleTime:表示在该时间段内CPU处于空闲状态的时间;
CPU% = 1 – idleTime / sysTime * 100
<!--[if !supportLists]-->3. <!--[endif]-->有关Cpu时间信息的获取方式:
基本思想:通过JNI(http://java.sun.com/docs/books/jni/html/jniTOC.html)将底层原生API获取的有关进程、线程、总的CPU时间等信息回传给Java,然后上层再根据采集到数据以及以上的公式计算相关的CPU使用率。
涉及到原生API
说明(有关这些操作系统的原生API可以通过查询MSDN来进一步了解)
http://msdn.microsoft.com/en-us/library/default.aspx
GetSystemInfo
根据该方法返回的结构体数据结构SystemInfo中的dwNumberOfProcessors可以获取系统中地CPU个数。
OpenProcess
通过该方法可以获取指定进程ID的进程的句柄。
GetProcessTimes
根据OpenProcess方法回带的进程句柄,可以获取该进程的userTime和kernelTime。
OpenThread
通过该方法可以获取指定线程ID的线程的句柄。
GetThreadTimes
根据OpenThread方法回带的进程句柄,可以获取该线程的userTime和kernelTime(注:这里的线程与Java里面的线程示一一对应的)。
GetSystemTimes
获取总CPU时间idleTime、kernelTime、userTime(注:在多核情况下得到的是所有CPU的总和)。
<!--[if !supportLists]-->4. <!--[endif]-->Windows平台下CPU使用率的测试
线程级别CPU使用率监控
说明:在一台双CPU的主机上监控一个包含一个空循环子线程的一个进程。其中每一组数据的格式为:
进程:进程CPU使用率
线程ID:CPU使用率
测试数据:
第1组数据:
进程:50<!--[if !supportAnnotations]-->[f1]<!--[endif]-->
452:0
3680:50<!--[if !supportAnnotations]-->[f2]<!--[endif]-->
1712:0
3620:0
2860:0
3000:0
3800:0
2112:0
740:0
2208:0
第2组数据:
进程:48
452:0
3680:48
1712:0
3620:0
2860:0
3000:0
3800:0
2112:0
740:0
2208:0
第3组数据:
进程:49
452:0
3680:49
1712:0
3620:0
2860:0
3000:0
3800:0
2112:0
740:0
2208:0
第4组数据:
进程:50
452:0
3680:50
1712:0
3620:0
2860:0
3000:0
3800:0
2112:0
740:0
2208:0
第5组数据:
进程:50
452:0
3680:50
1712:0
3620:0
2860:0
3000:0
3800:0
2112:0
740:0
2208:0
第6组数据:
进程:49
452:0
3680:49
1712:0
3620:0
2860:0
3000:0
3800:0
2112:0
740:0
2208:0
第7组数据:
进程:48
452:0
3680:48
1712:0
3620:0
2860:0
3000:0
3800:0
2112:0
740:0
2208:0
第8组数据:
进程:49
452:0
3680:49
1712:0
3620:0
2860:0
3000:0
3800:0
2112:0
740:0
2208:0
第9组数据:
进程:50
452:0
3680:50
1712:0
3620:0
2860:0
3000:0
3800:0
2112:0
740:0
2208:0
第10组数据:
进程:48
452:0
3680:48
1712:0
3620:0
2860:0
3000:0
3800:0
2112:0
740:0
2208:0
第11组数据:
进程:49
452:0
3680:49
1712:0
3620:0
2860:0
3000:0
3800:0
2112:0
740:0
2208:0
第12组数据:
进程:49
452:0
3680:49
1712:0
3620:0
2860:0
3000:0
3800:0
2112:0
740:0
2208:0
数据分析:
<!--[if !supportLists]-->1. <!--[endif]-->监控时所取得采样周期为1s,因为这个值与任务管理器的刷新频率一致。
<!--[if !supportLists]-->2. <!--[endif]-->根据测试用例的的特殊性,被监控进程的CPU使用率在双CPU环境下被监控进程的CPU使用率的理论值应该为50%。
<!--[if !supportLists]-->3. <!--[endif]-->根据测试用例的的特殊性,被监控进程的理论上应该是包含一个CPU使用率接近50%,而其他线程的CPU使用率接近0。
<!--[if !supportLists]-->4. <!--[endif]-->由以上实际的测试数据,可以知道被监控进程的实际CPU使用率与理论值基本一致;
<!--[if !supportLists]-->5. <!--[endif]-->根据以上测试数据,可知进程中各线程CPU使用率以及进程的CPU用率也符合理论上的分析,都是一个线程的CPU使用率接近50%,而其他线程的CPU使用率接近0;
补充说明:
<!--[if !supportLists]-->1. <!--[endif]-->有关总的CPU使用率监控,由于采集到的数据不具备可比性,所以只能人工的在测试的时候对比程序得到的总的CPU使用率和由任务管理器中得到的CPU使用率。对比的结论是:基本上与任务管理器中得到的数据一致的。
<!--[if !supportLists]-->2. <!--[endif]-->同理有关进程CPU使用率的监控,也只能人工的通过对比程序得到的进程CPU使用率和任务管理器以及JConsole中的数据。对比的结论是:基本上与任务管理器和JConsole中得到的数据一致的。
<!--[if !supportLists]-->3. <!--[endif]-->在运行Windows平台下有关CPU使用率的监控功能,得将Win32CpuTimeUtil.dll这个动态链接库放到java.library.path目录之下。其中Win32CpuTimeUtil.dll使用C语言实现的。
5.参考文献:
http://blog.csdn.net/JPEXE/archive/2008/12/17/3541270.aspx
http://www.codeproject.com/KB/threads/Get_CPU_Usage.aspx
<!--[endif]-->
<!--[if !supportAnnotations]-->[f1]<!--[endif]-->由于是在双CPU的环境下测试的,所以该进程的CPU使用率为50%(按100%计算的)。
<!--[if !supportAnnotations]-->- 计算cpu使用率
- 计算CPU使用率
- CPU使用率计算
- htop CPU使用率计算
- CPU使用率的计算
- cpu使用率的计算
- Linux计算cpu使用率
- RTT CPU使用率计算
- Perl计算cpu使用率方法
- CPU使用率的计算【总结】
- Linux 手动计算CPU使用率
- java实现计算cpu使用率
- Android 如何计算CPU使用率(CPU Usage)
- Android 如何计算CPU使用率(CPU Usage)
- 计算cpu使用率和判断服务器断开
- Linux平台Cpu使用率的计算
- C++计算windows的cpu使用率
- Linux平台Cpu使用率的计算
- 面试之挺过艰难25题
- Redhat 5.4 Oracle 10g RAC Openfiler+Multipath + RAW+ ASM 安装文档
- linux平台启动关闭oracle数据库
- 求子数组的最大和
- 索引建立全过程(代码)
- 计算CPU使用率
- oracle10g升级后启动失败(ORACLE instance terminated. Disconnection forced)
- 基于GCCAVR的诺基亚5110液晶显示
- 基于GCCAVR的诺基亚5110液晶显示
- 启用内存泄漏检测
- 二叉树建立
- 基于GCCAVR的5110液晶显示设计-效果预览
- Linux 磁盘管理
- HDU 1009 FatMouse' Trade