proc檔案系統中cpu,記憶體,網路資料使用情況獲取(附檢測網速原始碼)

siaisjack發表於2013-03-20
(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的獲取函式如下
//獲取網速等級
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; 

}




相關文章