일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 주신영
- winmodev
- 신석현
- 헤이맨
- 윈도우모바일
- 안드로이드
- MIX10
- 김춘배
- 윈도우폰7
- 마이크로소프트
- windows mobile 6.5
- 스마트폰
- 윈도데브
- 루나네스
- 옴니아2
- 실버라이트 코리아
- 황광진
- 훈스닷넷
- 서진호
- 윈모데브
- 소년포비소프트
- 신동혁
- 지승욱
- 거제도
- 쉐어포인트코리아
- 윈도우 모바일
- 윈도우폰
- UX베이커리
- 소년포비
- 데브피아
- Today
- Total
소년포비의 세계정복!!
WMI를 활용한 원격(로컬)컴퓨터 CPU사용량 실시간 모니터링 본문
아티클 요약 :
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 점유율에 대한 문의가 많이 들어와서 관련 코드를 추가한 파일을 첨부 합니다
'프로그램 세상 > C#' 카테고리의 다른 글
[Thread][동기화] Event (0) | 2009.10.06 |
---|---|
[Thread] Thread 메서드에 매개변수 넘기기 (0) | 2009.10.06 |
윈폼or모듈단위에서 특정 웹페이지 호출하기 (0) | 2009.10.06 |
바인딩 가능한 객체 만들기 (0) | 2009.10.06 |
비 동기 웹 서비스 호출(Asynchronous WebService) (0) | 2009.10.06 |