計算進程的cpu使用率 gnuplot 作圖 cpu使用率曲線示意圖

一,cpu使用率計算代碼:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <net/if.h>
#include <sys/time.h>
#include <sys/param.h>
#include <pthread.h>

pid_t g_nPid = 0;

static double getCpuUse(int nDiffTime)
{
 
     char stat;
     char cName[64] = {0};
     pid_t nPid = getpid();
     char cBuf[64] = {0};
     if(g_nPid > 0)
        sprintf(cBuf,"/proc/%d/stat",g_nPid);
     else
        sprintf(cBuf,"/proc/%d/stat",nPid);
     FILE* fid = fopen(cBuf,"r");
     unsigned long cStat[42] = {0};
     if(fid)
     {
        fscanf(fid,"%lu %s %c %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %ld %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu",
           &cStat[0],cName,&stat,&cStat[3],&cStat[4],&cStat[5],&cStat[6],&cStat[7],
           &cStat[8],&cStat[9],&cStat[10],&cStat[11],&cStat[12],&cStat[13],&cStat[14],&cStat[15],
           &cStat[16],&cStat[17],&cStat[18],&cStat[19],&cStat[20],&cStat[21],&cStat[22],&cStat[23],
           &cStat[24],&cStat[25],&cStat[26],&cStat[27],&cStat[28],&cStat[29],&cStat[30],
           &cStat[31],&cStat[32],&cStat[33],&cStat[34],&cStat[35],&cStat[36],&cStat[37],
           &cStat[38],&cStat[39],&cStat[40],&cStat[41]);

        fclose(fid);
     }
    
     struct timeval curTime;
 
    gettimeofday(&curTime,NULL);
    double lastTime = (double)(curTime.tv_sec * 1000* 1000 + curTime.tv_usec)/1000.0;
     unsigned  long nLastUt = cStat[13];
     unsigned  long nLastSt = cStat[14];
     unsigned  long nLastCut = cStat[15];
     unsigned  long nLastCst = cStat[16];
  
     sleep(nDiffTime);
  
     fid = fopen(cBuf,"r");
     cStat[13] =cStat[14] =cStat[15]= cStat[16]=0;
     if(fid)
     {
        fscanf(fid,"%lu %s %c %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %ld %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu",
           &cStat[0],cName,&stat,&cStat[3],&cStat[4],&cStat[5],&cStat[6],&cStat[7],
           &cStat[8],&cStat[9],&cStat[10],&cStat[11],&cStat[12],&cStat[13],&cStat[14],&cStat[15],
           &cStat[16],&cStat[17],&cStat[18],&cStat[19],&cStat[20],&cStat[21],&cStat[22],&cStat[23],
           &cStat[24],&cStat[25],&cStat[26],&cStat[27],&cStat[28],&cStat[29],&cStat[30],
           &cStat[31],&cStat[32],&cStat[33],&cStat[34],&cStat[35],&cStat[36],&cStat[37],
           &cStat[38],&cStat[39],&cStat[40],&cStat[41]);

        fclose(fid);
     }
    
    unsigned  long nUt = cStat[13];
    unsigned  long nSt = cStat[14];
    unsigned  long nCut = cStat[15];
    unsigned  long nCst = cStat[16];
   
    gettimeofday(&curTime,NULL);
   double thisTime = (curTime.tv_sec * 1000* 1000 + curTime.tv_usec)/1000.0;
  
   double nCpu = (nUt - nLastUt + nSt - nLastSt + nCut - nLastCut + nCst - nLastCst) *1000.0/HZ;
   double dTime = thisTime - lastTime;
//   printf("=============nCpu = %lf========\n", nCpu);
  // printf("=============time = %lf========\n", thisTime - lastTime);
  
   double dCpu = nCpu *100.0/dTime;
   return dCpu;

}

void *show(void *ignored)
{
 while(1)
 {
  //printstats();
  //rf_driver_stat();
  printf("============Current cpu is %lf ============\n", getCpuUse(3));
 // sleep(1);
 }
}

