서버 프로그래머는 CPU와 메모리 사용량에 많은 관심을 가지게 된다.

서버 프로그램, 즉 Process가 CPU 100%로 사용중이거나 메모리가 2GB(User Memory)에 근접하게 되면 곤란한 경우가 많다.

그래서 종종 OS에서 제공하는 성능 모니터를 이용해서 Log를 남기기도 하는데, Process를 추가하기도 번거롭고 결과물을 EXCEL로 편집하기도 까다롭다.

이번 기회에 WMI 스크립트를 이용해서 Process 이름만 바꿔주고 클릭하면 10초마다 Log를 남기도록 만들었다.(스크립트 기반이므로 누구나 손쉽게 수정하여 사용 가능하다.)

네트워크 트래픽은 네트워크 어댑터 중에서 가장 송/수신이 많은 어댑터의 트래픽을 기록한다.( 단일 프로세스의 트래픽을 기록하는 것이 아니다. )

 

주의사항 : WbemScripting.SWbemRefresher 객체를 지원하는 OS는 다음과 같다.

Windows XP SP2 이상

Windows Server 2003 이상

 


ProcessPerformanceLog.vbs

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>

 


Posted by pysany
,