How to get CPU usage for more than 2 cores?

前端 未结 5 444
甜味超标
甜味超标 2020-12-03 15:57

I try to get in my program CPU usage divided by a cores. Now I use the PerformanceCounter and changing the InstanceName between 0 and 1 I have the data from 2 cores.

相关标签:
5条回答
  • 2020-12-03 16:05

    I havent used PerformanceCounter before but is there something wrong with doing this?

    PerformanceCounter pc0 = new PerformanceCounter("Processor", "% Processor Time", "0");
    PerformanceCounter pc1 = new PerformanceCounter("Processor", "% Processor Time", "1");
    PerformanceCounter pc2 = new PerformanceCounter("Processor", "% Processor Time", "2");
    PerformanceCounter pc3 = new PerformanceCounter("Processor", "% Processor Time", "3");
    
    0 讨论(0)
  • 2020-12-03 16:11

    This might be an old question, but for anyone else looking for a different solution, why don't you use System.Environment?

    public static List<System.Diagnostics.PerformanceCounter> GetPerformanceCounters()
    {
        List<System.Diagnostics.PerformanceCounter> performanceCounters = new List<System.Diagnostics.PerformanceCounter>();
        int procCount = System.Environment.ProcessorCount;
        for (int i = 0; i < procCount; i++)
        {
            System.Diagnostics.PerformanceCounter pc = new System.Diagnostics.PerformanceCounter("Processor", "% Processor Time", i.ToString());
            performanceCounters.Add(pc);
        }
        return performanceCounters;
    }
    

    EDIT: I noticed this only returns the amount of logical processors, not the actual core count.

    0 讨论(0)
  • 2020-12-03 16:14
    foreach (var item in new System.Management.ManagementObjectSearcher("Select NumberOfLogicalProcessors from Win32_Processor").Get())
        coreCount += int.Parse(item["NumberOfLogicalProcessors"].ToString());
    
    PerformanceCounter[] pc = new PerformanceCounter[coreCount];
    
    for (int i = 0; i < coreCount; i++)
        pc[i] = new PerformanceCounter("Processor", "% Processor Time", i.ToString());
    
    0 讨论(0)
  • 2020-12-03 16:17

    I suspect that what you are really asking is "How do I count the number of cores?". This code will count the number of cores, and then create performance counters based on that.

    int coreCount = 0;
    foreach (var item in new System.Management.ManagementObjectSearcher("Select * from Win32_Processor").Get())
    {
        coreCount += int.Parse(item["NumberOfCores"].ToString());
    }
    
    PerformanceCounter[] pc = new PerformanceCounter[coreCount];
    
    for (int i = 0; i < coreCount; i++)
    {
        pc[i] = new PerformanceCounter("Processor", "% Processor Time", i.ToString());
        Console.WriteLine(pc[i].CounterName);
    }
    
    0 讨论(0)
  • 2020-12-03 16:30

    Some thing like this should also work for your requirement

    public List<string> GetServerStatus()
    {
        List<string> cpuStatus = new List<string>();
        ObjectQuery wmicpus = new WqlObjectQuery("SELECT * FROM Win32_Processor");
        ManagementObjectSearcher cpus = new ManagementObjectSearcher(wmicpus);
        try
        {
            int coreCount = 0;
            int totusage = 0;               
            foreach (ManagementObject cpu in cpus.Get())
            {
                //cpuStatus.Add(cpu["DeviceId"] + " = " + cpu["LoadPercentage"]);
                coreCount += 1;
                totusage += Convert.ToInt32(cpu["LoadPercentage"]);
            }
            if (coreCount > 1)
            {
                double ActUtiFloat = totusage / coreCount;
                int ActUti = Convert.ToInt32(Math.Round(ActUtiFloat));
                //Utilisation = ActUti + "%";
                cpuStatus.Add("CPU = " + ActUti);
            }
            else
            {
                cpuStatus.Add("CPU = " + totusage);
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
        finally
        {
            cpus.Dispose();
        }            
        return cpuStatus;
    }
    
    0 讨论(0)
提交回复
热议问题