博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux下计算进程的CPU占用和内存占用的编程方法[转]
阅读量:5094 次
发布时间:2019-06-13

本文共 5623 字,大约阅读时间需要 18 分钟。

from:

Linux下没有直接可以调用系统函数知道CPU占用和内存占用。那么如何知道CPU和内存信息呢。只有通过proc伪文件系统来实现。

proc伪文件就不介绍了,只说其中4个文件。一个是/proc/stat,/proc/meminfo,/proc/<pid>/status,/proc/<pid>/stat

摘自:

/proc/stat:存放系统的CPU时间信息

该文件包含了所有CPU活动的信息,该文件中的所有值都是从系统启动开始累计到当前时刻。不同内核版本中该文件的格式可能不大一致,以下通过实例来说明数据该文件中各字段的含义。

实例数据:2.6.24-24版本上的

fjzag@fjzag-desktop:~$ cat /proc/stat

cpu 38082 627 27594 893908 12256 581 895 0 0

cpu0 22880 472 16855 430287 10617 576 661 0 0

cpu1 15202 154 10739 463620 1639 4 234 0 0

intr 120053 222 2686 0 1 1 0 5 0 3 0 0 0 47302 0 0 34194 29775 0 5019 845 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

ctxt 1434984

btime 1252028243

processes 8113

procs_running 1

procs_blocked 0

第一行的数值表示的是CPU总的使用情况,所以我们只要用第一行的数字计算就可以了。下表解析第一行各数值的含义:

参数 解析(单位:jiffies)

(jiffies是内核中的一个全局变量,用来记录自系统启动一来产生的节拍数,在linux中,一个节拍大致可理解为操作系统进程调度的最小时间片,不同linux内核可能值有不同,通常在1ms到10ms之间)

user (38082) 从系统启动开始累计到当前时刻,处于用户态的运行时间,不包含 nice值为负进程。

nice (627) 从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间

system (27594) 从系统启动开始累计到当前时刻,处于核心态的运行时间

idle (893908) 从系统启动开始累计到当前时刻,除IO等待时间以外的其它等待时间iowait (12256) 从系统启动开始累计到当前时刻,IO等待时间(since 2.5.41)

irq (581) 从系统启动开始累计到当前时刻,硬中断时间(since 2.6.0-test4)

softirq (895) 从系统启动开始累计到当前时刻,软中断时间(since 2.6.0-test4)stealstolen(0) which is the time spent in other operating systems when running in a virtualized environment(since 2.6.11)

guest(0) which is the time spent running a virtual CPU for guest operating systems under the control of the Linux kernel(since 2.6.24)

结论2:总的cpu时间totalCpuTime = user + nice + system + idle + iowait + irq + softirq + stealstolen + guest

可以利用scanf,sscanf,fscanf读取这些信息,具体可以查man proc.我的程序中只取了前4个。

/proc/meminfo:存放系统的内存信息

[ubuntu@root ~]#cat /proc/meminfo 

MemTotal:        2061616 kB 
MemFree:         1093608 kB 
Buffers:          151140 kB 
Cached:           479372 kB 
SwapCached:            0 kB 
Active:           516964 kB 
Inactive:         374672 kB 
Active(anon):     261412 kB 
Inactive(anon):     5604 kB 
Active(file):     255552 kB 
Inactive(file):   369068 kB

……

别的就不说了,主要看第一个MemTotal,系统总的物理内存,它比真实的物理内存要小一点

/proc/<pid>/status:存放进程的CPU时间信息以及一些综合信息

[ubuntu@root ~]#cat /proc/889/status 

Name:    Xorg 
State:    S (sleeping) 
Tgid:    889 
Pid:    889 
PPid:    881 
TracerPid:    0 
Uid:    0    0    0    0 
Gid:    0    0    0    0 
FDSize:    256 
Groups:    
VmPeak:       99036 kB 
VmSize:       52424 kB 
VmLck:           0 kB 
VmHWM:       57004 kB 
VmRSS:       45508 kB 
VmData:       35668 kB 
VmStk:         136 kB 
VmExe:        1660 kB 
VmLib:        6848 kB 
VmPTE:         120 kB 
VmPeak是占用虚拟内存的峰值,也就是最高的一个值,而且是虚拟内存,所以有时候会比物理内存要大。PS和TOP指令都是利用VmPeak计算内存占用的。

VmRSS是进程所占用的实际物理内存。

/proc/<pid>/stat:保存着进程的CPU信息。

[ubuntu@root ~]#cat /proc/889/stat 

889 (Xorg) S 881 889 889 1031 889 4202752 5307477 0 0 0 34943 12605 0 0 20 0 1 0 8146 89399296 11377 4294967295 134512640 136211844 3221201472 3221200460 5456930 0 0 3149824 1367369423 3223423286 0 0 17 0 0 0 0 0 0

