通過/proc/stat文件計算CPU的利用率

nbd2 9年前發布 | 1K 次閱讀 C/C++ CPU

在linux下,CPU利用率分為 用戶態、系統態和空閑態,分別表示CPU處于用戶態執行的時間,系統內核執行的時間,和空閑系統進程執行的時間。

CPU使用率:CPU的使用情況

用戶時間(User time)
表示CPU執行用戶進程的時間,包括nices時間.通常期望用戶空間CPU越高越好

系統時間(System time)
表示CPU在內核運行時間,包括IRQ和softirq時間,系統CPU占用率高,表明系統某部分存在瓶頸.通常值越低越好

等待時間(Waiting time)
CPU在等待I/O操作完成所花費的時間.系統不應該花費大量時間來等待I/O操作,否則就說明I/O存在瓶頸

空閑時間(Idle time)
系統處于空閑期,等待進程運行

Nice 時間(Nice time)
系統調整進程優先級所花費的時間

硬中斷處理時間(Hard Irq time)
系統處理硬中斷所花費的時間

軟中斷處理時間(SoftIrq time)
系統處理軟中斷所花費的時間

丟失時間(Steal time)
被強制等待(involuntary wait) 虛擬CPU的時間,此時hypervisor在為另一個虛擬處理器服務.

經過一天的各種折騰,發現busybox源碼中的procps目錄有top的源碼。通過大致了解到是讀取系統的 /proc/stat 文件,這個文件的說明參考http://blog.csdn.net/u011641885/article/details/46841837

程序源碼:

//gino
//20150712

include <stdio.h>

include <string.h>

int main(){ int m_user,m_nice,m_system,m_idle,m_iowait,m_irq,m_softirq,m_stealstolen,m_guest; char buff[128]={'\0'}; char m_cpu[5]; int all_1,all_2,idle_1,idle_2;

FILE *fp = fopen("/proc/stat", "r");
fgets(buff, 128, fp);

sscanf(buff,"%s%d%d%d%d%d%d%d%d%d",\
                m_cpu,&m_user,&m_nice,&m_system,&m_idle,&m_iowait,\
                &m_irq,&m_softirq,&m_stealstolen,&m_guest);

all_1 = m_user + m_nice + m_system + m_idle + m_iowait + \
                m_irq + m_softirq + m_stealstolen + m_guest;

idle_1 = m_idle;

int m_cpu_1 = m_user + m_nice + m_system;

rewind(fp);
sleep(1);

bzero(buff,128);
fgets(buff, 128, fp);

sscanf(buff,"%s%d%d%d%d%d%d%d%d%d",\
                m_cpu,&m_user,&m_nice,&m_system,&m_idle,&m_iowait,\
                &m_irq,&m_softirq,&m_stealstolen,&m_guest);

all_2 = m_user + m_nice + m_system + m_idle + m_iowait + \
                m_irq + m_softirq + m_stealstolen + m_guest;

idle_2 = m_idle;

int m_cpu_2 = m_user + m_nice + m_system;

/*cpu 總使用率計算公式
    cpu_use_rate = 100 * [(taotal_2 - taotal_1) - (idle_2 - idle_1)] / (cpu_2 - cpu_1)  */
float cpu_use_rate = 100*( (float)(all_2 - all_1) - (float)(idle_2 - idle_1)) / (float)(all_2 - all_1);
printf("%04.2f%%\n",cpu_use_rate);

/*
    cpu 總使用率計算公式
    [(user_2 +sys_2+nice_2) - (user_1 + sys_1+nice_1)]/(total_2 - total_1)*100
*/
cpu_use_rate = (float)(m_cpu_2 - m_cpu_1) / (float)(all_2 - all_1) * 100;
printf("%04.2f%%\n",cpu_use_rate);

/*
    cpu 未使用率計算公式
    (idle2-idle1)/(cpu2-cpu1)*100
*/
cpu_use_rate = ( (float)(idle_2 - idle_1)) / (float)(all_2 - all_1) *100;
printf("%04.2f%%\n",cpu_use_rate);

return 0;

}</pre>

 本文由用戶 nbd2 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!