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