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