Windows平臺下系統的總CPU使用率的計算

1、Windows下系統總的CPU使用率的定義

系統總的CPU使用率:在任務管理器的刷新週期內CPU忙的時間與整個刷新週期的比值。

任務管理器默認的刷新週期是1s。

 

2、系統的總CPU使用率計算公式

根據CPU使用率的定義我們可以得出在某一段時間內總的CPU使用率的計算公式:

sysTime:表示該時間段內總的CPU時間=CPU處於用戶態和內核態CPU時間的總和,即sysTime =kerneTimel + userTime(注:這裏作爲下面公式的分母的sysTime, 並不需要加上idleTime,因爲當CPU處於空閒狀態時,實在內核模式下運行System Idle Process這個進程,所以kernelTime實際上已經包含了idleTime,所以計算公式中的分子要減去idleTime

idleTime:表示在該時間段內CPU處於空閒狀態的時間;

CPU% = 1 – idleTime / sysTime * 100 = (sysTime - idleTime )/ idleTime * 100 = (kerneTimel + userTime - idleTime )/ (kerneTimel + userTime)  * 100  

 

3.有關Cpu時間信息的獲取方式:

基本思想:通過JNI(http://java.sun.com/docs/books/jni/html/jniTOC.html)將底層原生API獲取的有關進程、線程、總的CPU時間等信息回傳給Java,然後上層再根據採集到數據以及以上的公式計算相關的CPU使用率。

 

涉及到原生API

說明(有關這些操作系統的原生API可以通過查詢MSDN來進一步瞭解)

http://msdn.microsoft.com/en-us/library/default.aspx

GetSystemInfo

根據該方法返回的結構體數據結構SystemInfo中的dwNumberOfProcessors可以獲取系統中地CPU個數。

OpenProcess

通過該方法可以獲取指定進程ID的進程的句柄。

GetProcessTimes

根據OpenProcess方法迴帶的進程句柄,可以獲取該進程的userTime和kernelTime。

OpenThread

通過該方法可以獲取指定線程ID的線程的句柄。

GetThreadTimes

根據OpenThread方法迴帶的進程句柄,可以獲取該線程的userTime和kernelTime(注:這裏的線程與Java裏面的線程示一一對應的)。

GetSystemTimes

獲取總CPU時間idleTime、kernelTime、userTime(注:在多核情況下得到的是所有CPU的總和)。

 

4.  Windows平臺下CPU使用率的測試

線程級別CPU使用率監控

說明:在一臺雙CPU的主機上監控一個包含一個空循環子線程的一個進程。其中每一組數據的格式爲:

                             進程:進程CPU使用率

線程ID:CPU使用率

測試數據:

第1組數據:

進程:50<!--[if !supportAnnotations]-->[f1]<!--[endif]-->

   452:0

   3680:50<!--[if !supportAnnotations]-->[f2]<!--[endif]-->

   1712:0

   3620:0

   2860:0

   3000:0

   3800:0

   2112:0

   740:0

   2208:0

第2組數據:

進程:48

   452:0

  3680:48

   1712:0

   3620:0

   2860:0

   3000:0

   3800:0

   2112:0

   740:0

   2208:0

第3組數據:

進程:49

   452:0

  3680:49

   1712:0

   3620:0

   2860:0

   3000:0

   3800:0

   2112:0

   740:0

   2208:0

第4組數據:

進程:50

   452:0

  3680:50

   1712:0

   3620:0

   2860:0

   3000:0

   3800:0

   2112:0

   740:0

   2208:0

第5組數據:

進程:50

   452:0

   3680:50

   1712:0

   3620:0

   2860:0

   3000:0

   3800:0

   2112:0

   740:0

   2208:0

第6組數據:

進程:49

   452:0

  3680:49

   1712:0

   3620:0

   2860:0

   3000:0

   3800:0

   2112:0

   740:0

   2208:0

第7組數據:

進程:48

   452:0

   3680:48

   1712:0

   3620:0

   2860:0

   3000:0

   3800:0

   2112:0

   740:0

   2208:0

第8組數據:

進程:49

   452:0

   3680:49

   1712:0

   3620:0

   2860:0

   3000:0

   3800:0

   2112:0

   740:0

   2208:0

第9組數據:

進程:50

   452:0

   3680:50

   1712:0

   3620:0

   2860:0

   3000:0

   3800:0

   2112:0

   740:0

   2208:0

第10組數據:

進程:48

   452:0

  3680:48

   1712:0

   3620:0

   2860:0

   3000:0

   3800:0

   2112:0

   740:0

   2208:0

第11組數據:

進程:49

   452:0

   3680:49

   1712:0

   3620:0

   2860:0

   3000:0

   3800:0

   2112:0

   740:0

   2208:0

第12組數據:

進程:49

   452:0

   3680:49

   1712:0

   3620:0

   2860:0

   3000:0

   3800:0

   2112:0

   740:0

   2208:0

 

數據分析

<!--[if !supportLists]-->1.  <!--[endif]-->監控時所取得采樣週期爲1s,因爲這個值與任務管理器的刷新頻率一致。

<!--[if !supportLists]-->2.  <!--[endif]-->根據測試用例的的特殊性,被監控進程的CPU使用率在雙CPU環境下被監控進程的CPU使用率的理論值應該爲50%。

<!--[if !supportLists]-->3.  <!--[endif]-->根據測試用例的的特殊性,被監控進程的理論上應該是包含一個CPU使用率接近50%,而其他線程的CPU使用率接近0。

<!--[if !supportLists]-->4.  <!--[endif]-->由以上實際的測試數據,可以知道被監控進程的實際CPU使用率與理論值基本一致;

<!--[if !supportLists]-->5.  <!--[endif]-->根據以上測試數據,可知進程中各線程CPU使用率以及進程的CPU用率也符合理論上的分析,都是一個線程的CPU使用率接近50%,而其他線程的CPU使用率接近0;

 

補充說明:

<!--[if !supportLists]-->1.  <!--[endif]-->有關總的CPU使用率監控,由於採集到的數據不具備可比性,所以只能人工的在測試的時候對比程序得到的總的CPU使用率和由任務管理器中得到的CPU使用率。對比的結論是:基本上與任務管理器中得到的數據一致的。

<!--[if !supportLists]-->2.  <!--[endif]-->同理有關進程CPU使用率的監控,也只能人工的通過對比程序得到的進程CPU使用率和任務管理器以及JConsole中的數據。對比的結論是:基本上與任務管理器和JConsole中得到的數據一致的。

<!--[if !supportLists]-->3.  <!--[endif]-->在運行Windows平臺下有關CPU使用率的監控功能,得將Win32CpuTimeUtil.dll這個動態鏈接庫放到java.library.path目錄之下。其中Win32CpuTimeUtil.dll使用C語言實現的。

 

5.參考文獻:

http://blog.csdn.net/JPEXE/archive/2008/12/17/3541270.aspx

http://www.codeproject.com/KB/threads/Get_CPU_Usage.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章