[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 使用率是否持續高於特定值一段時間,若有的話則顯示警告對話框
請參考下面的程式,或是也可以到這裡下載參考~
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
; 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
; Free performance counters
_PDH_ProcessObjectDestroy($poCounter)
_PDH_UnInit()
One thought on “[AutoIt] 監視某 process 是否 CPU 使用率過高”
感謝分享,測試OK