ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • WMI 를 활용한 원격(로컬)서버 CPU사용량 실시간 모니터링하기
    정리필요1 2008. 7. 18. 02:12



    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/windowsmanagem
    ent/wmi/samples/performancecounters/#Win32_PerfRawData_PerfOS_Processor.ht
    m

    [실행화면]



     

     
    * 전체 실행 코드는 첨부파일을 다운받아서 실행해 주십시요

    [핵심코드]

     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기능이 돋보인다.

    기회가 닿는다면 원격서버의 디스크,이벤트로그,서비스,프로세서,메모리등을
    모니터링하는 아티클을 게재하고 싶습니다.

    또한 많은 분들이 관심을 가져 훌륭하고 강력한 모니터링 툴을 개발해보고 싶은 욕심이 납니다.

    관련 의문점및 수정사항이 있다면
    http://www.mkex.pe.kr 로 알려주시면 감사하겠습니다





    출처 : http://www.mkex.pe.kr  .. 좋은 글이네용

Designed by Tistory.