AIX 下获取系统CPU及内存的使用情况方法

来源:互联网 时间:1970-01-01

  今天折腾了一下,本意如题,方法如下:

1.使用popen执行相关的命令,然后通过awk进行截取相关的数据。这种方法获取的数据精度不高。

2.访问/proc下的各个进程文件,打开各个文件访问每个进程的信息,然后进行统计计算。此种访求可能会有权限不够。另外,较复杂。具体实现参见Linux top.c 源码实现。

3.调用系统的相关接口API,获取CPU,内存等信息。AIX平台的相关帮助为:http://publib.boulder.ibm.com/infocenter/aix/v6r1/index.jsp?topic=/com.ibm.aix.prftools/doc/prftools/prftools07.htm

其方法一,二代码如下:

@1

#include <stdio.h>#include <string.h>#include <pthread.h>static pthread_mutex_t popen_lock = PTHREAD_MUTEX_INITIALIZER;int get_popen_result(char *cmd,char *result,int size){ char buf[128] ={0}; char *pStr = NULL; FILE* pfile = NULL; int lockRet = -1; int ret = 0; if(cmd == NULL || result == NULL || size <= 0) { return -1; } lockRet = pthread_mutex_trylock(&popen_lock); if(lockRet != 0) { perror("获取popen锁出错"); return -1; } pfile = popen(cmd,"r"); if(pfile == NULL) { perror("popen 出错"); ret = -1; goto exit; } fflush(pfile); if((pStr = fgets(buf,sizeof(buf),pfile)) != NULL) { strncpy(result,buf,size); } pclose(pfile); exit: pthread_mutex_unlock(&popen_lock); return ret;}int get_cpu_mem_used(int *cpuUsed,float *memUsed){ char result[128] = {0}; int memTotal = 0; int memoryUsed = 0; char temp[16] = {0}; char *pPos = NULL; double md = 0; int ret = get_popen_result("vmstat | awk 'NR==7 {print $14}'",result,sizeof(result)); if(ret != -1) { *cpuUsed = atol(result); } ret = get_popen_result("svmon -G | awk 'NR==2 {print $2,$3}'",result,sizeof(result)); if(ret != -1 ) { pPos = strchr(result,32); if(pPos != NULL); { strncpy(temp,result,pPos-result); memTotal = atol(temp); memset(temp,0,sizeof(temp)); strcpy(temp,pPos + 1); memoryUsed = atol(temp); } if(memTotal != 0 && memoryUsed != 0) { *memUsed = ((double)memoryUsed/(double)memTotal)*100; } } return 0;}int main(int argc,char *argv[]){ float memU = 0; int cpuU = 0; int i= 0; for(i= 0 ; i< 100; i++) { get_cpu_mem_used(&cpuU,&memU); printf("cpu Used : %d , mem Used : %f /n", cpuU,memU ); sleep(2); } return 0;}
@2
 1 #include <stdio.h>

2 #include <stdlib.h>

3 #include <unistd.h>

4 #include <libperfstat.h>

5 #include <sys/systemcfg.h>

6

7 int get_perfstat_result(double *cpuUsed,double *memUsed) 8 {
9 perfstat_cpu_total_t cpustat1,cpustat2;
10 perfstat_memory_total_t meminfo;
11 u_longlong_t c1 =0,c2 =0,cpu_delta =0;
12
13 if (!perfstat_cpu_total(NULL, &cpustat1, sizeof(perfstat_cpu_total_t), 1)){
14 perror("perfstat_cpu_total");
15 return -1;
16 }
17 c1 = cpustat1.user + cpustat1.sys + cpustat1.idle + cpustat1.wait;
18 sleep(1);
19
20 if (!perfstat_cpu_total(NULL, &cpustat2, sizeof(perfstat_cpu_total_t), 1)){
21 perror("perfstat_cpu_total");
22 return -1;
23 }
24
25 if(!perfstat_memory_total(NULL, &meminfo, sizeof(perfstat_memory_total_t), 1)){
26 perror("perfstat_memory_total");
27 return -1;
28 }
29 c2 = cpustat2.user + cpustat2.sys + cpustat2.idle + cpustat2.wait;
30 cpu_delta = cpustat2.user + cpustat2.sys - cpustat1.user - cpustat1.sys;
31
32 *cpuUsed = 100.000 * cpu_delta/(c2-c1) ;
33 *memUsed = 100.000 * (meminfo.real_inuse)/(meminfo.real_total) ;
34 printf("CPU used : %6.2f , mem Used : %6.2f /n",*cpuUsed,*memUsed);
35 //printf("Total : %lu ,%lu/n",meminfo.real_total,meminfo.real_free+ meminfo.real_inuse);
36 }
37
38 int main(int argc,char* argv[])
39 {
40 int i=0;
41 double t1 =0.0,t2 = 0.0;
42 for(i=0 ; i< 200 ;i++)
43 {
44 get_perfstat_result(&t1,&t2);
45 }
46 return 0;
47 }

链接时参数为:xlC -q64 -g -o perf perf.c -lperfstat


相关阅读:
Top