/*
写在完成后,查找了很多资料,看到了很多方法,也看了部分top的源码,最终选择了这几种混合的方式来写,可能有更优解,不过目前这样应该够用。
--2020/12/15-- Simon
*/
需求:定期获取CPU,内存,硬盘的使用率。
-
CPU利用率:top /proc/stat
-
内存使用率:top – sysinfo
-
硬盘占用率:df (disk free) 还要想想 – fstatfs/statfs 系统调用
先从 CPU 利用率着手,这三项数据都已经封装了现有的指令中,如果自己写一个应该怎么着手?会有什么差异
从用户态,系统态,空闲态。
平时所说CPU利用率是指:CPU执行非系统空闲进程的时间/CPU总的执行时间即 1-CPU空闲运行时间/总运行时间。
但是这个计算方式并不具备参考意义,因为总CPU时间是机器开机以来的,事实上,为了计算CPU使用率,性能工具都会取间隔一段时间(比如5秒)的两次值,做差后,再计算这段时间的平均CPU使用率。即:
平均CPU使用率 = 1 − 空闲时间 new − 空闲时间 old 总 C P U 时间 new − 总CPU 时间 old \text { 平均CPU使用率 }=1-\frac{\text { 空闲时间 }_{\text {new }}-\text { 空闲时间 }_{\text {old }}}{\text { 总 } C P U \text { 时间 }_{\text {new }}-\text { 总CPU 时间 }_{\text {old }}} 平均CPU使用率 =1− 总 CPU 时间 new − 总CPU 时间 old 空闲时间 new − 空闲时间 old
top参数详解
思考原理,IPbench的cpu_target_lukem插件参照,给程序设置一个极低的优先级,如果有任何计算任务都会打断它,如果没有计算任务,我们的程序就会占用部分CPU时间,程序运行时间上来推算CPU的空闲时间。
还有一种思路就是直接调用本地文件中的信息。
/proc/stat
linux系统的/proc目录是一种伪文件系统(虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以查看有关系统硬件及当前运行进程的信息。可以使用cat指令查看。
想要计算CPU使用率,首先要了解文件 /proc/stat中的内容
cpu以及0123中每行的每个参数意思解释:(以cpu为例)
user(59586):从系统启动开始累积到当前时刻,用户态的CPU时间(单位:jiffies),不包含nice值为负进程。 1jiffies=0.01秒。
nice(120):从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间(单位:jiffies)。
system(264479):从系统启动开始累计到当前时刻,核心时间。(单位:jiffies)。
idle(853271):从系统启动开始累积到当前时刻,除硬盘IO等待时间意外其他等待时间。(单位:jiffies)。
iowait(16057):从系统启动开始累积到当前时刻,硬盘IO等待时间。(单位:jiffies)。
irq(13135):从系统启动开始累积到当前时刻,硬中断时间。(单位:jiffies)。
softirq(14549):从系统启动开始累积到当前时刻,软中断时间。(单位:jiffies)。
#include <stdio.h>
#include <unistd.h>
typedef struct CPU_PACKED //定义一个cpu occupy的结构体
{
char name[20];
unsigned int user;
unsigned int nice;
unsigned int system;
unsigned int idle;
}CPU_OCCUPY;
int cal_cpuoccupy(CPU_OCCUPY *O,CPU_OCCUPY *n)
{
unsigned long od, nd;
unsigned long id, sd;
int cpu_use = 0;
od = (unsigned long)(o->user + o->nice + o->system + o->idle); //第一次(用户+优先级+系统+空闲)的时间再赋给od
nd = (unsigned long)(n->user + n->nice + n->system + n->idle); //第二次(用户+优先级+系统+空闲)的