天天看点

linux下计算进程cpu使用率和内存使用率的方法

在实际工作当中,有时候需要计算某个进程的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;

继续阅读