/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 按照上述方式进行计算即可
参考链接