linux C获取CPU使用率

/proc/stat 文件介绍

/proc/stat文件中是内核/系统的统计数据。此文件可能随着体系结构的改变而有变化。常见的信息如下:

gy@gy-PC:~/Desktop$ cat /proc/stat 
name  user   nice system  idle     iowait  irq  softirq  steal guest guest_nice
cpu   687385 674  103362  5359975  106204  0    7588     0     0     0
cpu0  147186 188  26981   1367321  18096   0    5003     0     0     0
cpu1  173954 141  25511   1346960  19442   0    1276     0     0     0
cpu2  182683 135  25562   1309634  47811   0    907      0     0     0
cpu3  183560 210  25306   1336058  20853   0    400      0     0     0
page 5741 1808
swap 1 0
intr 1462898
ctxt 115315
btime 769041601
processes 86031
procs_running 6
procs_blocked 2
softirq 229245889 94 60001584 13619 5175704 2471304 28  51212741 59130143 0 51240672

上述是/proc/stat中的部分信息。cpux后的值都是以USER_HZ为单位的时间量。在大多数架构的CPU上,USER_HZ一般代表都是1/100秒,可以使用sysconf(_SC_CLK_TCK)来获取USER_HZ的确切的值。cpu是指系统,而cpu_n是指指定cpu在不同状态下所耗费的时间。
user(687385):从系统启动开始累计到当前时刻,用户态进程所占用的cpu时间不包含nice值为负的进程

  • nice:(674):从系统启动开始累计到当前时刻,nice值为负的进程所占用的cpu时间不包含
  • system(103362):从系统启动开始累计到当前时刻,系统调度(系统模式)所占用的cpu时间不包含
  • idle(5359975):从系统启动开始累计到当前时刻,除硬盘IO等待时间外的其他等待时间。这个值是USER_HZ乘上/proc/uptime文件中的第二个条目。
  • iowait(5359975):【Linux 2.5.41引入】从系统启动开始累计到当前时刻,IO等待所耗费的cpu时间。这个值是不可靠的,主要原因:
    • 1.CPU不会等待IO完成,iowait是进程等待IO完成所耗费的时间。当CPU由于未完成的IO任务而进入空闲状态时,另外一个任务将在CPU上运行
    • 2.在多核CPU上任务等待IO完成是不再任何一个CPU上运行的。所以每个CPU的iowait是很难计算的。
    • 3.在某些情况下iowait可能会下降
  • irq(0):【Linux 2.6.0引入】从系统启动开始累计到当前时刻,硬中断所耗费的时间
  • softirq(0):【Linux 2.6.0引入】从系统启动开始累计到当前时刻,软中断所耗费的时间
  • steal(0):【Linux 2.6.11引入】从系统启动开始累计到当前时刻,被偷的时间,即在虚拟环境运行时花费在其他操作系统的时间
  • guest(0):【Linux 2.6.24引入】从系统启动开始累计到当前时刻,在linux内核的控制下,使用虚拟CPU来运行其他操作系统的时虚拟CPU所耗费的时间
  • guest_nice(0):【Linux 2.6.24引入】从系统启动开始累计到当前时刻,在linux内核的控制下,运行niced其他操作系统时虚拟CPU所耗费的时间
  • page(in,out):系统从硬盘换入 和换出的页数
  • swap:(in,out)已导入导出的交换页的数量
  • intr(1462898):给出中断信息,第1列值是自系统启动以来,已服务的所有中断的次数;包括未编号的特定于体系结构的中断。然后依次每一列对应一个特定的中断自系统启动以来所发生的次数,未编号的中断不显示,只累计到总数中。
  • ctxt(115315):系统经历的上下文切换的次数
  • btime(769041601):自系统启动到现在的时间
  • process(86031):自系统启动到现在的进程数量
  • procs_running(6):目前处于运行状态的进程
  • procs_blocked(2):目前处于等待IO完成状态的进程
  • softirq:这一行显示了所有CPU的软中断的次数。第一列是所有软中断的总数,后面的每一列是特定软件中断的总数。

CPU利用率:

  • cpu利用率:(idle2-idle1)/(cpu2-cpu1)*100
  • idlex计算方法:[(user_2+sys_2+nice_2)-(user_1+sys_1+nice_1)]/(total_2-total_1)*100;

内存使用率:

  • 算法:(1-剩余可用内存/总内存)x100
  • 相关文件:/proc/meminfo

/proc/meminfo

