Linux 下的性能监控的工具有很多,常用的命令有top, mpstat, iostat等,在终端下可以很方便的监视各个性能参数(比如cpu,内存,磁盘等), 但是要在代码中获取这些数据, 用命令就显得不太方便了,不过感兴趣的同学可以去看看源码是怎么实现的.
这里介绍一个跨平台的开源库Sigar,使用Sigar 可以很轻松的获取各个性能数据,我们来试一下.
访问Sigar 在GitHub 上的主页,我们可以将整个项目clone 下来,怎么clone 就不说了,相信这些基本操作大家都会.
接下来就是编译了,参照官网的介绍可以看到sigar 支持的平台还是挺多的,并且C和java 都能用.
以计算CPU 使用率为例,看看如何用sigar 实现.
首先需要定义一个sigar_t 类型的句柄,比如这样:
sigar_t *sigar_cpu;
接着,和大多数开源库一样,用这个句柄去打开某个操作:
sigar_open(&sigar_cpu);
可以定义一个sigar_cpu_list_t用来获取cpu列表,从而得知cpu 的个数:
sigar_cpu_list_t cpu_list;
int status = sigar_cpu_list_get(sigar_cpu,&cpu_list);
if(status != SIGAR_OK)
cout<
int CpuNumber = cpu_list.number;
当然最重要的还是查cpu 的使用率了,这里要用到sigar_cpu_t,其实不管什么平台,获取cpu 使用率一般都是采集前后两个样本来分析,开源库也不例外.
获得前后两次的cpu信息后,就可以利用 sigar_cpu_perc_calculate函数来计算cpu 的使用率了:
sigar_cpu_t cpu_old;
sigar_cpu_t cpu_current;
sigar_cpu_get(sigar_cpu,&cpu_old);
sigar_cpu_perc_t perc;
sleep(1); //这里间隔时间为1s
sigar_cpu_get(sigar_cpu,&cpu_current);
sigar_cpu_perc_calculate(&cpu_old,&cpu_current,&perc);
double CpuTotalUsedRate = perc.combined;
double CpuIdleRate = perc.idle;
cpu_old = cpu_current; //最后更新一下cpu信息
程序的最后需要执行一些清理工作:
sigar_cpu_list_destroy(sigar_cpu,&cpu_list);
sigar_close(sigar_cpu);
看,使用sigar 来获取cpu使用率是不是很方便?
如果对相关函数怎么使用不清楚,可以查看头文件sigar.h的定义,一般来说,使用sigar 获取数据大致就是以上流程.
最后照例附上程序源码:
#include
#include
#include
extern "C"
{
#include
}
using namespace std;
int main(int argc,char **argv)
{
sigar_t *sigar_cpu;
sigar_open(&sigar_cpu);
/*Get cpu list info,such as number...*/
sigar_cpu_list_t cpu_list;
int status = sigar_cpu_list_get(sigar_cpu,&cpu_list);
if(status != SIGAR_OK)
cout<
int CpuNumber = cpu_list.number;
/*Get cpu used rate,idle rate...*/
sigar_cpu_t cpu_old;
sigar_cpu_t cpu_current;
sigar_cpu_get(sigar_cpu,&cpu_old);
sigar_cpu_perc_t perc;
sleep(1);
sigar_cpu_get(sigar_cpu,&cpu_current);
sigar_cpu_perc_calculate(&cpu_old,&cpu_current,&perc);
double CpuTotalUsedRate = perc.combined;
double CpuIdleRate = perc.idle;
cpu_old = cpu_current;
cout<
sigar_cpu_list_destroy(sigar_cpu,&cpu_list);
sigar_close(sigar_cpu);
return 0;
}