int main(int argc, char* argv[])
{
    if(argc < 2){
        printf("Usage: ./main pid");
        return 1;
    }
 
    int cnt = atoi(argv[1]);
    g_nPid = cnt;
    int i = 0;
   
    pthread_t pid;
    pthread_create(&pid, NULL, show, NULL);
    while(1)
   {
    
      if( i == 10000)
      { 
        i = 0;
         if(g_nPid > 0)
         { 
           sleep(1);
         }
      }
      i++;
   }           
    return 0;
}

 

 

 

 

 

 

二,用gnuplot做曲線圖,纔看某程序修改前後的cup使用率變化圖

 

1, a.plot文件內容:

 

set xrange [0:90]
set term png truecolor size 800, 600
set output "yhl.png"
set datafile separator ' '
set style data lines
set xlabel "numbers"
set ylabel "cpu use"
set title  " cpu use compare"
set grid
plot 'aaa.txt' using 1:2 title "Zero Copy", 'aaa.txt' using 1:3 title "No Zero Copy"

 

2,數據文件內容: aaa.txt

0  17.322859    31.325126
1  14.661999    46.305164
2  14.658394    42.987247
3  15.662239    43.654618
4  16.327951    38.323586
5  13.658867    37.654818
6  15.327519    51.970186
7  27.318290    34.322567
8  19.660762    41.987488
9  26.992343    45.652986
10 26.326743    59.982205
11 25.325668    54.651109
12 26.316438    56.315068
13 26.326989    58.966566
14 25.993095    50.984484
15 26.991624    59.983644
16 26.992820    72.979444
17 47.304840    54.650108
18 27.989690    56.966143
19 26.984664    52.983134
20 27.659558    54.966416
21 26.326085    49.983755
22 24.990437    54.984879
23 24.995134    55.317623
24 26.650614    50.316343
25 26.991857    52.970178
26 25.984228    73.974035
27 44.982817    52.636348
28 26.319139    49.984105
29 25.983336    58.649052
30 26.989789    57.296969
31 25.987058    54.652512
32 26.657550    50.635695
33 26.983621    53.315899
34 26.658944    53.985622
35 27.989989    48.320496
36 26.986372    72.975991
37 42.988021    51.635427
38 24.992694    53.317534
39 24.992028    50.303269
40 28.325431    52.316557
41 26.658820    59.316448
42 26.326252    51.318947
43 24.651457    53.318049
44 25.325693    54.300427
45 26.325506    59.979487
46 25.992220    72.627472
47 42.655548    50.652349
48 26.983756    51.652806
49 26.992550    48.302838
50 26.318490    55.982981
51 26.990248    60.315279
52 25.652583    66.979303
53 24.325784    56.984614
54 25.991847    52.650047
55 25.983968    64.316182
56 26.992046    65.958732
57 43.321463    75.980194
58 24.659441    74.313368
59 25.326369    62.645639
60 25.658046    56.652787
61 26.659247    56.297791
62 25.651267    70.649099
63 26.658571    53.632485
64 25.660004    56.650786
65 25.657866    56.650144
66 26.326225    76.976856
67 41.973724    56.651937
68 25.326132    54.298401
69 25.651472    60.983189
70 25.659140    52.967354
71 27.325409    67.645516
72 26.323181    59.318464
73 24.321473    58.648017
74 25.316953    57.651389
75 26.325269    50.632051
76 26.984646    74.982079
77 45.319390    53.984578
78 26.657799    59.313602
79 24.652804    58.317549
80 25.326495    56.963486
81 26.658180    56.317095
82 27.324753    55.964388
83 25.992869    60.982681
84 26.325646    54.984110
85 25.659636    56.982165
86 26.315860    74.647905
87 43.988622    60.628753
88 23.992306    33.324525

1, 安裝gnuplot後,運行命令: gnuplot a.plot

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章