[VBS]프로세스 CPU 사용률 수집 규칙 - SCOM SystemCenter2010. 10. 4. 15:01
특정 프로세스의 CPU 사용률 수집 규칙 - SCOM
Win32_PerfRawData_PerfProc_Process 클래스를 쿼리해 논리적인 CPU 수로 나눠 계산한다.
SCOM VBS VBScript System Center Operations Manager
' 프로세스 CPU 사용률 수집 규칙
' 규칙 -> 수집 규칙 -> 프로브 기반 -> 스크립트(성능)
' 프로세스가 하나 이상일 경우 #1, #2와 같은 형태로 수집
' 개체: Process
' 카운터: % Processor Time
' 인스턴스: $Data/Property[@Name='ProcessName']$
' 값: $Data/Property[@Name='PerfValue']$
' 대상 프로세스 이름
strProcess = "notepad.exe"
Dim oAPI, oBag
Set oAPI = CreateObject("MOM.ScriptAPI")
If UCASE(RIGHT(strProcess,3)) = "EXE" Then
strProcess = LEFT(strProcess,LEN(strProcess) - 4)
End If
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colPerf = objWMIService.ExecQuery ("Select * from Win32_PerfRawData_PerfProc_Process Where Name = '" & strProcess & "'")
If colPerf.Count = 0 Then
WScript.Quit
End If
ProcessorCount = GetNumProcessors
i = 0
For Each strProcessPerf in colPerf
PerfValue = 0.0
PerfValue = GetCPUPerf(strProcessPerf.IDProcess)
If i > 0 Then
ProcessName = strProcessPerf.Name & "#" & i
Else ProcessName = strProcessPerf.Name
End If
Set propertyBag = oAPI.CreatePropertyBag()
propertyBag.AddValue "ProcessName",ProcessName
propertyBag.AddValue "PerfValue",PerfValue
oAPI.AddItem(propertyBag)
Call oAPI.Return(propertyBag)
i = i + 1
Next
Set colPerf = Nothing
Function GetCPUPerf(PID)
Set WMI_Service = GetObject("winmgmts:{impersonationlevel=impersonate}!\root\cimv2")
Set colItems = WMI_Service.ExecQuery ("Select * from Win32_PerfRawData_PerfProc_Process Where IDProcess = '" & PID & "'" )
For Each CPUPerfQ in colItems
N1 = CPUPerfQ.PercentProcessorTime
D1 = CPUPerfQ.TimeStamp_Sys100NS
Next
WScript.Sleep(1000)
Set colItems = WMI_Service.ExecQuery ("Select * from Win32_PerfRawData_PerfProc_Process Where IDProcess = '" & PID & "'" )
For Each CPUPerfQ in colItems
N2 = CPUPerfQ.PercentProcessorTime
D2 = CPUPerfQ.TimeStamp_Sys100NS
Next
If ( 0 = (D2-D1) ) then
GetCPUPerf = 0
Else
PercentProcessorTime = ((N2 - N1) / (D2 - D1)) * 100
GetCPUPerf = PercentProcessorTime / ProcessorCount
End If
Set WMI_Service = Nothing
End Function
Function RoundDown(Value)
If InStr(Value, ".") Then
RoundDown = Left(Value, InStr(Value, ".") + 3)
Else
RoundDown = Value
End If
End Function
Function GetNumProcessors
Set WMI_Service = GetObject("winmgmts:{impersonationlevel=impersonate}!\root\cimv2")
Set colItems = WMI_Service.ExecQuery ("Select * from Win32_ComputerSystem")
For Each objItem In colItems
On Error Resume Next
GetNumProcessors = objItem.NumberOfLogicalProcessors
If Err.number <> 0 Then
GetNumProcessors = objItem.NumberOfProcessors
End If
On Error GoTo 0
Next
End Function