在实际工作当中,有时候需要计算某个进程的cpu使用率或者是内存使用率。
下面将介绍一种linux中计算某个指定进程的cpu使用率和内存使用率的方法。
在正式开始之前,先对要使用到的文件和命令进行一下说明。
0. /proc/uptime
该文件中储存了两个数字,第一个数值代表系统总的启动时间,第二个数值则代表系统空闲的时间,单位都是秒。
例如,在我的工作机器上执行结果如下:
$ cat /proc/uptime
5711847.49 3339234.87
$
1. /proc/[pid]/stat
包含了所有CPU活跃的信息,该文件中的所有值都是从系统启动开始累计到当前时刻。
在此只介绍几个和本文相关的参数,其他参数就不一一介绍了,相关介绍网上有很多,请大家自行搜索。
utime:该进程在用户态运行的时间,单位为jiffies
stime:该进程在核心态运行的时间,单位为jiffies
start_time:该进程启动的时间,单位为jiffies
rss:该进程当前驻留物理地址空间的大小,单位是page
例如,在我的工作机器上执行结果如下:
$ cat /proc/1/stat
1 (init) S 0 1 1 0 -1 4202752 2349 1719861150 8 23067 20 3681 34030168 1016826 20 0 1 0 1 2969600 328 4294967295 1 1 0 0 0 0 0 4096 536962595 4294967295 0 0 0 5 0 0 28 0 0
$
2. jiffies
上述描述中,对于时间的计算,用了两种计量单位:秒和jiffies。
对于秒,大家肯定都不陌生,但是jiffies就未必了。jiffies是一个全局变量,用来记录自系统启动以来产生的节拍的总数。
启动时,内核将该变量初始化为0,此后,每次时钟中断处理程序都会增加该变量的值。
一秒内时钟中断的次数等于Hz,所以jiffies一秒内增加的值也就是Hz。
总结起来,jiffies与秒的运算关系为:
second = jiffies / Hz
3. /proc/meminfo
获取系统内存的详细信息。例如,在我的工作机器上执行结果如下:
$ cat /proc/meminfo
MemTotal: 8131024 kB
MemFree: 6895932 kB
Buffers: 502416 kB
Cached: 307764 kB
SwapCached: 4132 kB
...
$
下面言归正传,讲述如何在代码中计算某个进程的cpu使用率和内存使用率
1. 计算指定进程的cpu使用率
①.计算系统的运行时间
cat /proc/uptime,得到系统运行的总时间up_time
②. 计算process的运行时间
cat /proc/[pid]/stat,得到进程运行的总时间total_time和进程的启动时间start_time。
其中,total_time = stime + utime
③.获取系统时钟频率
hz = sysconf(_SC_CLK_TCK);
④.计算cpu使用率
seconds = up - (start_time / hz);//从进程启动到当前的时间,单位为秒
pcpu = (((total_time * 1000ULL) / hz) / seconds);
2. 计算指定进程的内存使用率
①. 获取系统的memsize
cat /proc/meminfo
②.获取进程的page数
cat /proc/[pid]/stat
③.获取系统的page size(单位是Byte)
sysconf(_SC_PAGE_SIZE)
④.计算内存使用率
rss = page_cnt * page_size / 1024;
pmem = (rss * 1000UL) / memsize;