有没有办法分别查询或计算单个进程每个每个核心的CPU使用情况?
例如,
名称 - - - - Core1 - Core2 - Core3 - Core4
firefox.exe - 0.5% - - 0.1% - - 0.2% - - 0.3%
我知道一个名为“Process Explorer”的程序(作者Mark Russinovich)可以做到这一点,但我怎样才能在C#中做到这一点?我查看了System.Diagnostics
命名空间,但找不到符合我要求的任何内容。
这是我想要实现的目标的图片,
答案 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)
请参阅:http://msdn.microsoft.com/pt-br/library/system.diagnostics.performancecounter.aspx 并How to get the CPU Usage in C#?
答案 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最多的进程
我希望我在这里有意义。