用Pdh庫獲得CPU利用率

2021-07-06 09:17:59 字數 4156 閱讀 2556

猛然碰到這個問題,在網上找了一些資料,現在綜合一下,希望說的更明白。

一、api介紹:

1、pdhopenquery:獲取效能監視器資料查詢控制代碼(query);

2、pdhaddcounter:新增計數器;

3、pdhcollectquerydata:查詢效能監視器資料;

4、pdhgetformattedcountervalue:獲取指定計數器數值;

可以用pdh(performance data helper)庫提供的一些函式來獲取系統當前的一些效能資料(也可以讀取日誌檔案獲取之前的一些效能資料)。下面以以cpu的利用率為例介紹。

標頭檔案: pdh.h 

(用#include包含)

靜態鏈結庫: pdh.lib  (可以用巨集語句 #pragma comment(lib,"pdh.lib")來載入)

動態連線庫: pdh.dll (可以在主函式內用語句 hmodule hmodule=loadlibraryex("pdh.dll",null,load_library_as_datafile)來載入動態連線庫,用freelibrary(hmodule)語句來釋放動態連線庫)

用pdh庫獲得當前cpu利用率的步驟如下:

1、開啟查詢(query)控制代碼。

hquery hquery; //宣告查詢控制代碼hquery

pdhstatus pdhstatus=pdhopenquery(0,0,&hquery);

2、在查詢中加入計數器(counter)(乙個query中可以加入好幾個counter,本例中之加入了乙個counter)

hcounter* pdhcounter; 

//計數器控制代碼的指標

pdhcounter=(hcounter*)globalalloc(gptr,(sizeof(hcounter)));  //為計數器分配儲存空間

pdhaddcounter(hquery,"\\processor information(_total)\\% processor time",0,pdhcounter);  //向查詢hquery中加入計數器pdhcounter,函式的第二個引數是指定要加入什麼樣的技術器(就是在這裡指定「cpu利用率」計數器),其格式是\\computer\perfobject(parent_instance/instance#index)\counter,其中,computer指定要檢測哪台計算機的效能,可以用ip位址指定網路中一台其他的計算機,本機時可以省略;perfobject指定效能物件,即對哪類物件(可以是處理器(processor information),在其他系統中可能還可以是程序process)進行檢查,instance指定這類物件中的乙個例項(如多個cpu時指定是哪個cpu(或者他們的和total),物件是process是可以指定是哪個程序等等),parent_instance和#index(index是數字,表示第幾個instance)都是在只用instance無法識別是哪個程序時,需要加入的項(instance獨一無二時,他們可以省略),counter指定前面指定的物件上的某個計數器(如processor information物件上有% processor time計數器,% processor time是乙個整體,% 是計數器名字的一部分,要謹記的是%和p之間有乙個空格,少寫這個空格將找不到計數器)

用globalalloc()為pdhcounter分配的儲存空間,當pdhcounter不再使用的時候,要用globalfree(pdhcounter)函式將其釋放。

3、收集query的資料(query中的所有counter的資料都會被收集)

pdhcollectquerydata(hquery);  //特別需要注意的是,用些counter資料(如rate、% processor time)需要collect兩次才能得到,有人遇到獲取的cpu利用率總是0這個問題,那是因為雖然你用了兩個pdhcollectquerydata()兩次(否則會出錯),但這兩條相同的語句是緊挨著的,pdh函式會計算這兩個pdhcollectquerydata()之間這段時間的cpu利用率,所以將如兩條語句緊挨著,那麼這個間隔時間太短,所以得到的資料不太理想,解決辦法是可以在兩條pdhcollectquerydata()語句之間加入一條sleep(50)語句,這樣就可以得到50毫秒這段時間間隔內的cpu利用率,當然也可以加入一些其他的語句。

4、獲得格式化(可以顯示的)資料

pdhcollectquerydata(hquery)函式獲得的資料是原始資料(rawdata),可以用如下方法獲得可顯示的資料

pdh_fmt_countervalue pdh_counter_value;

dword pdh_counter_value_type;

pdhgetformattedcountervalu(*pdhcounter,pdh_fmt_double,&pdh_counter_value_type,&pdh_counter_value);

pdh_counter_value.doublevalue中存的就是要得到的double值(當然,也可以獲得long等其他型別的值)。

5、從query中刪除不用的counter(乙個query中可以加入好幾個counter,本例中其實只加入了乙個counter)

pdhremovecounter(*pdhcounter);  //注意,不用指定是哪個query,因為counter資訊中包含自己屬於哪個query

6、關閉query(這會關閉query並且釋放其中所有的counter及所占用的儲存空間)

pdhclosequery(hquery);

注1:以上某個步驟中的語句不是寫程式中的精確順序,只是從邏輯上寫出了他們的順序

注2:以上介紹的函式,都沒有說個引數的具體含義,這些可以從msdn官網上查,都有的

以下c++程式可以作為參考,在雙核環境下獲得某個cpu核的利用率:

#include

#include

#include

#include

#include

#pragma comment(lib, "pdh.lib")

using namespace std;

void display_error(hmodule hmodule,dword pdhstatu)  //輸出顯示錯誤資訊

error_count=formatmessage(format_message_from_system|format_message_from_hmodule|format_message_allocate_buffer|format_message_ignore_inserts,hmodule,pdhstatu,makelangid(lang_neutral, sublang_default),(lptstr) &p_error_message,0,null);

printf("%s",p_error_message);

localfree(p_error_message);

// freelibrary(hmodule);

}int main()

setprocessaffinitymask(getcurrentprocess(),0x00000001);  //把當前程序設定在某乙個cpu上執行

__try

if(hquery==null)

pcounterhandle=(hcounter*)globalalloc(gptr,sizeof(hcounter));

} __finally }

__try

pdhstatus=pdhcollectquerydata(hquery);

sleep(50);

pdhstatus=pdhcollectquerydata(hquery);

if(pdhstatus!=error_success)

pdhstatus=pdhgetformattedcountervalue(*pcounterhandle,pdh_fmt_double,&pcountervaluetype,&fmtcountervalue);

if(pdhstatus!=error_success)

}__finally

} pdhstatus=pdhremovecounter(*pcounterhandle);

if(pdhstatus!=error_success)

pdhstatus=pdhclosequery(hquery);

if(pdhstatus!=error_success)

freelibrary(hmodule1);

return 0;

}

cpu利用率 CPU利用率錯誤

cpu利用率 cpu利用率是每個人用來衡量處理器效能的指標。netflix的高階效能架構師布倫丹 格雷格 brendan gregg 在第16屆年度南加州linux expo scale 上稱其為 五分鐘公共服務公告 但 cpu卻是一種誤導性的衡量指標,說明處理器的實際繁忙程度。布倫丹在他的閃電演講...

獲得CPU利用率(python呼叫top命令實現

本文定位 想通過python呼叫top命令獲取cpu使用率但暫時沒有思路的情況。如果單純為了獲得cpu的利用率,通過top命令重定向可以輕鬆實現,命令如下 top bi cpuhistory.log 或top bi tee cpuhistory.log 這個就不解釋了,不懂的朋友查詢下top的幫助文...

獲得CPU利用率(python呼叫top命令實現

本文定位 想通過python呼叫top命令獲取cpu使用率但暫時沒有思路的情況。測試環境 centos 6.0 x64 python 2.6 如果單純為了獲得cpu的利用率,通過top命令重定向可以輕鬆實現,命令如下 top bi cpuhistory.log 或top bi tee cpuhist...