서버 프로그래머는 CPU와 메모리 사용량에 많은 관심을 가지게 된다.
서버 프로그램, 즉 Process가 CPU 100%로 사용중이거나 메모리가 2GB(User Memory)에 근접하게 되면 곤란한 경우가 많다.
그래서 종종 OS에서 제공하는 성능 모니터를 이용해서 Log를 남기기도 하는데, Process를 추가하기도 번거롭고 결과물을 EXCEL로 편집하기도 까다롭다.
이번 기회에 WMI 스크립트를 이용해서 Process 이름만 바꿔주고 클릭하면 10초마다 Log를 남기도록 만들었다.(스크립트 기반이므로 누구나 손쉽게 수정하여 사용 가능하다.)
네트워크 트래픽은 네트워크 어댑터 중에서 가장 송/수신이 많은 어댑터의 트래픽을 기록한다.( 단일 프로세스의 트래픽을 기록하는 것이 아니다. )
주의사항 : WbemScripting.SWbemRefresher 객체를 지원하는 OS는 다음과 같다.
Windows XP SP2 이상
Windows Server 2003 이상
001.Option Explicit
002.
003.Dim FSO, oFile
004.Dim objWMIService, objProcess, objPerfOS, objNetworkInterface, objRefresher
005.Dim colProcess, colPerfOS, colPerfNetworkInterface
006.Dim strComputer, strFileName, strCpuPercent, strProcess
007.Dim strProcessName, strProcessNameForPerf
008.Dim strDate, strTime
009.Dim DateEnd, Timelimit
010.
011.'프로세스 이름(.exe는 제거한다.)
012.strProcessNameForPerf = "explorer"
013.strProcessName = strProcessNameForPerf & ".exe"
014.
015.'Log 남길 시간 설정
016.' "y" 년
017.' "m" 월
018.' "d" 일
019.' "w" 주
020.' "h" 시
021.' "n" 분
022.' "s" 초
023.
024.Timelimit = 1
025.DateEnd = DateAdd("n", Timelimit, Now)
026.
027.'strFileName = Inputbox("c:\ProcessPerformanceLog.txt","Process Performance","ProcessPerformanceLog.txt")
028.strFileName = strProcessNameForPerf & "_" & "ProcessPerformanceLog.txt"
029.
030.'시스템 Object 생성
031.Set FSO = CreateObject("Scripting.FileSystemObject")
032.Set oFile = FSO.CreateTextFile(strFileName, True)
033.
034.strComputer = "."
035.Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
036.
037.'새로고침 Object 생성
038.Set objRefresher = CreateObject("WbemScripting.SWbemRefresher")
039.
040.Set colPerfOS = objRefresher.AddEnum(objWMIService, "Win32_PerfFormattedData_PerfProc_Process").objectSet
041.Set colPerfNetworkInterface = objRefresher.AddEnum(objWMIService, "Win32_PerfFormattedData_Tcpip_NetworkInterface").objectSet
042.Set colProcess = objRefresher.AddEnum(objWMIService, "Win32_Process").objectSet
043.objRefresher.Refresh
044.Wscript.Sleep 1000
045.
046.'Header 정보 Log 파일에 출력
047.oFile.Write("Date" & vbTab & "Time" & vbTab & "Process Name" & vbTab & "CPU Usage" & vbTab & "Memory Usage" & vbTab & "Peak Memory Usage" & vbTab & "PageFile Usage" & vbTab & "Peak PageFile Usage" & vbTab & "Network KBytesSendPerSec" & vbTab & "Network KBytesRecvPerSec")
048.
049.While( Now < DateEnd )
050. '시스템 정보 Refresh
051. objRefresher.Refresh
052.
053. '네트워크 트래픽 보기 - 모든 네트워크 어댑터에서 중에서 송/수신량이 가장 많은 어댑터의 트래픽을 기록한다.
054. Dim nBytesSentPerSec : nBytesSentPerSec = 0
055. Dim nBytesReceivedPerSec : nBytesReceivedPerSec = 0
056.
057. For Each objNetworkInterface in colPerfNetworkInterface
058. If ( nBytesSentPerSec < objNetworkInterface.BytesSentPerSec ) Then
059. nBytesSentPerSec = objNetworkInterface.BytesSentPerSec
060. End If
061.
062. If ( nBytesReceivedPerSec < objNetworkInterface.BytesReceivedPerSec ) Then
063. nBytesReceivedPerSec = objNetworkInterface.BytesReceivedPerSec
064. End If
065. Next
066.
067. 'CPU 사용량 보기
068. For Each objPerfOS in colPerfOS
069. If ( strProcessNameForPerf = objPerfOS.Name ) Then
070. strCpuPercent = objPerfOS.PercentProcessorTime
071. End If
072. Next
073.
074. '프로세스 메모리 보기
075. For Each objProcess in colProcess
076. If ( strProcessName = objProcess.Name ) Then
077. GetDate strDate
078. GetTime strTime
079. strProcess = vbNewLine & strDate & vbTab & strTime & vbTab & objProcess.Name & vbTab & strCpuPercent & vbTab & objProcess.WorkingSetSize/1024 & "KB" & vbTab & objProcess.PeakWorkingSetSize/1024 & "KB" & vbTab & objProcess.PageFileUsage/1024 & "KB" & vbTab & objProcess.PeakPageFileUsage/1024 & "KB" & vbTab & int(nBytesSentPerSec/1024) & "KB" & vbTab & int(nBytesReceivedPerSec/1024) & "KB"
080. End If
081. Next
082.
083. 'Log 파일에 저장
084. oFile.Write(strProcess)
085.
086. '10초마다 한번씩 로그를 남긴다.
087. Wscript.Sleep 10000
088.WEnd
089.
090.oFile.Write( vbNewLine & "End of Log" )
091.oFile.Close
092.WScript.Quit
093.
094.
095.'Sub 함수들
096.Sub GetTime( strTime )
097.Dim strHour, strMinute, strSecond
098.
099.'-- Hour 2자리로 변경
100.strHour = Hour(Now)
101.If Len(strHour) < 2 Then
102. strHour = "0" & strHour
103.End If
104.
105.'-- Minute 2자리로 변경
106.strMinute = Minute(Now)
107.If Len(strMinute) < 2 Then
108. strMinute = "0" & strMinute
109.End If
110.
111.'-- Second
112.strSecond = Second(Now)
113.If Len(strSecond) < 2 Then
114. strSecond = "0" & strSecond
115.End If
116.
117.'-- 전체 시간
118.strTime = strHour & ":" & strMinute & ":" & strSecond
119.
120.End Sub
121.
122.
123.Sub GetDate( strDate )
124.Dim strDay, strMonth, strYear
125.
126.'-- Day 2자리로 변경
127.strDay = Day(Now)
128.If Len(strDay) < 2 Then
129. strDay = "0" & strDay
130.End If
131.
132.'-- Month 2자리로 변경
133.strMonth = Month(Now)
134.If Len(strMonth) < 2 Then
135. strMonth = "0" & strMonth
136.End If
137.
138.'-- Year
139.strYear = Year(Now)
140.
141.'-- 전체 날짜 구하기
142.strDate = strYear & "-" & strMonth & "-" & strDay
143.
144.End Sub
출처: <http://www.npteam.net/638>
'Windows' 카테고리의 다른 글
네트워크 드라이브 연결이 안될때... (1) | 2015.08.27 |
---|---|
'INICrypto.dll': 지정된 모듈을 찾을 수 없습니다. (0) | 2015.08.27 |
파일질라 드래그앤 드랍 안될때 (0) | 2015.08.27 |
Wsus 클라이언트 설정 (0) | 2015.08.27 |
윈도우 시스템 관리자를 위한 유용한 프로그램 (0) | 2015.08.27 |