由于最近要进行一个任务调度的项目,在项目中需要对于集群中运算节点的使用情况进行评估,所以boss就给分配了这样的任务:如何获得全局和单个进程的cpu使用率,内存使用率,硬盘的读写速率,网络的收发速率!这个任务一下来这叫那个头大呀!!对于一个刚刚开始接触linux的我来说简直就是无从下手,于是乎各种google,网上对于这几项指标的获取方法简直是五花八门,有的甚至长篇大论,看得我也是一头雾水!经过来几天的梳理,现将自己的实现的一套方案陈述一下,以供参考!
不知大家在学习linux的工程中对于/proc这个目录有没有注意!简单的说一下/proc这个东西!!/proc 文件系统包含了一些目录(用作组织信息的方式)和虚拟文件。虚拟文件可以向用户呈现内核中的一些信息,也可以用作一种从用户空间向内核发送信息的手段。简单的来说/proc不是一个真实的文件系统,它是系统提供给用户的一些接口,用来配置系统和检测系统的运行状态,说到这里,大家可能就明白了,要解决上面我们提出的获取那几个监控指标的任务,我们
我们是不是可以通过/proc来进行呢?答案是肯定的!
1. cpu的使用率问题!
在/proc目录下有个stat文件,这个文件有什么作用呢!
怎样计算cpu的使用率,这个问题比较简单,cpu使用率=进程使用cpu的时间/cpu总的执行时间!
要计算使用率关键就是要获取这两个时间,在linux系统下,cpu的使用分为用户态,系统态,和空闲态!在linux内核中存在一个全局变量:jiffies。简单来说这就是一个时间单位,该单位的长度随不同的硬件台不同而不同!而stat这个文件中则记载了cpu在各个状态下以jiffies为单位的运行时间,因而我们可以通过读取stat文件中的数据来计算cpu的使用率!
cat /proc/stat
cpu 1061158 11597 327844 19779218 45470 16 2970 0 0 0
cpu0 350174 4822 100807 4813538 34658 15 2674 0 0 0
cpu1 340176 6337 97960 4854660 7572 0 96 0 0 0
cpu2 191603 258 64013 5050340 1079 0 181 0 0 0
cpu3 179203 177 65063 5060679 2159 0 18 0 0 0
.........
该文件的第一列表示的是cpu的名称,本人电脑四核,所以有四个!
第二列user(1061158)表示的系统从启动开始累计到当前时刻,用户态的cpu执行时间(不包括nice)!
第三列nice(11597)低优先级的用户模式!
第四列system(327844)为系统态下的执行时间。
第五列idle(19779218)为cpu的空闲时间。
cpu_rate = user + nice +system / user + nice + system + idle
这样以来问题一下变的明晰起来,我们只需要将该文件中2-4行数据读出,稍加计算就可得出cpu的使用率!
于是有了一下代码:
#include
#include
#include
using namespace std;
void readToVector(vector &dvec,ifstream &in)
{
double temp;
string s;
in>>s;//skip the first string of the line;
//cout< for(int i = 0;i <= 3; i++)
{
in>>temp;
//cout< dvec.push_back(temp);
}
}
double calcCpuRate(vector &dvec)
{
double rate = 0.0;
rate = 100 * (dvec[0] + dvec[1] + dvec[2]) / (dvec[0] + dvec[1] + dvec[2] + dvec[3]);
return rate;
}
int main()
{
vector dvec;
double rate = 0.0;
ifstream in("/proc/stat");
if(!in)
{
cout<<"the file can not be used!!"< }
readToVector(dvec,in);
rate = calcCpuRate(dvec);
cout<<"the cpu rate is:"< return 0;
}
但是这个方法,计算得来的cpu使用率,并非十分精确,用心的读者,可能看出了问题的所在,即:stat中记录的是系统从启动到当前时刻的cpu使用情况,加入系统启动了很长一段时间,但是一直都是空闲的,但是在前几分钟的时间内,比较繁忙,这样计算出来的使用率误差比较大,最好的一个解决办法,就是我们隔一段时间分别读取stat中的数值,通过计算差值的方法,来得到user nice system 和 idle 这四个参数,来计算cpu的使用率!至于时间的选取上,也是值得我们思考的一个问题!
阅读(5201) | 评论(0) | 转发(1) |