您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關(guān)Linux中怎么獲取cpu利用率,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
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ī)手冊。
(1) 處理器使用率
這里要從/proc/stat中提取四個(gè)數(shù)據(jù):用戶模式(user)、低優(yōu)先級的用戶模式(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é)點(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)啟動而執(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對應(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è)無符號的int類型的user unsigned int nice; //定義一個(gè)無符號的int類型的nice unsigned int system;//定義一個(gè)無符號的int類型的system unsigned int idle; //定義一個(gè)無符號的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) //對無類型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文件中讀取長度為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)先級+系統(tǒng)+空閑)的時(shí)間再賦給od nd = (unsigned long) (n->user + n->nice + n->system +n->idle);//第二次(用戶+優(yōu)先級+系統(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) //對無類型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; }
看完上述內(nèi)容,你們對Linux中怎么獲取cpu利用率有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。