在linux上用C++获取CPU的使用率等信息

近期的工作中需要使用到CPU的使用率信息来在CPU的闲时做一些大计算量的工作,例如缩略图的计算,视频文件海报的生成等。怎么得到CPU的使用率信息成了需要解决的一个问题。

得到CPU的使用率最直接的方法就是调用Top命令,然后对Top的输出字符串进行解析,把相应的CPU使用率得出来。但是这里要使用system(), execv()的系统函数来直接调用命令行,这是我所不推荐的。不推荐的原因可以参考这篇文章Why system() is evil, 具体的就不展开了。

所以我们还是采用在代码里直接读取/proc/stat文件并解析里面相应的数据从而得到CPU的使用率。对于/proc/stat文件里所有的数据的解释,我们可以参考Linux Kernel的文档,在Proc里,参考1.8 Miscellaneous kernel statistics in /proc/stat。这里需要注意的有两点:

  1. 文件中所有数据的单位是USER_HZ,这个单位的意思原文是这样说的(typically hundredths of a second),其实就是1/100秒。

  2. 文件中所有的数据代表的意思是从系统启动到现在,各个不同的执行环境一共使用的USER_HZ数。所以这就决定了,只采样一次是没有办法知道相应的CPU使用率的,所以得至少采样2次,取它们的差值除以采样的间隔时间才能得到每秒CPU的使用率。

具体的核心代码如下:

  CPUStat firstStat;
  CPUStat secondeStat;

  if( readCPUStat(firstStat) == -1) {
    return 0;
  }

  sleep(1);

  if( readCPUStat(secondeStat) == -1) {
    return 0;
  }

  unsigned long long totalDiff = secondeStat.getTotal() - firstStat.getTotal();
  unsigned long long idleDiff = secondeStat.idle - firstStat.idle;

  return ((totalDiff - idleDiff) * 1000 / totalDiff  + 5 ) / 10;

注意这里对最后的百分比信息做了四舍五入。

所有的代码可以在我的代码库里找到CPU Usage

Written on April 29, 2015