Как получить загрузку процессора для более чем 2 ядер? - PullRequest
7 голосов
/ 04 апреля 2011

Я пытаюсь получить в моей программе загрузку ЦП, разделенную на ядра. Теперь я использую PerformanceCounter и меняя InstanceName между 0 и 1, у меня есть данные от 2 ядер.

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

Как я могу получить использование ядра для 3-го, 4-го ядра и т. Д.?

Кто-нибудь может мне помочь?

Спасибо

Ответы [ 5 ]

9 голосов
/ 04 апреля 2011

Я подозреваю, что вы действительно спрашиваете: " Как мне подсчитать количество ядер ?".Этот код будет подсчитывать количество ядер, а затем на его основе создаст счетчики производительности.

        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);
        }
5 голосов
/ 05 сентября 2012

Это может быть старый вопрос, но для тех, кто ищет другое решение, почему бы вам не использовать 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;
    }

РЕДАКТИРОВАТЬ: я заметил, что это возвращает только количествопроцессоры, а не фактическое количество ядер.

5 голосов
/ 04 апреля 2011

Я раньше не использовал PerformanceCounter, но что-то не так с этим делалось?

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");
3 голосов
/ 27 сентября 2011

Что-то подобное должно работать и по вашему требованию

  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 голосов
/ 27 февраля 2014
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());

                }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...