gy@gy-PC:~/Desktop/sys$ cat /proc/meminfo 
MemTotal:        8038360 kB--------总内存
MemFree:          387384 kB
MemAvailable:    3903828 kB--------剩余可用内存
Buffers:          869580 kB
Cached:          3302792 kB
SwapCached:            0 kB
Active:          5020632 kB
Inactive:        2046832 kB
Active(anon):    2851568 kB
Inactive(anon):   691532 kB
Active(file):    2169064 kB
Inactive(file):  1355300 kB
Unevictable:         320 kB
Mlocked:             320 kB
SwapTotal:      11534332 kB
SwapFree:       11534320 kB
Dirty:              2856 kB
Writeback:             0 kB
AnonPages:       2895236 kB
Mapped:          1101316 kB
Shmem:            688132 kB
Slab:             412944 kB
SReclaimable:     295860 kB
SUnreclaim:       117084 kB
KernelStack:       16720 kB
PageTables:        74320 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:    15553512 kB
Committed_AS:   11247796 kB
VmallocTotal:   34359738367 kB
VmallocUsed:           0 kB
VmallocChunk:          0 kB
HardwareCorrupted:     0 kB
AnonHugePages:      2048 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB
CmaTotal:              0 kB
CmaFree:               0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:      314224 kB
DirectMap2M:     7944192 kB
DirectMap1G:     1048576 kB

代码示例

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "time.h"
#include "unistd.h"

typedef struct _cpuRateInfo{
   char name[32];
   unsigned int user;
   unsigned int nice;
   unsigned int sys;
   unsigned int idle;
}CPURateInfo;

typedef struct _memRateInfo{
   unsigned int total;
   unsigned int free;
   unsigned int avaliable;
}memRateInfo;
int getMemInfo(char *process);
int getCpuInfo(char *file,CPURateInfo * info);
int getProcessPidByName(const char *proc_name);
int main(){

   while(1){
      CPURateInfo info1,info2;
      memset(&info1,0,sizeof(CPURateInfo));
      memset(&info2,0,sizeof(CPURateInfo));
      getCpuInfo("/proc/stat",&info1);
      usleep(300000);
      getCpuInfo("/proc/stat",&info2);
      unsigned int total1=info1.user+info1.sys+info1.nice+info1.idle;   
      unsigned int total2=info2.user+info2.sys+info2.nice+info2.idle;
      unsigned int cha = (total2-info2.idle) -(total1-info1.idle);
      float shang = (cha*1.0)/(total2-total1);
      unsigned int rate = (unsigned int)(100.0*shang);
      printf("CPU_Usage:%u\%\n",rate>=100?100:rate+1);

      getMemInfo(NULL);
      sleep(5);
      system("clear");
   }
    
   
   return 0;
}


int getCpuInfo(char *file,CPURateInfo * info){
  FILE * fp=NULL;
  fp=fopen(file,"r");
  if(fp == NULL){
      printf("open %s fail\n",file);
      return -1;
  }else{
     char data[1024]={'\0'};
     fgets(data,1024,fp);
     sscanf(data,"%s %u %u %u %u",info->name,&info->user,&info->nice,&info->sys,&info->idle);
     fclose(fp);
  }
  return 0;
}

int getMemInfo(char *process){
  
  memRateInfo info;
  int pid=-1;
  char fname[512]={'\0'};
  if(process== NULL)
      sprintf(fname,"%s","/proc/meminfo");
  else{
     pid =getProcessPidByName(process);
     if(pid != -1){
       sprintf(fname,"/proc/%d/statm",pid);
     }else{
       sprintf(fname,"FAIL");
     }
  }
  FILE * fp=NULL;
  if(strlen(fname)>5){
      fp=fopen(fname,"r");
      if(fp == NULL){
          printf("open %s fail\n",fname);
          return -1;
      }else{
        char data[1024]={'\0'};
        if(process == NULL){
          fgets(data,1024,fp);
          char name[128]={'\0'};
          char unit[128]={'\0'};
          sscanf(data,"%s %u %s",name,&info.total,unit);
          fgets(data,1024,fp);
          sscanf(data,"%s %u %s",name,&info.free,unit);
          fgets(data,1024,fp);
          sscanf(data,"%s %u %s",name,&info.avaliable,unit);
          info.free = info.free/1024;
          info.avaliable = info.avaliable/1024;
          info.total = info.total/1024;
        printf("MEM_Usage:%u\%\tDetail:free:%uMB  avaliable:%uMB  total:%uMB \n",(unsigned int)((100.0)*(1-(1.0*info.avaliable)/info.total)),info.free,info.avaliable,info.total); 
        }else{
          int size,VmRss;
          fgets(data,1024,fp);
          sscanf(data,"%u %u",&size,&VmRss);
          printf("%s:\t%dMB\n",process,VmRss*4/1024);
        }
        fclose(fp);
      }
  }

  return 0;
}


int getProcessPidByName(const char *proc_name){
      FILE *fp;
      char buf[100];
      char cmd[200] = {'\0'};
      int pid = -1;
      sprintf(cmd, "pidof %s", proc_name);
      if((fp = popen(cmd, "r")) != NULL)
      {
          if(fgets(buf, 255, fp) != NULL)
          {
              pid = atoi(buf);
          }
      }
      pclose(fp);
      return pid;
 }

某个进程的CPU使用率和内存使用率

只需查看/proc/进程id/meminfo , /proc/进程id/stat 按照上述方式进行计算即可
参考链接

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值