posts - 1,  comments - 20,  trackbacks - 0

          一.   有關(guān)Windows平臺(tái)下CPU使用率的計(jì)算

           

          1. WindowsCPU使用率的定義

          a)         CPU使用率:在任務(wù)管理器的刷新周期內(nèi)CPU忙的時(shí)間與整個(gè)刷新周期的比值。

          b)         任務(wù)管理器默認(rèn)的刷新周期是1s。

           

          2. CPU使用率計(jì)算公式

          根據(jù)CPU使用率的定義我們可以得出在某一段時(shí)間內(nèi)總的CPU使用率的計(jì)算公式:

          sysTime:表示該時(shí)間段內(nèi)總的CPU時(shí)間=CPU處于用戶態(tài)和內(nèi)核態(tài)CPU時(shí)間的總和,即sysTime =kerneTimel + userTime(注:這里并不包括idleTime,因?yàn)楫?dāng)CPU處于空閑狀態(tài)時(shí),實(shí)在內(nèi)核模式下運(yùn)行System Idle Process這個(gè)進(jìn)程,所以kernelTime實(shí)際上已經(jīng)包含了idleTime

          idleTime:表示在該時(shí)間段內(nèi)CPU處于空閑狀態(tài)的時(shí)間;

          CPU% = 1 – idleTime / sysTime * 100      

           

          3. 有關(guān)Cpu時(shí)間信息的獲取方式:

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

           

          涉及到原生API

          說明(有關(guān)這些操作系統(tǒng)的原生API可以通過查詢MSDN來進(jìn)一步了解)

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

          GetSystemInfo

          根據(jù)該方法返回的結(jié)構(gòu)體數(shù)據(jù)結(jié)構(gòu)SystemInfo中的dwNumberOfProcessors可以獲取系統(tǒng)中地CPU個(gè)數(shù)。

          OpenProcess

          通過該方法可以獲取指定進(jìn)程ID的進(jìn)程的句柄。

          GetProcessTimes

          根據(jù)OpenProcess方法回帶的進(jìn)程句柄,可以獲取該進(jìn)程的userTimekernelTime。

          OpenThread

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

          GetThreadTimes

          根據(jù)OpenThread方法回帶的進(jìn)程句柄,可以獲取該線程的userTimekernelTime(注:這里的線程與Java里面的線程示一一對應(yīng)的)。

          GetSystemTimes

          獲取總CPU時(shí)間idleTimekernelTimeuserTime(注:在多核情況下得到的是所有CPU的總和)。

           

          4. Windows平臺(tái)下CPU使用率的測試

          線程級別CPU使用率監(jiān)控

          說明:在一臺(tái)雙CPU的主機(jī)上監(jiān)控一個(gè)包含一個(gè)空循環(huán)子線程的一個(gè)進(jìn)程。其中每一組數(shù)據(jù)的格式為:

                                       進(jìn)程:進(jìn)程CPU使用率

          線程IDCPU使用率

          測試數(shù)據(jù):

          1組數(shù)據(jù):

          進(jìn)程:50[f1] 

             452:0

             3680:50[f2] 

             1712:0

             3620:0

             2860:0

             3000:0

             3800:0

             2112:0

             740:0

             2208:0

          2組數(shù)據(jù):

          進(jìn)程:48

             452:0

             3680:48

             1712:0

             3620:0

             2860:0

             3000:0

             3800:0

             2112:0

             740:0

             2208:0

          3組數(shù)據(jù):

          進(jìn)程:49

             452:0

             3680:49

             1712:0

             3620:0

             2860:0

             3000:0

             3800:0

             2112:0

             740:0

             2208:0

          4組數(shù)據(jù):

          進(jìn)程:50

             452:0

             3680:50

             1712:0

             3620:0

             2860:0

             3000:0

             3800:0

             2112:0

             740:0

             2208:0

          5組數(shù)據(jù):

          進(jìn)程:50

             452:0

             3680:50

             1712:0

             3620:0

             2860:0

             3000:0

             3800:0

             2112:0

             740:0

             2208:0

          6組數(shù)據(jù):

          進(jìn)程:49

             452:0

             3680:49

             1712:0

             3620:0

             2860:0

             3000:0

             3800:0

             2112:0

             740:0

             2208:0

          7組數(shù)據(jù):

          進(jìn)程:48

             452:0

             3680:48

             1712:0

             3620:0

             2860:0

             3000:0

             3800:0

             2112:0

             740:0

             2208:0

          8組數(shù)據(jù):

          進(jìn)程:49

             452:0

             3680:49

             1712:0

             3620:0

             2860:0

             3000:0

             3800:0

             2112:0

             740:0

             2208:0

          9組數(shù)據(jù):

          進(jìn)程:50

             452:0

             3680:50

             1712:0

             3620:0

             2860:0

             3000:0

             3800:0

             2112:0

             740:0

             2208:0

          10組數(shù)據(jù):

          進(jìn)程:48

             452:0

             3680:48

             1712:0

             3620:0

             2860:0

             3000:0

             3800:0

             2112:0

             740:0

             2208:0

          11組數(shù)據(jù):

          進(jìn)程:49

             452:0

             3680:49

             1712:0

             3620:0

             2860:0

             3000:0

             3800:0

             2112:0

             740:0

             2208:0

          12組數(shù)據(jù):

          進(jìn)程:49

             452:0

             3680:49

             1712:0

             3620:0

             2860:0

             3000:0

             3800:0

             2112:0

             740:0

             2208:0

           

          數(shù)據(jù)分析

          1.  監(jiān)控時(shí)所取得采樣周期為1s,因?yàn)檫@個(gè)值與任務(wù)管理器的刷新頻率一致。

          2.  根據(jù)測試用例的的特殊性,被監(jiān)控進(jìn)程的CPU使用率在雙CPU環(huán)境下被監(jiān)控進(jìn)程的CPU使用率的理論值應(yīng)該為50%

          3.  根據(jù)測試用例的的特殊性,被監(jiān)控進(jìn)程的理論上應(yīng)該是包含一個(gè)CPU使用率接近50%,而其他線程的CPU使用率接近0。

          4.  由以上實(shí)際的測試數(shù)據(jù),可以知道被監(jiān)控進(jìn)程的實(shí)際CPU使用率與理論值基本一致

          5.  根據(jù)以上測試數(shù)據(jù),可知進(jìn)程中各線程CPU使用率以及進(jìn)程的CPU用率也符合理論上的分析,都是一個(gè)線程的CPU使用率接近50%,而其他線程的CPU使用率接近0

           

          補(bǔ)充說明:

          1.  有關(guān)總的CPU使用率監(jiān)控,由于采集到的數(shù)據(jù)不具備可比性,所以只能人工的在測試的時(shí)候?qū)Ρ瘸绦虻玫降目偟?/span>CPU使用率和由任務(wù)管理器中得到的CPU使用率。對比的結(jié)論是:基本上與任務(wù)管理器中得到的數(shù)據(jù)一致的。

          2.  同理有關(guān)進(jìn)程CPU使用率的監(jiān)控,也只能人工的通過對比程序得到的進(jìn)程CPU使用率和任務(wù)管理器以及JConsole中的數(shù)據(jù)。對比的結(jié)論是:基本上與任務(wù)管理器和JConsole中得到的數(shù)據(jù)一致的。

          3.  在運(yùn)行Windows平臺(tái)下有關(guān)CPU使用率的監(jiān)控功能,得將Win32CpuTimeUtil.dll這個(gè)動(dòng)態(tài)鏈接庫放到java.library.path目錄之下。其中Win32CpuTimeUtil.dll使用C語言實(shí)現(xiàn)的。

           

          5.參考文獻(xiàn):

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

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


           [f1]由于是在雙CPU的環(huán)境下測試的,所以該進(jìn)程的CPU使用率為50%(按100%計(jì)算的)。

           [f2]3680表示Java線程的NativeThreadID,50表示CPU使用率。

          posted on 2010-04-08 22:57 csgeek? 閱讀(8648) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           

          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          留言簿(1)

          文章檔案(5)

          Personal Website

          搜索

          •  

          最新評論

          主站蜘蛛池模板: 田阳县| 昂仁县| 科尔| 隆化县| 东乡族自治县| 安图县| 广宁县| 喀什市| 九台市| 绍兴市| 桐柏县| 澄迈县| 尼玛县| 延长县| 陇南市| 隆化县| 嵊泗县| 旅游| 宜川县| 湖南省| 涡阳县| 鄂尔多斯市| 呼玛县| 泽州县| 东源县| 松溪县| 牟定县| 秦皇岛市| 安塞县| 蛟河市| 合阳县| 阳泉市| 高要市| 子洲县| 沧源| 宁武县| 舟山市| 石台县| 莱州市| 阳信县| 武汉市|