linux的top命令分析

最近在用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使用率计算
    1. 请在一段时间内(推荐:必须大于0s,小于等于1s),获取两次cpu时间分配信息。
    2. 计算两次的cpu总时间:total_2 - total_1
    3. 计算两次的cpu剩余时间:idle_2 - idle_1
    4. 计算两次的cpu使用时间:used = (total_2 - total_1) - (idle_2 - idle_1)
    5. cpu使用率 = 使用时间 / 总时间 * 100% = used / total * 100%

为了验证这个说法,我们可以去看一下top命令的源码。源码的链接我发一下吧:

http://www.groupsys.com/top/download.shtml

我拣一些感兴趣的代码说一下吧:

-s 选项明显是使用了默认的时间间隔,也就是Default_DELAY

linux的top命令分析

使用的是异步的通知机制来实现实时更新的

 linux的top命令分析

那么Default_DELAY的值到底是多少呢,在top.local.h中,有这么一行宏定义

#ifndef Default_DELAY
#define Default_DELAY   %delay%
#endif

 有点不太理解这是什么意思,我们继续搜索

linux的top命令分析

重点是搞懂sed -e "s|%delay%|$delay|"  这个命令行的含义

结合“Building Makefile的提示”,大概可以猜测出是在build的时候使用参数$delay替换掉%delay%,完成在命令行模式下直接修改

源文件中的某些内容,那么默认值是多少呢,我们干脆直接搜delay好了

linux的top命令分析

 Wow, 5s,是够长的了,不过也可以通过-d 命令自己去设置这个间隔。

不知道我这么草率的分析有内有什么纰漏,如果有看官乐意指出的话, 不胜感激。