【问题标题】:Monitoring CPU usage over all cores for a .net application监控 .net 应用程序所有内核的 CPU 使用率
【发布时间】:2015-02-20 19:07:17
【问题描述】:

我想知道是否有人可以帮助获取特定应用程序的 cpu 使用信息,我可以使用以下 code 获得与您在任务管理器中看到的相同的使用信息

任何帮助将不胜感激, 谢谢。

【问题讨论】:

  • 使用性能分析器而不是内存
  • 我见过这样的代码:PerformanceCounter myAppCpu = new PerformanceCounter("Process", "% Processor Time", "app", true);双 pct = myAppCpu.NextValue();然而,这为整个 cpu 提供了一个值,而不是我所追求的每个核心的 %。
  • Chris a profiler 是一个分析代码的软件,而不是一个要使用的代码。
  • 我知道什么是分析器,但我需要我的程序的 cpu 信息,而不是用于调试目的。

标签: c# .net cpu-usage


【解决方案1】:

有两种方法可以做到这一点。

第一个是使用WMI

    var searcher = new ManagementObjectSearcher("select * from Win32_PerfFormattedData_PerfOS_Processor");
    var cpuUsages = searcher.Get()
        .Cast<ManagementObject>()
        .Select(x => new
                      {
                          Name = x["Name"],
                          Usage = x["PercentProcessorTime"]
                      }
        )
        .ToList();

    var totalUsage = cpuUsages.Where(x => x.Name.ToString() == "_Total").Select(x => x.Usage).SingleOrDefault();

第二个是为每个核心使用 PerformanceCounter。

    int processorCores = new ManagementObjectSearcher("Select * from Win32_Processor").Get().Cast<ManagementBaseObject>().Sum(item => int.Parse(item["NumberOfCores"].ToString()));
    var performanceCounter = new PerformanceCounter[processorCores];
    for (var i = 0; i < processorCores; i++)
    {
        performanceCounter[i] = new PerformanceCounter("Processor", "% Processor Time", i.ToString());
    }

【讨论】:

  • 如果我弄错了,请纠正我,但这两个代码示例都会提供所有内核的一般 cpu 信息(不是特定于应用程序的)
【解决方案2】:

许多年前,我使用pdh 命令来获取每个进程的各种信息(在我的例子中,是 CPU、空闲和电源状态)。我相信它们现在是遗留的,并且有一组更新的 API。

我发现这些examples 使用来自 MSDN 网站的性能信息。我没试过。

注意:计数器的名称可能具有欺骗性。很多时候,我发现计数器名称从一代windows到下一代略有变化。作为一个虚构的例子,“COUNTERINFOPROCESS”可能会变成“COUNTERINFPROCESS”。还有一个 API 用于转储所有计数器的名称列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-31
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-04
    • 2012-07-16
    相关资源
    最近更新 更多