2008-11-09 2 views
35

나는 오랜 시간 동안 실행될 백그라운드 프로그램에서 일하고 있으며 디버깅 할 때 실시간으로 모니터링하기 위해 일부 값을 주기적으로 공급할 외부 로깅 프로그램 (SmartInspect)이 있습니다.C# 프로그램은 어떻게 든 자체 CPU 사용을 측정 할 수 있습니까?

저는 작업 관리자 나 IARSN TaskInfo와 같은 여러 프로그램을 간단하게 실행할 수 있습니다. 그러나이 경우 자신 만의 프로그램에 모든 것을 보관하고 싶습니다. 프로그램이 X % CPU 이상을 사용하면 로그에 플래그를 지정하십시오.

나는이 스레드의 합리적 정확한 측정을 얻을 수 있도록

이 가능 주기적 등 메모리 사용량, 작업 집합, 같은 SmartInspect 몇 가지 통계를 공급하는 백그라운드 스레드를 얼마나 컴퓨터의 CPU 자원의 그것은 소비합니까? 주 프로그램은 단일 스레드 응용 프로그램 (통계를 기록하는 워치 독 스레드 제외)입니다. 따라서 기술이 으로 제한되는 경우 단일 스레드에서 얼마만큼을 사용합니까? 이렇게하면 좋을 것입니다.

리눅스 및 C 용 rusage과 관련된 몇 가지 항목을 발견했습니다.이 용도로 사용할 수있는 비슷한 것이 있습니까?


편집 : 좋아, 성능 카운터 방법을 시도하지만, GC-데이터라고 할 때마다 꽤 많이 추가, 그래서 메모리 사용 및 가비지 컬렉션에 대한 그래프는 급증. 나는이 부분을 지금 당장 떠날 것 같다.

답변

46

System.Diagnostics.Process.TotalProcessorTimeSystem.Diagnostics.ProcessThread.TotalProcessorTime 속성을 사용하여 프로세서 사용을 계산할 수도 있습니다 (article 설명).

+0

이것은 훨씬 효과적이었고 GC에 많은 압박을 가하지는 않았지만 약간 증가했습니다. 감사! –

+0

@axk이 기사는 사용 가능한 것 같지 않습니다. 현재 프로세서 부분 만 검색하는 방법을 나타내는 대답을 완성 할 수 있습니까? – J4N

8

System.Diagnostics.PerformanceCounter을 살펴보십시오. perfmon.exe을 실행하면 '성능 개체'를 '프로세스'로 설정하는 성능 카운터 범위가 표시되며 그 중 하나는 '% Processor Time'입니다.

+1

이 대답은 나를 위해 최선을 다했다. 그래도 다음과 같이 덧붙이고 싶습니다 : 1. 초당 1 회 또는 그보다 자주 카운터의 다음 값을 얻거나 결과가 꺼지는 것을 확인해야합니다. 2. CPU를보고 있다면 stats 인 경우 Environment.ProcessorCount로 나누어야합니다. 그렇지 않으면 8 코어 시스템에서 최대 800 %와 같은 미친 비율을 얻게됩니다. –

3

smartinspect와 같은 모니터에 로깅하는 것이 좋습니다. 그러나 창 자체는이 경우 각 프로그램의 자원 (또는 프로세스)에 대한 데이터를 수집합니다. WMI는 응용 프로그램 모니터링의 표준입니다. WMI에서 캡처 한 데이터를 볼 수 있습니다. 많은 응용 프로그램 관리, 상태 모니터링 또는 응용 프로그램 모니터링 도구가 즉시 WMI를 지원합니다.

그래서 응용 프로그램 내의 CPU 사용을 로그 파일에 기록하지 않는 것이 좋습니다.

가용성 및 성능이 중요하다고 생각되면 Microsoft Operations Manager 솔루션과 같은 솔루션으로 이동하십시오.

는 WMI에 대한 아이디어를 얻을 및 프로세스의 목록은 아래를 참조 얻을 : - Win32_PerfFormattedData_PerfProc_Process를 CPU 시간을 얻기 위해, 필터는 See this article 프로세스 ID 입니다 - 당신은 Win32_Process 클래스에서 프로세스 ID를 얻을 수 있습니다.케빈 매튜 고스에 의해

WMI Made Easy For C#

oConn.Username = "JohnDoe"; 
oConn.Password = "JohnsPass"; 

System.Management.ManagementScope oMs = new System.Management.ManagementScope("\\MachineX", oConn);  

//get Fixed disk stats 
System.Management.ObjectQuery oQuery = new System.Management.ObjectQuery("select FreeSpace,Size,Name from Win32_LogicalDisk where DriveType=3"); 

//Execute the query 
ManagementObjectSearcher oSearcher = new ManagementObjectSearcher(oMs,oQuery); 

//Get the results 
ManagementObjectCollection oReturnCollection = oSearcher.Get(); 

//loop through found drives and write out info 
foreach(ManagementObject oReturn in oReturnCollection) 
{ 
    // Disk name 
    Console.WriteLine("Name : " + oReturn["Name"].ToString()); 
    // Free Space in bytes 
    Console.WriteLine("FreeSpace: " + oReturn["FreeSpace"].ToString()); 
    // Size in bytes 
    Console.WriteLine("Size: " + oReturn["Size"].ToString()); 
} 

당신은뿐만 아니라 원격 시스템에서 프로세스를 모니터링 할 수 있습니다.

+2

이것은 엄격하게 디버깅 도구이며이를 기록하는 코드는 릴리스 빌드로 컴파일되지 않습니다. 다른 컴퓨터에서 기묘한 충돌을 재현해야 할 경우에 대비해 메서드 수준 로깅 만 컴파일됩니다. 상세한 정보를 가져 주셔서 감사합니다, 나는 그것에 대해 메모를했습니다. –

-2

이 코드 프로젝트 문서에서는 고성능 타이머를 사용하는 방법에 대해 설명합니다

http://www.codeproject.com/KB/cs/highperformancetimercshar.aspx

당신은 시간 코드의 실행을 사용할 수 있습니다.

은 여기에서 오픈 소스 C#을 프로파일 러의 번호를 찾을 수 있습니다 :

http://csharp-source.net/open-source/profile

+0

타이머를 필요로하지 않았고, 프로그램이 일정 기간 동안 얼마나 많은 CPU를 사용하고 있는지를 측정 할 방법이 필요했습니다. 이것은 시간과 직접 관련이 없습니다 예를 들어 차단하는 I/O 작업이있을 수 있습니다. –

관련 문제