linux c程序獲取cpu使用率及內(nèi)存使用情況課件_第1頁
linux c程序獲取cpu使用率及內(nèi)存使用情況課件_第2頁
linux c程序獲取cpu使用率及內(nèi)存使用情況課件_第3頁
linux c程序獲取cpu使用率及內(nèi)存使用情況課件_第4頁
linux c程序獲取cpu使用率及內(nèi)存使用情況課件_第5頁
已閱讀5頁,還剩10頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、想獲取一下目標機運行時linux系統(tǒng)的硬件占用情況,寫了這幾個小程序,以后直接用了。方法就是讀取proc下的文件來獲取了。 cpu使用率:    /proc/stat ,內(nèi)存使用情況:      /proc/meminfo看程序 :/*    file:        statusinfo.c*    brief:        從linux系統(tǒng)獲取cpu及

2、內(nèi)存使用情況*    version    1.0*    author        抹黑*    date        2009年3月17日*/typedef struct PACKED         /定義一個cpu occupy的結構體char name20;

3、0;     /定義一個char類型的數(shù)組名name有20個元素unsigned int user; /定義一個無符號的int類型的userunsigned int nice; /定義一個無符號的int類型的niceunsigned int system;/定義一個無符號的int類型的systemunsigned int idle; /定義一個無符號的int類型的idleCPU_OCCUPY;typedef struct PACKED         /定義一個mem occ

4、upy的結構體char name20;      /定義一個char類型的數(shù)組名name有20個元素unsigned long total; char name220;unsigned long free;                       MEM_OCCUPY;get_memoccupy (MEM

5、_OCCUPY *mem) /對無類型get函數(shù)含有一個形參結構體類弄的指針O    FILE *fd;              int n;                 char buff256;       M

6、EM_OCCUPY *m;    m=mem;                                           

7、0;                                                 

8、0;                   fd = fopen ("/proc/meminfo", "r");           fgets (buff, sizeof(buff), fd);     fgets (buff, sizeo

9、f(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(bu

10、ff), fd); /從fd文件中讀取長度為buff的字符串再存到起始地址為buff這個空間里     sscanf (buff, "%s %u", m->name2, &m->free, m->name2);         fclose(fd);     /關閉文件fdint cal_cpuoccupy (CPU_OCCUPY *o, CPU_OCCUPY *n)  

11、      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)

12、+空閑)的時間再賦給od    nd = (unsigned long) (n->user + n->nice + n->system +n->idle);/第二次(用戶+優(yōu)先級+系統(tǒng)+空閑)的時間再賦給od          id = (unsigned long) (n->user - o->user);    /用戶第一次和第二次的時間之差再賦給id    sd = (uns

13、igned long) (n->system - o->system);/系統(tǒng)第一次和第二次的時間之差再賦給sd    if(nd-od) != 0)    cpu_use = (int)(sd+id)*10000)/(nd-od); /(用戶+系統(tǒng))乖100)除(第一次和第二次的時間差)再賦給g_cpu_used    else cpu_use = 0;    /printf("cpu: %un",cpu_use);  &

14、#160; return cpu_use;get_cpuoccupy (CPU_OCCUPY *cpust) /對無類型get函數(shù)含有一個形參結構體類弄的指針O       FILE *fd;             int n;                char

15、 buff256;     CPU_OCCUPY *cpu_occupy;    cpu_occupy=cpust;                                  

16、60;                                                 

17、60;                             fd = fopen ("/proc/stat", "r");     fgets (buff, sizeof(buff), fd);   

18、60;    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()  

19、0; CPU_OCCUPY cpu_stat1;    CPU_OCCUPY cpu_stat2;    MEM_OCCUPY mem_stat;    int cpu;        /獲取內(nèi)存    get_memoccupy (MEM_OCCUPY *)&mem_stat);        /第一次獲取cpu使用情況

