[造轮子]Linux下C++获取任意时间段的CPU利用率

一段时间没有更新博客了,主要是因为最近忙一些存储层开发,这里先整理几篇开发过程中的学到一些小技巧吧。

Linux下要查看实时的CPU利用率的top命令,实际上是调用Linux的虚拟文件/proc/stat,命令行下可以使用cat查看

[************** ~]$ cat /proc/stat 
cpu  2749544811 6407103 2572607424 23444711700 11749996 178012 0 
cpu0 305762898 3854902 521786913 6360374688 3417128 45103 0 
cpu1 1078965824 784034 660995090 5453479496 2382351 44404 0 
cpu2 618169277 991073 605434606 5968913986 3102351 44170 0 
cpu3 746646810 777092 784390814 5661943528 2848165 44333 0 
intr 7045336724 3251792549 0 0 119 2 0 0 0 245194 0 0 0 0 0 0 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 172041148 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 424035523 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3197175421 0 0 0 0 0 0 0 46754 0 0 0 0 0 
ctxt 155331126651 
btime 1298359975 
processes 166682880 
procs_running 3 
procs_blocked 0

解释一下命令返回的数据格式:

  • 前5行都是CPU的内核执行周期数,其中第一行统计了所有内核的周期总数,第2-5行则分为不同CPU内核统计(CPU的内核总数决定行数)
  • 前5行的都包含7列,其中第4列是CPU内核空闲的周期数。
  • 所有周期数值都是统计启动操作系统依赖的总数。

(一段时间的)CPU利用率 = (一段时间的)非空闲的周期数 / (一段时间的)总周期数

因此我写了以下CpuMonitor类,使用方法是,创建CpuMonitor对象,先后两次调用Get接口,第二次的返回值,即两次Get时间段内的CPU占用率。

class CpuMonitor { 
public: 
  CpuMonitor() : 
          last_total_(0), 
          last_idle_(0) { 
  }

  virtual ~CpuMonitor() { 
  }

  double Get() { 
    char buf[4096]; 
    double total = 0; 
    double idle = 0; 
    double num = 0; 
    char* buf_ = buf + 3; 
    int fd = open("/proc/stat", O_RDONLY); 
    int len = read(fd, buf, sizeof(buf) - 1); 
    close(fd); 
    buf_[len] = '\0'; 
    total = 0; 
    for (int i = 0; i < 20; i++) { 
      num = strtod(buf_, &buf_); 
      if (num == 0) 
        break; 
      total += num; 
      if (i == 3) 
        idle = num; 
    } 
    double percent = 100 * (1 - (idle - last_idle_) / (total - last_total_)); 
    last_total_ = total; 
    last_idle_ = idle; 
    return percent; 
  }

  double last_total_; 
  double last_idle_; 
};

当然这个类的功能还比较简陋,如果需要可以扩充为返回指定内核或指定进程的CPU占用率,或者内存使用率。

OpenBSD提供了类似的函数,但不属于Posix规范

转载于:https://my.oschina.net/whchsh/blog/135550

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值