溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Linux中怎么獲取cpu利用率

發(fā)布時(shí)間:2021-07-28 17:57:13 來源:億速云 閱讀:786 作者:Leah 欄目:系統(tǒng)運(yùn)維

今天就跟大家聊聊有關(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è)資訊頻道,感謝大家的支持。

向AI問一下細(xì)節(jié)

免責(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)容。

AI