【问题标题】:C# Calculate CPU usage for one process with multiple instancesC#计算具有多个实例的一个进程的CPU使用率
【发布时间】:2014-12-17 14:08:08
【问题描述】:

我遇到了这个问题: 我想计算处理器使用特定应用程序的百分比,在这种情况下,它具有 29 个 chrome 实例。我对处理器如何消耗总共 29 个 chrome 实例感兴趣。我尝试过的代码:

private float GetCpuUsage(string ProcessName)
    {
        float cpuUsage = 0;
        try
        {
            var ProcName = Process.GetProcessesByName(ProcessName);
            var instances = new PerformanceCounter[ProcName.Length];
            for (int i = 0; i < instances.Length; i++)
            { 

                using (var TotalCpuUsage = new PerformanceCounter("Process", "% Processor Time", ProcName[i].ProcessName, true))
                {

                    TotalCpuUsage.NextValue();
                    Thread.Sleep(1000); //for better aproximation cpu
                    double processNext = Math.Round((double)(TotalCpuUsage.NextValue() / Environment.ProcessorCount), 2);
                    Console.WriteLine("Processor Cpu:{0}, PidProcess:{1}", processNext, ProcName[i].Id);
                    cpuUsage += (float)processNext;


                }
            }
            Console.WriteLine("Processor TotalCpu:{0}", cpuUsage);
            return cpuUsage;
        }
        catch (Exception ex)
        {
           Message.Show(ex.Message + "\r\n" + ex.StackTrace);
            return cpuUsage;
        }
    }

我得到了这些奇怪的结果:

Processor Cpu:6.51, PidProcess:18496
Processor Cpu:3.55, PidProcess:22056
Processor Cpu:20.54, PidProcess:16920
Processor Cpu:0, PidProcess:19420
Processor Cpu:0, PidProcess:7644
Processor Cpu:0, PidProcess:22500
Processor Cpu:14.07, PidProcess:19644
Processor Cpu:0, PidProcess:22004
Processor Cpu:3.55, PidProcess:23772
Processor Cpu:0, PidProcess:7948
Processor Cpu:6.91, PidProcess:22980
Processor Cpu:14.19, PidProcess:19464
Processor Cpu:0, PidProcess:18428
Processor Cpu:16, PidProcess:19408
Processor Cpu:0, PidProcess:20340
Processor Cpu:20.73, PidProcess:16660
Processor Cpu:9.37, PidProcess:7784
Processor Cpu:7.16, PidProcess:23984
Processor Cpu:0, PidProcess:8156
Processor Cpu:17.91, PidProcess:13272
Processor Cpu:10.1, PidProcess:20228
Processor Cpu:13.35, PidProcess:6568
Processor Cpu:3.55, PidProcess:6452
Processor Cpu:0, PidProcess:11668
Processor Cpu:0, PidProcess:16780
Processor Cpu:7.23, PidProcess:7036
Processor Cpu:0, PidProcess:19712
Processor Cpu:13.7, PidProcess:20316
Processor Cpu:3.45, PidProcess:20296

Processor TotalCpu:191.87

我可以用什么方法来解决这个问题??怎样做才能得到一些真正的结果

【问题讨论】:

    标签: c# process windows-forms-designer performancecounter consumption


    【解决方案1】:

    我认为这里的问题可能是您没有考虑到您的系统有多个内核。您需要将百分比除以系统上可用的内核数。看看下面的链接。 http://www.allenconway.net/2013/07/get-cpu-usage-across-all-cores-in-c.html

    【讨论】:

      【解决方案2】:

      我知道这是一个有点老的问题,但我想补充一点,这种方法存在一个根本缺陷。

      使用时间片计算 CPU 使用率。在上面的代码中,它是在一秒钟内计算的(例如,与任务管理器使用的相同,所以没有错)。

      但是,您正在为每个进程创建一个 PerformanceCounter 实例,而且您几乎每次只使用一个实例。

      实际上这意味着...您在 00:00 (mm:ss) 查询进程 (chrome) 并在 00:01 再次查询,然后您在 00:01 和 00 再次查询 (chrome#1): 02,(chrome#2) 在 00:02 和再次在 00:03 ... 等等

      所以完全有可能当您查询(chrome) 时,它正在使用 100% CPU,但一秒钟后,当您查询 (chrome#1) 时,前者现在使用 0% CPU,而后者现在使用 100%,所以当您将它们相加时,您将获得 200% 的 CPU 使用率。

      您需要同时查询所有进程以获得准确的表示。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多