猛然碰到這個問題,在網上找了一些資料,現在綜合一下,希望說的更明白。
一、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...