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.csdn.net/jk110333/article/details/8683478 (2) 內存使用率 這裡需要從/proc/meminfo文件中提取兩個數據,當前內存的使用量(cmem)以及內存總量(amem)。 內存使用百分比 = 100 * (cmem / umem) (3)網絡利用率 為了得到網絡利用率的相關數據,需要從/proc/net/dev文件中獲得兩個數據:從本機輸出的數據包數,流入本機的數據包數。它們都位於這個文件的第四行。 性能收集程序開始記錄下這兩個數據的初始值,以後每次獲得這個值後均減去這個初始值即為從集群啟動開始從本節點通過的數據包。 利用上述數據計算出網絡的平均負載,方法如下: 平均網絡負載 = (輸出的數據包+流入的數據包) / 2 通過/proc/net/vlan/eth2.2的獲取函數如下 [cpp] //獲取網速等級 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; }