8

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.

PerformanceCounter pc0 = new PerformanceCounter("Processor", "% Processor Time", "0");
PerformanceCounter pc1 = new PerformanceCounter("Processor", "% Processor Time", "1");

How I can get core usage for 3rd, 4th core etc.?

Does anyone can help me?

Thanks

spychu
  • 113
  • 1
  • 1
  • 5

5 Answers5

9

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);
}
Soleil
  • 6,404
  • 5
  • 41
  • 61
RB.
  • 36,301
  • 12
  • 91
  • 131
  • What about if we have support HTT and want to read the logical processor usage ? – spychu Apr 05 '11 at 08:20
  • See the accepted answer on the other StackOverflow question (http://stackoverflow.com/questions/1542213/how-to-find-the-number-of-cpu-cores-via-net-c). This gives details on all the different things you might want to read. – RB. Apr 05 '11 at 08:21
  • I have read this before. I have the data about logical cpu quantity etc but I need to read the ProcessorTime of logical cpu. I'm not sure if I can do this using PerformanceCounter – spychu Apr 05 '11 at 09:11
  • 1
    Hmmm. I think that the Processor category actually refers to Logical processors, and that the difficulty will be in generating a per-Core processor usage. You'd need to do something like identity which processor pair is running on a single core, then take the average of their usage. I suspect it's more complicated than that though... – RB. Apr 05 '11 at 09:26
  • NumberOfLogicalProcessors is right NumberOfCore return core physical core , in my machine (i7) numberOfCore = 4 but NumberOfLogicalProcessors = 8 ; anyway tnx – user3290286 Feb 27 '14 at 13:03
6

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.

Soleil
  • 6,404
  • 5
  • 41
  • 61
Urutar
  • 67
  • 2
  • 7
6

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");
Eamonn McEvoy
  • 8,876
  • 14
  • 53
  • 83
  • 1
    The problem with doing that is you will get an error if the cores do not actually exist. The error will occur as soon as you try and get a value out of the counter (e.g `pc4.RawValue`). However, if you know there are at least 4 cores, then your code will be fine. – RB. Apr 04 '11 at 10:54
  • Exactly I try to do this on machine with 2 cores and got error about 'instanceName 2 doesn't exist' so I thought it won't works. Now I use try-catch exception and works fine on both architecture. Thanks – spychu Apr 04 '11 at 11:38
  • @Spychu My answer will prevent you having to catch an Exception for what really *shouldn't* be an exceptional condition... – RB. Apr 04 '11 at 11:50
  • find number of cores from [this link](http://stackoverflow.com/questions/1542213/how-to-find-the-number-of-cpu-cores-via-net-c) and loop! – PhoenixDev Jul 01 '15 at 11:53
3

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;
}
Soleil
  • 6,404
  • 5
  • 41
  • 61
user966741
  • 31
  • 1
0
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());
Soleil
  • 6,404
  • 5
  • 41
  • 61
user3290286
  • 687
  • 1
  • 7
  • 8