如何获取超过2个核心的CPU使用率?

发布于 2024-10-30 03:58:37 字数 343 浏览 13 评论 0原文

我尝试将程序的 CPU 使用率除以核心数。现在我使用性能计数器 并将 InstanceName 更改为 0 和 1 之间,我有来自 2 个核心的数据。

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

我如何获得第三个、第四个核心等的核心使用情况?

有人可以帮助我吗?

谢谢

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

喜爱纠缠 2024-11-06 03:58:37

我怀疑您真正要问的是“如何计算核心数量?”。此代码将计算核心数量,然后根据该数量创建性能计数器。

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);
}

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);
}
任性一次 2024-11-06 03:58:37

我以前没有使用过 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");

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");
咋地 2024-11-06 03:58:37

这可能是一个老问题,但对于寻找不同解决方案的其他人来说,为什么不使用 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;
}

编辑:我注意到这仅返回逻辑处理器的数量,而不是实际的核心数量。

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.

心奴独伤 2024-11-06 03:58:37

像这样的事情也应该满足您的要求

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;
}

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;
}
时光倒影 2024-11-06 03:58:37
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());
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());
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文