pid=889 进程号

utime=34943 该任务在用户态运行的时间,单位为jiffies

stime=12605 该任务在核心态运行的时间,单位为jiffies

cutime=0 所有已死线程在用户态运行的时间,单位为jiffies

cstime=0 所有已死在核心态运行的时间,单位为jiffies

可以利用scanf,sscanf,fscanf读取这些信息,具体可以查man proc.

结论3:进程的总Cpu时间processCpuTime = utime + stime + cutime + cstime,该值包括其所有线程的cpu时间。


以上这些数据都可以通过文件读取的方式,可以按照一行一行的读取,然后采用scanf,sscanf,fscanf获取信息。

占用内存的计算方法:

pmem = VmRSS / MemTotal * 100;

计算CPU占用的方法:

取一次processCpuTime1和totalCpuTime1;

间隔一段时间;

再取一次processCpuTime2和totalCpuTime2;

pcpu = 100 * (processCpuTime2 – processCpuTime1)/(totalCpuTime2 - totalCpuTime1);


代码

1 get_cpu.h 2  3 #ifdef __cplusplus 4 extern "C"{ 5 #endif 6  7 #define VMRSS_LINE 15//VMRSS所在行 8 #define PROCESS_ITEM 14//进程CPU时间开始的项数 9 10 typedef struct        //声明一个occupy的结构体11 {12         unsigned int user;  //从系统启动开始累计到当前时刻,处于用户态的运行时间,不包含 nice值为负进程。13         unsigned int nice;  //从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间14         unsigned int system;//从系统启动开始累计到当前时刻,处于核心态的运行时间15         unsigned int idle;  //从系统启动开始累计到当前时刻,除IO等待时间以外的其它等待时间iowait (12256) 从系统启动开始累计到当前时刻,IO等待时间(since 2.5.41)16 }total_cpu_occupy_t;17 18 typedef struct19 {20     pid_t pid;//pid号21     unsigned int utime;  //该任务在用户态运行的时间,单位为jiffies22     unsigned int stime;  //该任务在核心态运行的时间,单位为jiffies23     unsigned int cutime;//所有已死线程在用户态运行的时间,单位为jiffies24     unsigned int cstime;  //所有已死在核心态运行的时间,单位为jiffies25 }process_cpu_occupy_t;26 27     int get_phy_mem(const pid_t p);//获取占用物理内存28     int get_total_mem();//获取系统总内存29     unsigned int get_cpu_total_occupy();//获取总的CPU时间30     unsigned int get_cpu_process_occupy(const pid_t p);//获取进程的CPU时间31     const char* get_items(const char* buffer,int ie);//取得缓冲区指定项的起始地址32     33     extern float get_pcpu(pid_t p);//获取进程CPU占用34     extern float get_pmem(pid_t p);//获取进程内存占用35     extern int get_rmem(pid_t p);//获取真实物理内存36     37     38 #ifdef __cplusplus
1 get_cpu.c  2   3 #include 
4 #include
5 #include
//头文件 6 #include
7 #include "get_cpu.h" 8 9 int get_phy_mem(const pid_t p) 10 { 11 char file[64] = {0};//文件名 12 13 FILE *fd; //定义文件指针fd 14 char line_buff[256] = {0}; //读取行的缓冲区 15 sprintf(file,"/proc/%d/status",p);//文件中第11行包含着 16 17 fprintf (stderr, "current pid:%d\n", p); 18 fd = fopen (file, "r"); //以R读的方式打开文件再赋给指针fd 19 20 //获取vmrss:实际物理内存占用 21 int i; 22 char name[32];//存放项目名称 23 int vmrss;//存放内存峰值大小 24 for (i=0;i

 

转载于:https://www.cnblogs.com/the-tops/p/8274442.html

你可能感兴趣的文章
[AHOI 2016初中组]迷宫
查看>>
Hibernate的各种知识
查看>>
登陆远程服务器
查看>>
深入理解计算机系统
查看>>
[置顶]新的博客在简书上!
查看>>
Spark 论文篇-大型集群上的快速和通用数据处理架构(中英双语)
查看>>
rem实例
查看>>
729. My Calendar I
查看>>
HDU 4786 Fibonacci Tree (2013成都1006题) 最小生成树+斐波那契
查看>>
VTK 光照
查看>>
字体样式
查看>>
ajax的封装
查看>>
C字符数组赋值 .
查看>>
JAVA动态加载properties,不需要重启服务器
查看>>
修改系统默认语言
查看>>
转】关于cgi、FastCGI、php-fpm、php-cgi
查看>>
mybatis例子
查看>>
总在做计划。做来做去,又双叒叕做了一个计划!
查看>>
python之面向对象进阶2
查看>>
文件操作中file.seek()方法
查看>>