Linux下如何獲取cpu的利用率
"proc文件系統是一個偽文件系統,它只存在內存當中,而不占用外存空間。它以文件系統的方式為訪問系統內核數據的操作提供接口。用戶和應用程序可以通過proc得到系統的信息,并可以改變內核的某些參數。"
這里將介紹如何從/proc文件系統中獲取與防火墻相關的一些性能參數,以及如何通過/proc文件系統修改內核的相關配置。
1、從/proc文件系統獲取相關的性能參數
cpu使用率: /proc/stat
內存使用情況: /proc/meminfo
網絡負載信息: /proc/net/dev
相應的計算方法:(摘自:什么是proc文件系統,見參考資料)
(1) 處理器使用率
(2) 內存使用率
(3) 流入流出數據包
(4) 整體網絡負載
這些數據分別要從/proc/stat、/proc/net/dev、/proc/meminfo三個文件中提取。如里有問題或對要提取的數據不太清楚,可以使用man proc來查看proc文件系統的聯機手冊。
(1) 處理器使用率
這里要從/proc/stat中提取四個數據:用戶模式(user)、低優先級的用戶模式(nice)、內核模式(system)以及空閑的處理器時間(idle)。它們均位于/proc/stat文件的***行。CPU的利用率使用如下公式來計算。
CPU利用率 = 100 *(user + nice + system)/(user + nice + system + idle)
(2) 內存使用率
這里需要從/proc/meminfo文件中提取兩個數據,當前內存的使用量(cmem)以及內存總量(amem)。
內存使用百分比 = 100 * (cmem / umem)
(3)網絡利用率
為了得到網絡利用率的相關數據,需要從/proc/net/dev文件中獲得兩個數據:從本機輸出的數據包數,流入本機的數據包數。它們都位于這個文件的第四行。
性能收集程序開始記錄下這兩個數據的初始值,以后每次獲得這個值后均減去這個初始值即為從集群啟動開始從本節點通過的數據包。
利用上述數據計算出網絡的平均負載,方法如下:
平均網絡負載 = (輸出的數據包+流入的數據包) / 2
2. 通過/proc文件系統調整相關的內核配置
允許ip轉發 /proc/sys/net/ipv4/ip_forward
禁止ping /proc/sys/net/ipv4/icmp_echo_ignore_all
可以在命令行下直接往上述兩個“文件”里頭寫入"1"來實現相關配置,如果寫入"0"將取消相關配置。不過在系統重啟以后,這些配置將恢復默認設置,所以,如果想讓這些修改生效,可以把下面的配置直接寫入/etc/profile文件,或者其他隨系統啟動而執行的程序文件中。
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
這里計算cpu使用率是有問題的,需要使用上一狀態的值來計算
正確的計算方法是,等上一個時間:
1、記錄某個時刻cpu的使用情況
2、等上一個時間段
3、再記錄此刻的cpu使用情況
4、計算總的時間片
把***次的所有cpu使用情況求和,得到j1
把第二次的所有cpu使用情況求和,得到j2
j2-j1得到這個時間段的所有時間片
即total=j2-j1=第二次的所有列的和-***次的所有列的和
5、計算idle時間
idle對應第五列的數據,用第二次的減去***次的即可
idle=第二次的第五列-***次的第五列
6、計算cpu使用率
rate=(total-idle)/total
在Linux/Unix下,CPU利用率分為用戶態 ,系統態 和空閑態 ,分別表示CPU處于用戶態執行的時間,系統內核執行的時間,和空閑系統進程執行的時間。平時所說的CPU利用率是指:CPU執行非系統空閑進程的時間 / CPU總的執行時間 。
linux c程序獲取cpu使用率及內存使用情況
2009-05-17 23:10
想獲取一下目標機運行時linux系統的硬件占用情況,寫了這幾個小程序,以后直接用了。
方法就是讀取proc下的文件來獲取了。 cpu使用率: /proc/stat ,內存使用情況: /proc/meminfo
看程序 :
- /***************************************************************
- * @file: statusinfo.c
- *
- * @brief: 從linux系統獲取cpu及內存使用情況
- *
- * @version 1.0
- *
- ***************************************************************/
- typedef struct PACKED //定義一個cpu occupy的結構體
- {
- char name[20]; //定義一個char類型的數組名name有20個元素
- unsigned int user; //定義一個無符號的int類型的user
- unsigned int nice; //定義一個無符號的int類型的nice
- unsigned int system;//定義一個無符號的int類型的system
- unsigned int idle; //定義一個無符號的int類型的idle
- }CPU_OCCUPY;
- typedef struct PACKED //定義一個mem occupy的結構體
- {
- char name[20]; //定義一個char類型的數組名name有20個元素
- unsigned long total;
- char name2[20];
- unsigned long free;
- }MEM_OCCUPY;
- get_memoccupy (MEM_OCCUPY *mem) //對無類型get函數含有一個形參結構體類弄的指針O
- {
- FILE *fd;
- int n;
- char buff[256];
- MEM_OCCUPY *m;
- m=mem;
- fd = fopen ("/proc/meminfo", "r");
- fgets (buff, sizeof(buff), fd);
- fgets (buff, sizeof(buff), fd);
- fgets (buff, sizeof(buff), fd);
- fgets (buff, sizeof(buff), fd);
- sscanf (buff, "%s %u %s", m->name, &m->total, m->name2);
- fgets (buff, sizeof(buff), fd); //從fd文件中讀取長度為buff的字符串再存到起始地址為buff這個空間里
- sscanf (buff, "%s %u", m->name2, &m->free, m->name2);
- fclose(fd); //關閉文件fd
- }
- 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);//第二次(用戶+優先級+系統+空閑)的時間再賦給od
- id = (unsigned long) (n->user - o->user); //用戶***次和第二次的時間之差再賦給id
- sd = (unsigned long) (n->system - o->system);//系統***次和第二次的時間之差再賦給sd
- if((nd-od) != 0)
- cpu_use = (int)((sd+id)*10000)/(nd-od); //((用戶+系統)乖100)除(***次和第二次的時間差)再賦給g_cpu_used
- else cpu_use = 0;
- //printf("cpu: %u/n",cpu_use);
- return cpu_use;
- }
- get_cpuoccupy (CPU_OCCUPY *cpust) //對無類型get函數含有一個形參結構體類弄的指針O
- {
- FILE *fd;
- int n;
- char buff[256];
- CPU_OCCUPY *cpu_occupy;
- cpu_occupy=cpust;
- fd = fopen ("/proc/stat", "r");
- fgets (buff, sizeof(buff), fd);
- sscanf (buff, "%s %u %u %u %u", cpu_occupy->name, &cpu_occupy->user, &cpu_occupy->nice,&cpu_occupy->system, &cpu_occupy->idle);
- fclose(fd);
- }
- int main()
- {
- CPU_OCCUPY cpu_stat1;
- CPU_OCCUPY cpu_stat2;
- MEM_OCCUPY mem_stat;
- int cpu;
- //獲取內存
- get_memoccupy ((MEM_OCCUPY *)&mem_stat);
- //***次獲取cpu使用情況
- get_cpuoccupy((CPU_OCCUPY *)&cpu_stat1);
- sleep(10);
- //第二次獲取cpu使用情況
- get_cpuoccupy((CPU_OCCUPY *)&cpu_stat2);
- //計算cpu使用率
- cpu = cal_cpuoccupy ((CPU_OCCUPY *)&cpu_stat1, (CPU_OCCUPY *)&cpu_stat2);
- return 0;
- }