proc文件系统中cpu,内存储器,网络数据使用情况获取(附检测网速源码)
proc文件系统中cpu,内存,网络数据使用情况获取(附检测网速源码)
(1) 处理器使用率
(2) 内存使用率
(3) 流入流出数据包
(4) 整体网络负载
这些数据分别要从/proc/stat、/proc/meminfo、/proc/net/dev三个文件中提取,其实在嵌入式linux中一般都是vlan划分的接口,在/proc/net/vlan/接口名的文件中可以看到具体某一接口的流量。如里有问题或对要提取的数据不太清楚,可以使用man proc来查看proc文件系统的联机手册。
(1) 处理器使用率
这里要从/proc/stat中提取四个数据:用户模式(user)、低优先级的用户模式(nice)、内核模式(system)以及空闲的处理器时间(idle)。它们均位于/proc/stat文件的第一行。CPU的利用率使用如下公式来计算。
CPU利用率 = 100 *(user + nice + system)/(user + nice + system + idle)
CPU利用率 = 100 *(空闲系统时间idle)/(系统总时间所有之和)
我上一个博客中有关于获取cpu使用率的源码的stat文件解释http://blog.****.net/jk110333/article/details/8683478
(2) 内存使用率
这里需要从/proc/meminfo文件中提取两个数据,当前内存的使用量(cmem)以及内存总量(amem)。
内存使用百分比 = 100 * (cmem / umem)
(3)网络利用率
为了得到网络利用率的相关数据,需要从/proc/net/dev文件中获得两个数据:从本机输出的数据包数,流入本机的数据包数。它们都位于这个文件的第四行。
性能收集程序开始记录下这两个数据的初始值,以后每次获得这个值后均减去这个初始值即为从集群启动开始从本节点通过的数据包。
利用上述数据计算出网络的平均负载,方法如下:
平均网络负载 = (输出的数据包+流入的数据包) / 2
通过/proc/net/vlan/eth2.2的获取函数如下
//获取网速等级 long int last_bytes = 0; #define file_name "/proc/net/vlan/eth2.2" #define CHECK_SPEED 5 //检测网速时间间隔 int check_speed_new(void) { FILE *fp; int nl=0,ifl=0; char buf[128]; long int data=0; char ch1[10],ch2[10],ch3[10]; fp = fopen(file_name ,"r"); while(nl < 2) { if( fgets(buf, sizeof(buf), fp) == NULL) return -1; nl++; } if( fgets(buf, sizeof(buf), fp) != NULL) { if (sscanf(buf, "%s%s%s%d",ch1,ch2,ch3,&data) != 4) { fclose(fp); return -1; } } fclose(fp); int bytes ; // printf("data=%d\n",data); bytes = ((data - last_bytes)/1024) / CHECK_SPEED; last_bytes = data; if(bytes > 50 && bytes < 251) return 2; else if(bytes >= 0 && bytes<51) return 1; else if(bytes > 250 && bytes < 500) return 3; else if(bytes > 500) return 4; else return -1; }