20、0;   get_cpuoccupy(CPU_OCCUPY *)&cpu_stat1);    sleep(10);        /第二次獲取cpu使用情況    get_cpuoccupy(CPU_OCCUPY *)&cpu_stat2);        /計算cpu使用率    cpu = cal_cpuoccupy (CPU

21、_OCCUPY *)&cpu_stat1, (CPU_OCCUPY *)&cpu_stat2);        return 0; linux下如何獲取cpu的利用率"proc文件系統(tǒng)是一個偽文件系統(tǒng),它只存在內(nèi)存當中,而不占用外存空間。它以文件系統(tǒng)的方式為訪問系統(tǒng)內(nèi)核數(shù)據(jù)的操作提供接口。用戶和應用程序可以通過proc得到系統(tǒng)的信息,并可以改變內(nèi)核的某些參數(shù)。"這里將介紹如何從/proc文件系統(tǒng)中獲取與防火墻相關的一些性能參數(shù),以及如何通過/proc文件系統(tǒng)修改內(nèi)核的相關配置。&

22、#160;1、從/proc文件系統(tǒng)獲取相關的性能參數(shù) cpu使用率:    /proc/stat 內(nèi)存使用情況:      /proc/meminfo 網(wǎng)絡負載信息:    /proc/net/dev 相應的計算方法:(摘自:什么是proc文件系統(tǒng),見參考資料) (1)   處理器使用率 (2)   內(nèi)存使用率 (3)   流入流出數(shù)據(jù)包 (4)&

23、#160;  整體網(wǎng)絡負載 這些數(shù)據(jù)分別要從/proc/stat、/proc/net/dev、/proc/meminfo三個文件中提取。如里有問題或?qū)σ崛〉臄?shù)據(jù)不太清楚,可以使用man   proc來查看proc文件系統(tǒng)的聯(lián)機手冊。 (1)   處理器使用率 這里要從/proc/stat中提取四個數(shù)據(jù):用戶模式(user)、低優(yōu)先級的用戶模式(nice)、內(nèi)核模式(system)以及空閑的處理器時間(idle)。它們均位于/proc/stat文件的第一行。CPU的利用率使用如下公式來計算。 CPU利用率

24、   =   100   *(user   +   nice   +   system)/(user   +   nice   +   system   +   idle) (2)   內(nèi)存使用率 這里需要從/proc/meminfo文件中提取兩個數(shù)據(jù),當前內(nèi)存的使用量(cmem)以及內(nèi)存總量(am

25、em)。 內(nèi)存使用百分比   =   100   *   (cmem   /   umem) (3)網(wǎng)絡利用率 為了得到網(wǎng)絡利用率的相關數(shù)據(jù),需要從/proc/net/dev文件中獲得兩個數(shù)據(jù):從本機輸出的數(shù)據(jù)包數(shù),流入本機的數(shù)據(jù)包數(shù)。它們都位于這個文件的第四行。 性能收集程序開始記錄下這兩個數(shù)據(jù)的初始值,以后每次獲得這個值后均減去這個初始值即為從集群啟動開始從本節(jié)點通過的數(shù)據(jù)包。 利用上述數(shù)據(jù)計算出網(wǎng)絡的平均負載,方法如下:

26、 平均網(wǎng)絡負載   =   (輸出的數(shù)據(jù)包+流入的數(shù)據(jù)包)   /   2 2. 通過/proc文件系統(tǒng)調(diào)整相關的內(nèi)核配置 允許ip轉發(fā)   /proc/sys/net/ipv4/ip_forward 禁止ping    /proc/sys/net/ipv4/icmp_echo_ignore_all 可以在命令行下直接往上述兩個“文件”里頭寫入"1"來實現(xiàn)相關配置,如果寫入"0"

27、;將取消相關配置。不過在系統(tǒng)重啟以后,這些配置將恢復默認設置,所以,如果想讓這些修改生效,可以把下面的配置直接寫入/etc/profile文件,或者其他隨系統(tǒng)啟動而執(zhí)行的程序文件中。 echo 1 > /proc/sys/net/ipv4/ip_forward echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all 如果需要獲取其他的性能參數(shù),或者需要對內(nèi)核進行更多的配置,可以參考下面鏈接中的proc文件系統(tǒng)介紹,也可以直接通過man proc查看相關的信息。 參考資料和相關鏈接 1 什么是

