Creative Commons License

Microsoft .NET

닷넷!시작하기
닷넷! Ver 2.0~
닷넷!스킬업
웹개발
윈폼개발
실용모듈개발
Tip & Tech
하루 한 문법

Microsoft .NET 개발자들을 위한 공간입니다. 기초강의에서 부터 고급 기술 정보 및 팁등을 다루도록 하겠습니다.

.

닷넷!스킬업

닷넷 기술을 조금 더 깊이 다루고자 합니다. 특정 주제를 정하지 않고 이슈 발생 시 마다 체계적으로 정리하여 공유하겠습니다. 이전 자료를 옮겨온 곳이기도 합니다.

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

작성자 : 박종명
최초 작성일 : 2008-05-26 (월요일)
최종 수정일 : 2008-05-26 (월요일)
조회 수 : 6470

2005년에 고수 닷넷에 게제한 글 입니다.
 
아티클 요약 :
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;

        }   
 
 

정리
WMI로 참으로 많을 것을 할수 있음에 감사한다.원격지 컴퓨터의 컨트롤의 경우 소켓이나 채널을 개발자가 직접 만들지 않아도 다는 점이 우선 사용성의 편리함이 있다고 보여진다.또한 리소스검색에 아주 다양한 클래스와 SQL까지 지원하는 강력한 Search기능이 돋보인다.기회가 닿는다면 원격서버의 디스크,이벤트로그,서비스,프로세서,메모리등을 모니터링하는 아티클을 게재하고 싶습니다. 또한 많은 분들이 관심을 가져 훌륭하고 강력한 모니터링 툴을 개발해보고 싶은 욕심이 납니다.
 
----------------------------------------------------------------------------------------------------

추가 >>
전체 CPU 점유율이 아니라 특정 프로세스의 CPU 점유율에 대한 문의가 많이 들어와서 관련 코드를 추가한 파일을 첨부 합니다
 



∵Commented by 이동현 at 2009-01-21 오후 1:53:45  
안녕하세요^^* CPU사용에 관해 구하던중.. 너무나 감사한 자료라..^^*
많은 도움이 되고 있습니다.. 문의좀 드리고 싶은게 있어서요..
로컬로 하고.. 특정 CPU를 지정하면 "클래스가 잘못되었습니다."라는 메시지가 출력되는데요..
원격서버로 접속을 하면.. 잘되구요... 왜그런지좀.... 알수있을가요? ㅠㅠ
∵Commented by 이동현 at 2009-01-21 오후 4:14:55  
2003에서..는 동작을 하는것 같은데... 2005에서는.. 로컬은.. 에러가 나네요..ㅜㅜ
이름
비밀번호
홈페이지
RY <- 왼쪽의 문자를 오른쪽 박스에 똑같이 입력해 주세요