zoukankan      html  css  js  c++  java
  • AIX 下获取系统CPU及内存的使用情况方法

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

    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 return0;
    47 }

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

  • 相关阅读:
    【题解】Image Perimeters-C++
    【题解】士兵训练-C++
    【题解】丑数Humble Numbers-C++
    【题解】P1638 逛画展-C++
    【题解】P3069 [USACO13JAN]牛的阵容Cow Lineup-C++
    【题解】[Noip2010]机器翻译-C++
    【题解】间隔排列-C++
    【极大化剪枝】Power Hungry Cows-C++【没有用A*!】【超级简单!】
    【题解】跳房子-C++
    C#高级编程第11版
  • 原文地址:https://www.cnblogs.com/syru/p/2122832.html
Copyright © 2011-2022 走看看