달력

2

« 2025/2 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

특정 프로세스의 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

:
Posted by 커널64