2013-11-03 2 views
9

프로세스의 CPU 사용량을 모니터링하기 위해 PerformanceCounter 클래스를 사용하지 않으려 고 노력했습니다. 프로세스 수가 상당히 높을 때 많은 과정).Process.TotalProcessorTime에서 프로세스 CPU 사용량 계산

내 첫 번째 접근 방식은 Win32_PerfFormattedData_PerfOS_Processor 클래스와 PercentProcessorTime 속성을 사용하여 WMI 경로를 취하는 것이지만 여러 코어를 통해 CPU 사용량을 계산할 때 문제가되는 것 같습니다 (반환되는 최대 값은 100 %이므로 불가능합니다) CPU 코어 수에 따라이를 나눕니다. 결과가 부정확합니다).

마지막으로 프로세스의 클래스 TotalProcessorTime 속성을 사용하기로 결정했습니다. 슬프게도이 값을 기반으로 프로세스에서 사용하는 총 CPU 사용량의 백분율을 계산하는 방법을 모르겠습니다. 이전 PercentProcessorTime 값에서 현재 PercentProcessorTime 값을 빼서 프로세서가 특정 시간 제한 내에 프로세스에 소비 한 시간을 구해야한다는 것을 알고 있지만 거기에서 계속하는 방법을 모르겠습니다.

미리 감사드립니다.

답변

16
class GetCPUUsage 
{ 
    static TimeSpan start; 
    public static double CPUUsageTotal 
    { 
     get; 
     private set; 
    } 

    public static double CPUUsageLastMinute 
    { 
     get; 
     private set; 
    } 

    static TimeSpan oldCPUTime = new TimeSpan(0); 
    static DateTime lastMonitorTime = DateTime.UtcNow; 
    public static DateTime StartTime = DateTime.UtcNow; 
    // Call it once everything is ready 
    static void OnStartup() 
    { 
     start = Process.GetCurrentProcess().TotalProcessorTime; 
    } 

    // Call this every 30 seconds 
    static void CallCPU() 
    { 
     TimeSpan newCPUTime = Process.GetCurrentProcess().TotalProcessorTime - start; 
     CPUUsageLastMinute = (newCPUTime - oldCPUTime).TotalSeconds/(Environment.ProcessorCount * DateTime.UtcNow.Subtract(lastMonitorTime).TotalSeconds); 
     lastMonitorTime = DateTime.UtcNow; 
     CPUUsageTotal = newCPUTime.TotalSeconds/(Environment.ProcessorCount * DateTime.UtcNow.Subtract(StartTime).TotalSeconds); 
     oldCPUTime = newCPUTime; 
    } 
} 

class GetCPUInfo 
{ 
    public static string GetInfoMinute() 
    { 
     return String.Format("{0:0.0}", GetCPUUsage.CPUUsageLastMinute * 100); 
    } 

    public static string GetInfoTotal() 
    { 
     return String.Format("{0:0.0}", GetCPUUsage.CPUUsageTotal * 100); 
    } 
} 
+0

테스트 예제도 제공 할 수 있습니까? – Demodave

+0

분수 손실을 줄이려면 TimeStamp.TotalSeconds 대신 TimeStamp.Ticks를 사용하십시오. – Jan