【发布时间】:2010-12-15 21:38:06
【问题描述】:
这是我在 windows 框中枚举进程并计算每个进程的 CPU 使用百分比的函数,但结果不正确。
CPU 使用率加起来不是 100%,但更像是 120% 或 130%,我不知道我做错了什么。 似乎它可以计算各种应用程序(如 firefox、VS2010、office 等)的正确 CPU 使用率,但系统空闲进程存在问题。
public List<ProcInfo> GetRunningProcesses()
{
List<ProcInfo> allProcesses = new List<ProcInfo>();
UInt64 currentProcessCpuTime = 0;
UInt64 allProcessCpuTime = 0;
SelectQuery wmiQuery = new SelectQuery("SELECT Name, Description, ProcessId, KernelModeTime, UserModeTime FROM Win32_Process");
ManagementObjectSearcher oSearcher = new ManagementObjectSearcher(connectionScope, wmiQuery);
ManagementObjectCollection moc = oSearcher.Get();
foreach (ManagementObject mo in moc)
{
allProcessCpuTime += (UInt64)mo["KernelModeTime"] + (UInt64)mo["UserModeTime"];
}
foreach (ManagementObject mo in moc)
{
currentProcessCpuTime = (UInt64)mo["KernelModeTime"] + (UInt64)mo["UserModeTime"];
allProcesses.Add(new ProcInfo((string)mo["Name"], (string)mo["Description"], (UInt32)mo["ProcessId"], (currentProcessCpuTime / (double)allProcessCpuTime * 100));
}
return allProcesses;
}
编辑:
我发现我的功能全错了。
我开始赏金寻找最佳可行的解决方案。解决方案需要适用于本地和远程系统,并且应该很快。
【问题讨论】:
-
如果不强制使用 WMI,还有另一种使用性能计数器的方法:stackoverflow.com/questions/278071/…
-
循环迭代之间的值是否可能发生变化?也就是说,一个项目在循环的一个点具有处理器时间,然后另一个在下一次迭代中获得时间?只是一个想法......
-
我同意 Mark 的观点 - 您应该对性能指标进行快照(如果可以最大限度地同时获得所有指标,最好同时进行),然后对它们进行数学计算。他们处于波动状态。
-
@Simon Mourier:我需要查询远程机器,我可以使用 perf counters 吗? @Mark Avenius:据我所知,当我调用 oSearcher.Get();这些值是一成不变的,不会刷新和更改。
-
当然可以,如果您有适当的权利(与 WMI 或其他任何东西一样,安全性有点一致:-)。