最近在用top命令查看CPU占用率时,产生了一个疑惑,也就是CPU占用率的计算方式具体是怎样
这是因为我发现,CPU在渲染4K的GUI的动画时,CPU占用率竟然没有占满,而是只有37%,这让我感到很诧异
后来我才明白,其实渲染一帧只花了24ms, 然后有40ms在等待display的vsync信号,也就是说在24ms + 40ms的周期内,只有24ms的时间是占用CPU的
所以CPU占用率是37%也就不奇怪了。
从网上查到,top命令计算CPU占用率的原理为:
主要是读取/proc/stat中的内容
- name 设备名
- user 从系统启动开始累计到当前时刻,处于用户态的运行时间,不包含 nice值为负进程。
- nice 从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间。
- system 从系统启动开始累计到当前时刻,处于核心态的运行时间。
- idle 从系统启动开始累计到当前时刻,除IO等待时间以外的其它等待时间。
- iowait 从系统启动开始累计到当前时刻,IO等待时间。
- irq 从系统启动开始累计到当前时刻,硬中断时间。
- softirq 从系统启动开始累计到当前时刻,软中断时间。
- stealstolen 从系统启动开始累积到当前时刻,在虚拟环境运行时花费在其他操作系统的时间。
- guest 从系统启动开始累积到当前时刻,在Linux内核控制下的操作系统虚拟cpu花费的时间。
- guest_nice 从系统启动开始累积到当前时刻,在Linux内核控制下的操作系统虚拟cpu花费在nice进程上的时间。
- cpu总时间 = user + nice + system + idle + iowait + irq + softirq + stealstolen + guest + guest_nice
- cpu使用率计算
- 请在一段时间内(推荐:必须大于0s,小于等于1s),获取两次cpu时间分配信息。
- 计算两次的cpu总时间:total_2 - total_1
- 计算两次的cpu剩余时间:idle_2 - idle_1
- 计算两次的cpu使用时间:used = (total_2 - total_1) - (idle_2 - idle_1)
- cpu使用率 = 使用时间 / 总时间 * 100% = used / total * 100%
为了验证这个说法,我们可以去看一下top命令的源码。源码的链接我发一下吧:
http://www.groupsys.com/top/download.shtml
我拣一些感兴趣的代码说一下吧:
-s 选项明显是使用了默认的时间间隔,也就是Default_DELAY
使用的是异步的通知机制来实现实时更新的
那么Default_DELAY的值到底是多少呢,在top.local.h中,有这么一行宏定义
#ifndef Default_DELAY
#define Default_DELAY %delay%
#endif
有点不太理解这是什么意思,我们继续搜索
重点是搞懂sed -e "s|%delay%|$delay|" 这个命令行的含义
结合“Building Makefile的提示”,大概可以猜测出是在build的时候使用参数$delay替换掉%delay%,完成在命令行模式下直接修改
源文件中的某些内容,那么默认值是多少呢,我们干脆直接搜delay好了
Wow, 5s,是够长的了,不过也可以通过-d 命令自己去设置这个间隔。
不知道我这么草率的分析有内有什么纰漏,如果有看官乐意指出的话, 不胜感激。