28、proc文件系統(tǒng)  2 Linux下如何獲取cpu的使用率  3 Exploring the /proc/net/ Directory  4 /proc/net introduction  5 使用ulimit和proc去調(diào)整系統(tǒng)參數(shù) /post/73.htm 注:文件里面是一個增量,每過一個時間間隔對應的項使用了CPU都會有增加,要算百分比,得用上上一次的狀態(tài)值. 這里計算cpu使用率是有問題的,需要使用上一狀態(tài)的值來計算。 返回

29、 elf 發(fā)表于 2007-11-16 09:06  #4 正確的計算方法是,等上一個時間: 1、記錄某個時刻cpu的使用情況 2、等上一個時間段 3、再記錄此刻的cpu使用情況 4、計算總的時間片 把第一次的所有cpu使用情況求和,得到j1 把第二次的所有cpu使用情況求和,得到j2 j2-j1得到這個時間段的所有時間片 即total=j2-j1=第二次的所有列的和-第一次的所有列的和 5、計算idle時間 idle對應第五列的數(shù)據(jù),用第二次的減去第一次的即可&#

30、160;idle=第二次的第五列-第一次的第五列 6、計算cpu使用率 rate=(total-idle)/total 見: 我們在搞性能測試的時候,對后臺服務器的CPU利用率監(jiān)控是一個常用的手段。服務器的CPU利用率高,則表明服務器很繁忙。如果前臺響應時間越來越大,而后臺CPU利用率始終上不去,說明在某個地方有瓶頸了,系統(tǒng)需要調(diào)優(yōu)。這個是即使不懂技術的人都容易理解的事情。 上面理解對嗎?我個人覺得不十分準確。這個要看后臺你測試的進程是什么類型的。如果是計算密集型的進程,當前端壓力越來越大的時候,很容易把CPU利用率打上去。但是如果是I/O網(wǎng)絡

31、密集型的進程,即使客戶端的請求越來越多,但是服務器CPU不一定能上去,這個是你要測試的進程的自然屬性決定的。 什么是CPU利用率呢?在Linux/Unix下,CPU利用率分為用戶態(tài),系統(tǒng)態(tài)和空閑態(tài),分別表示CPU處于用戶態(tài)執(zhí)行的時間,系統(tǒng)內(nèi)核執(zhí)行的時間,和空閑系統(tǒng)進程執(zhí)行的時間。從計算機加電開始,CPU就一直忙個不停,所以CPU的利用率始終是100%。當沒有用戶進程需要執(zhí)行的時候,CPU就執(zhí)行系統(tǒng)缺省的空閑進程。我們所指的CPU利用率是指CPU執(zhí)行非系統(tǒng)空閑進程的時間 / CPU總的執(zhí)行時間。 在Linux的內(nèi)核中,有一個全局變量:Jiffies。 Jiffies代表時間。

32、它的單位隨硬件平臺的不同而不同。系統(tǒng)里定義了一個常數(shù)HZ,代表每秒種最小時間間隔的數(shù)目。這樣jiffies的單位就是 1/HZ。Intel平臺jiffies的單位是1/100秒,這就是系統(tǒng)所能分辨的最小時間間隔了。每個CPU時間片,Jiffies都要加1。 CPU的利用率就是用執(zhí)行用戶態(tài)+系統(tǒng)態(tài)的Jiffies除以總的Jifffies來表示。 在Linux系統(tǒng)中,CPU利用率的計算來源在/proc/stat文件,這個文件的頭幾行記錄了每個CPU的用戶態(tài),系統(tǒng)態(tài),空閑態(tài)等狀態(tài)下的不同的Jiffies,常用的監(jiān)控軟件就是利用/proc/stat里面的這些數(shù)據(jù)來計算CPU的利用率的。

33、60;包含了所有CPU活動的信息,該文件中的所有值都是從系統(tǒng)啟動開始累計到當前時刻。 /proc/stat/ workbuilder $ cat /proc/stat cpu 432661 13295 86656 422145968 171474 233 5346 cpu0 123075 2462 23494 105543694 16586 0 4615 cpu1 111917 4124 23858 105503820 69697 123 371 cpu2 103164 3554 21530 105521167 64032 106 3

34、34 cpu3 94504 3153 17772 105577285 21158 4 24 intr 1065711094 1057275779 92 0 6 6 0 4 0 3527 0 0 0 70 0 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論