2013-11-03 18 views
9

Tôi đã cố gắng tránh xa việc sử dụng lớp PerformanceCounter để theo dõi mức sử dụng CPU của quá trình vì có vẻ như nó đòi hỏi một lượng CPU khá lớn khi quá trình đếm được cao (khi giám sát rất nhiều quy trình). Cách tiếp cận đầu tiên của tôi là lấy đường WMI bằng cách sử dụng Win32_PerfFormattedData_PerfOS_Processor lớp và thuộc tính PercentProcessorTime, nhưng dường như có vấn đề khi tính toán mức sử dụng CPU trên nhiều lõi (giá trị tối đa mà nó quay trở lại là 100% khiến nó không thể để chia nó dựa trên số lõi CPU, dẫn đến kết quả không chính xác).Tính toán quá trình sử dụng CPU từ Process.TotalProcessorTime

Vì vậy, cuối cùng tôi quyết định sử dụng thuộc tính của lớp Process TotalProcessorTime. Đáng buồn là tôi không chắc chắn làm thế nào để tính toán tỷ lệ phần trăm của tổng mức sử dụng CPU được sử dụng bởi quá trình dựa trên giá trị. Tôi biết rằng tôi nên trừ giá trị PercentProcessorTime hiện tại khỏi giá trị PercentProcessorTime trước đó để nhận được lượng thời gian mà bộ xử lý dành cho quy trình trong một giới hạn thời gian nhất định nhưng tôi không chắc chắn cách tiếp tục từ đó.

Xin cảm ơn trước.

Trả lời

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

Bạn có thể cung cấp ví dụ thử nghiệm không? – Demodave

+0

Sử dụng TimeStamp.Ticks thay vì TimeStamp.TotalSeconds để mất ít phân số hơn – Jan

Các vấn đề liên quan