[AutoIt] 監視某 process 是否 CPU 使用率過高

[AutoIt] 監視某 process 是否 CPU 使用率過高

最近專案的程式時常發生 CPU 使用率過高的問題,

但發生的時間又不太確定,也不知道觸發的點是什麼時候,

如果常常去看工作管理員的話,蠻沒有效率的,

因此就用 AutoIt 寫了一個小程式來觀察 CPU 使用率是否一直過高,

如果過高的話就顯示一個警告對話框提醒自己注意囉~

 

要讀取某個 process 的 CPU 使用率的話,需要用到 Windows performance counter。

這部分要使用 Windows API 來取得,

但已經有好心人封裝成 AutoIt UDF 給大家使用了~

有興趣的可以先參考 Ascend4nt’s AutoIt Code – PerformanceCounters (PDH) 這篇文章~

 

Step 1: 先取得目標 process id

Step 2: 初始化 performance counters

Step 3: 用 performance counter 蒐集 CPU 使用率資料

Step 4: 檢查 CPU 使用率是否持續高於特定值一段時間,若有的話則顯示警告對話框

 

請參考下面的程式,或是也可以到這裡下載參考~

 

#include <_PDH_ProcessCounters.au3>

Const $CONST_SCRIPT_TITLE           = StringReplace(StringReplace(@ScriptName, “.au3”, “”), “.exe”, “”)
Const $CONST_TARGET_PROCESS_NAME    = “ESClient.exe”
Const $CONST_CPU_USAGE_THRESHOLD    = 10
Const $CONST_CPU_USAGE_HIGH_PERIOD  = 30

; Get process id
Global $g_nProcessPID = ProcessExists($CONST_TARGET_PROCESS_NAME)
If $g_nProcessPID = 0 Then
    MsgBox(0, $CONST_SCRIPT_TITLE, $CONST_TARGET_PROCESS_NAME & ” is not running.”)
    Exit
EndIf

; Initialize performance counters
_PDH_Init()

Local $poCounter = _PDH_ProcessObjectCreate($CONST_TARGET_PROCESS_NAME, $g_nProcessPID)
_PDH_ProcessObjectAddCounters($poCounter,6) ; “% Processor Time”
If @error = 0 And IsArray($poCounter) Then

    _PDH_ProcessObjectCollectQueryData($poCounter)

    Local $nAccuCounter = 0

    ; Check if CPU high problem happen more than 30 seconds
    While True

        Sleep(1000)
        Local $iCounterValue = _PDH_ProcessObjectUpdateCounters($poCounter, 0)
        If @error = 32 Then ExitLoop        ; Process can no longer be found

        If $iCounterValue < $CONST_CPU_USAGE_THRESHOLD Then

            ; CPU usage is below threshold. Reset counter.
            $nAccuCounter = 0

        Else

            ; CPU usage is above threshold. Add counter.
            $nAccuCounter = $nAccuCounter+1

            If $nAccuCounter > $CONST_CPU_USAGE_HIGH_PERIOD Then

                MsgBox(0, $CONST_SCRIPT_TITLE, $CONST_TARGET_PROCESS_NAME & ” CPU usage is above “ & $CONST_CPU_USAGE_THRESHOLD & ” for more than “ & $CONST_CPU_USAGE_HIGH_PERIOD & ” seconds!”)
                ExitLoop

            EndIf

        EndIf

    WEnd

EndIf

; Free performance counters
_PDH_ProcessObjectDestroy($poCounter)
_PDH_UnInit()
 

(本頁面已被瀏覽過 145 次)

發表迴響

你的電子郵件位址並不會被公開。

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料