监视进程对每个CPU核心的使用情况

时间:2013-09-22 14:45:02

标签: c# process-monitoring

有没有办法分别查询或计算单个进程每个每个核心的CPU使用情况?

例如,

  

名称 - - - - Core1 - Core2 - Core3 - Core4
  firefox.exe - 0.5% - - 0.1% - - 0.2% - - 0.3%

我知道一个名为“Process Explorer”的程序(作者Mark Russinovich)可以做到这一点,但我怎样才能在C#中做到这一点?我查看了System.Diagnostics命名空间,但找不到符合我要求的任何内容。

这是我想要实现的目标的图片,

http://i.stack.imgur.com/XySpQ.png

4 个答案:

答案 0 :(得分:2)

有一种方法可以获取该信息,您需要使用内核调试器。 我的怀疑是,如果Visual Studio Concurrency Visualizer可以获取这些信息来制作漂亮的报告和可视化,那么您也可以从Windows内核中获取它以供您使用。

您可以在此处查看一些文档http://msdn.microsoft.com/en-us/library/windows/hardware/ff552961(v=vs.85).aspx

但是通过反转可以在Visual Studio 2012安装目录中找到的Microsoft.ConcurrencyVisualizer.dll可以找到更有趣的事情。 我认为您也可以直接在项目中使用此DLL,但您无法按http://msdn.microsoft.com/en-US/vstudio/hh857605#files重新部署它。该DLL可以在http://www.microsoft.com/en-us/download/details.aspx?id=41646独立使用。

我们的想法是了解这个DLL如何使用内核跟踪来了解哪些线程在Core上并复制它以获得准确的统计信息。另外,我认为ProcessExplorer通过使用内核调试器API获得了一些统计信息,因为当我启动Concurrency Visualizer工具时Visual Studio与它发生冲突。

这很有趣也很难。

答案 1 :(得分:0)

答案 2 :(得分:0)

尝试以下(找到它here

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

答案 3 :(得分:0)

这个问题引起了我的注意,我开始研究它。很久以前我也有类似的要求,但无法找到相同的答案。

最终,我必须使用后备和唯一可用于监控进程处理器使用时间的选项(%without any kind of theoretically calculative work or affinity fixes):Process / % Process Time

我看到图表 - “显示每个CPU的一个图表”(快照)并开始调查“Process Explorer”,我惊讶地发现它是如何设法显示你或我(过去)正在寻找的东西。

对你的问题的回答是 - “不可能找出每个进程的每个核心处理器使用情况”,你对“进程资源管理器”显示的内容的假设在我在“procexp”中找到的下面引用的语句中进行了解释。 chm“(available with the zip you download)主题&gt; Process Explorer&gt;系统信息&gt;最后一段:

  

请注意,处理器图形的鼠标工具提示显示在相关时间消耗整个系统上CPU最多的进程的名称,而不是消耗特定CPU上CPU最多的进程

我希望我在这里有意义。