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

C# 监视进程对每个CPU核心的使用情况,c#,process-monitoring,C#,Process Monitoring,是否有一种方法可以分别查询或计算每个核心单个进程的CPU使用率 比如说, 名称----Core1-Core2-Core3-Core4 firefox.exe-0.5%--0.1%--0.2%--0.3% 我知道MarkRussinovich的一个名为ProcessExplorer的程序可以做到这一点,但我如何在C语言中做到这一点呢?我已经查看了System.Diagnostics名称空间,但找不到任何适合我的需求的名称空间 这是我想要达到的目标的图片 见: 并尝试下面的方法找到它 这个问题引起了

是否有一种方法可以分别查询或计算每个核心单个进程的CPU使用率

比如说,

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

我知道MarkRussinovich的一个名为ProcessExplorer的程序可以做到这一点,但我如何在C语言中做到这一点呢?我已经查看了System.Diagnostics名称空间,但找不到任何适合我的需求的名称空间

这是我想要达到的目标的图片

见: 并尝试下面的方法找到它


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

最终,我不得不使用回退和唯一可用的选项来监控进程处理器的使用时间,单位为%:

我看到了这个图——每个CPU快照显示一个图,并开始调查Process Explorer自己,惊讶地发现它是如何显示您或我过去所寻求的内容的

您的问题的答案是-不,不可能找出每个进程的每个核心处理器使用情况,我在procexp.chm主题>process explorer>系统信息>最后一段中找到的以下引用语句解释了您对process explorer显示内容的假设:

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


我希望我在这里讲得有道理。

有一种方法可以获取这些信息,您需要使用内核调试器。 我的猜测是,如果VisualStudio并发可视化工具能够获取这些信息,从而生成漂亮的报告和可视化效果,那么您也可以从Windows内核中获取这些信息供您使用

您可以在这里看到一些文档

但更有趣的事情可以通过反转Visual Studio 2012安装目录中的Microsoft.ConcurrencyVisualizer.dll来找到。 我认为你也可以直接在你的项目上使用这个DLL,尽管你不能按照重新部署它。该DLL在这里是独立可用的

我们的想法是了解这个DLL如何使用内核跟踪来知道哪个线程在哪个内核上,并复制它以获得准确的统计数据。此外,我认为ProcessExplorer确实通过使用内核调试器API获得了一些统计信息,因为在启动并发可视化工具时,VisualStudio与它发生冲突


这将很有趣,也很难做到。

谢谢,据我所知,这段代码提供了整个系统的核心用法?问题是如何获得单个进程的核心使用率-特定进程在core1上花费了多少时间,在core2上花费了多少时间等等@RolandPihlakas我只能找到一种方法来获取单个内核的使用率,或者获取单个进程的使用率,而不是每个进程的使用率。如果Windows没有使sysinternals成为封闭源代码就好了。顺便说一下,我在Process Explorer中没有找到这样的功能。在我看来,Process Explorer还只显示每个进程对核心总数的CPU使用情况,或整个系统的每个核心的CPU使用情况,但不显示每个核心的每个进程的CPU使用情况。但我认为这应该是可能的。这就是你在相关话题上想要的一些大脑食物[英特尔特有的]。是的,核心追踪似乎很有希望。一些引文:图表在y轴上显示逻辑核心,在x轴上显示时间。图中的每个线程都有一种独特的颜色,这样您就可以跟踪它随时间在内核之间的移动。-在概要文件分析期间,并发可视化工具检查每个应用程序线程的所有操作系统上下文切换事件。-真的,很高兴能找到一个方法来完成这件事。谢谢我将尝试一下,并根据我的需要进行更多的探索。
    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);
    }