IT STORYs

WMI 를 활용한 원격(로컬)서버 CPU사용량 실시간 모니터링하기 본문

기타

WMI 를 활용한 원격(로컬)서버 CPU사용량 실시간 모니터링하기

295~ 2008. 3. 10. 10:01

아티클 요약 :
WMI를 잘 활용하면 원격서버제어및 모니터링 프로그램을 손쉽게 만들 수가 있다.
즉, 개발자가 소켓이나 리모팅등의 직접 구현없이 원격지서버를 모니터링 하거나 제어 할수 있게 되는 것이다.
[WMI를 활용한 원격(로컬)컴퓨터 CPU사용량 실시간 모니터링]
[들어가기에 앞서..]
WMI(Windows Management Instrumentation)
윈도우즈 관리 수단 쯤으로 해석할수 있을것이다.
로컬뿐만 아니라 원격지 컴퓨터의 리소스까지 관리대상이 될수가 있다.
관리대상이 되는 리소스라 함은
Operating System , Computer System, System Processor , System Bios , System Time Zone,
Logical Memory Configuration , Network Connection , Video Controller 및
윈도우의 각종 서비스및 프로세서 등을 말한다.
이 WMI를 잘 활용하면 원격서버제어및 모니터링 프로그램을 손쉽게 만들 수가 있다.
즉, 개발자가 소켓이나 리모팅등의 직접구현없이 원격지서버를 모니터링 하거나 제어 할수 있게
되는 것이다.
예를 들면 원격지 서버의 서비스를 시작하거나 중지 할수가 있으며
각종 프로세서의 조작이 가능하며, CPU및 메모리의 사용량에 대한 모니터링,이벤트로그,
네트워크카드등의 관리가 있을수 있겠다.
이번 아티클에서는 원격지서버의 CPU사용량을 실시간으로 모니터링 하는 프로그램을 만들어 볼것이다.
[참고자료]
- * Obtaining Raw Performance Data
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/example__obtaining_raw_performance_data.asp
- * Performance Counter Class들 목록
   ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.1042/wmisdk/wmi/performance_counter_classes.htm
- * WMI Samples - Performance Counters
    http://www.activexperts.com/activmonitor/windowsmanagement/wmi/samples/performancecounters/#Win32_PerfRawData_PerfOS_Processor.htm
[실행화면]

 

 

 

 

 

 

 

 



* 전체 실행 코드는 첨부파일을 다운받아서 실행해 주십시요
[핵심코드]
1.WMI연결부분.. (로컬및 원격연결)

public void Connect()

        {  

            //관리작업의 범위를 설정한다.          

            if (!isRemote) //로컬컴퓨터로의 연결일 경우 서버와 네임스페이스 경로를 파라메타로 전달한다.

            {              

                scope = new ManagementScope("\\\\" + serverIP + "\\root\\cimv2");              

            }

            else

            {

                //원격컴퓨터로의 연결일 경우 WMI연결에 필요한 설정정보를 지정하는 ConnectionOptions을 추가로 전달한다

                //옵션사항으로는 id와pw 정보를 포함한다.

                options  = new ConnectionOptions();

                options.Username = userID;

                options.Password = userPwd;        

                scope = new ManagementScope("\\\\" + serverIP + "\\root\\cimv2",options);          

            }          

            try

            {

                //ManagementScope을 실제 WMI 범위에 연결

                scope.Connect();                                   

            }

            catch(Exception ex)

            {

                throw new Exception(ex.Message);               

            }                              

        }   
2.CPU사용량 관련 WMI 개체생성 부분..

public void SetWMIObject()

        {

            //WMI 개체에 대한 경로

            this.cpuPath = new ManagementPath();                                

            //서버 및 네임스페이스 부분 제외한 상대 경로(클래스명:Win32_PerfRawData_PerfOS_Processor,키:Name 만을 설정)        

            //Win32_PerfRawData_PerfOS_Processor Class 의 정의 : Represents counters that measure aspects of processor activity

            //프로세서 활동을 측정하는 카운터를 대표하는 클래스(참고자료 참조)

            //Name속성값으로는 0,1,.. 이런식의 인덱스나 아래와 같이 _Total 으로 줄수 있다(cpu의 갯수와 관련있어 보인다)

            this.cpuPath.RelativePath = "Win32_PerfRawData_PerfOS_Processor.Name='_Total'";               

            //지정된 WMI 경로에 바인딩된 데이터 관리개체 생성

            this.cpuObject = new ManagementObject(this.scope,cpuPath,null);

        }
3. CPU사용량 계산 부분..

/**********************************************************************************************************    

         * 프로세서 사용률을 실제 계산하는 메서드

         * 현재의 PercentProcessorTime및TimeStamp_Sys100NS 와 바로이전의
           PercentProcessorTime및TimeStamp_Sys100NS 로 사용량을 계산한다

* *******************************************************************************************************/

        public decimal ObtainCpuPerformance()

        {

            decimal percentProcessorTime = 0;

            //관리 개체에 바인딩한다

            cpuObject.Get();

            //관리개체의 프로세서관련 값을 가져온다

            ulong  u_CurrentCPU = (ulong)cpuObject.Properties["PercentProcessorTime"].Value;

            ulong u_CurrentNano = (ulong)cpuObject.Properties["TimeStamp_Sys100NS"].Value;                                 

            decimal d_CurrentCPU = Convert.ToDecimal(u_CurrentCPU);

            decimal d_CurrentNano = Convert.ToDecimal(u_CurrentNano);

            decimal d_OldCPU = Convert.ToDecimal(oldCpuValue);

            decimal d_OldNano = Convert.ToDecimal(oldNanoValue);                       

            percentProcessorTime = (1 - ((d_CurrentCPU-d_OldCPU)/(d_CurrentNano - d_OldNano)))*100m;           

            oldCpuValue = u_CurrentCPU;

            oldNanoValue = u_CurrentNano;                       

            return percentProcessorTime;

        }  

Comments