从wmi获取每个进程的Cpu使用情况
我找到了许多来源来获取每个进程的CPU使用情况。 一般来说,有很多方法可以获得进程的CPU使用率。
- 来自win32_perfformatteddata_perfproc_process的percentprocessortime
- system.diagnostics中的performancecounter类
- 通过人工计算
- 进程类(通过process.getcurrentprocess()。totalprocessortime;)如此处所述。
FirstWay:
对于远程进程监视(我的方案是远程监视),percentprocessortime始终显示0到100+的值。 由于系统中有多个处理器,因此会发生这种情况。 它可以使用percentprocessortime / processorcount计算。
问题首先:
我可以在wmi explorer中读取percentprocessortime,它显示的所有值都是0或100,只是不是这个值。 这个值是对的吗? 或者它对监测价值有用吗?
第二种方式:
对于PerformanceCounter类监视,它只能在本地完成。 所以我不能用这个。 是否有可能将其用于远程?
第三种方式:
(这里使用的公式最大的混乱。)这个计算是由一个PerformanceCounter类或wmi的win32_process类进行的。 有些人说通过使用以下方法计算性能计数器
考虑单CPU和
(处理器\%处理器时间)= 10%
(处理器\%用户时间)= 8%
(processor \%特权时间)= 2%
(进程\%处理器时间\您的应用程序)= 80%
您的应用程序使用80%(处理器\%用户时间),即(8 * .8)= CPU的6.4%。
更多参考这里 。
通过使用以下公式从win32_process计算usermodetime和kernelmodetime
DateTime firstSample, secondSample; firstSample = DateTime.Now; queryObj.Get(); //get cpu usage ulong u_oldCPU = (ulong)queryObj.Properties["UserModeTime"].Value +(ulong)queryObj.Properties["KernelModeTime"].Value; //sleep to create interval System.Threading.Thread.Sleep(1000); //refresh object secondSample = DateTime.Now; queryObj.Get(); //get new usage ulong u_newCPU = (ulong)queryObj.Properties["UserModeTime"].Value + (ulong)queryObj.Properties["KernelModeTime"].Value; decimal msPassed = Convert.ToDecimal( (secondSample - firstSample).TotalMilliseconds); //formula to get CPU ussage if (u_newCPU > u_oldCPU) PercentProcessorTime = (decimal)((u_newCPU - u_oldCPU) / (msPassed * 100 * Environment.ProcessorCount)); Console.WriteLine("Process name " + queryObj.Properties["name"].value); Console.WriteLine("processor time " + PercentProcessorTime);
上面的代码结果输出为85.999,有时为135.89888。 我很困惑哪种方式可以计算进程的CPU使用率。
注意:它是重复的。 我不能从现有的消息来源得出结论。 而我很困惑。 所以只有我问了一个问题。
您可以使用WMI进行查询。 我想你正在寻找Win32_PerfFormattedData_PerfProc_Process类。
using System; using System.Management; using System.Windows.Forms; namespace WMISample { public class MyWMIQuery { public static void Main() { try { ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_PerfFormattedData_PerfProc_Process"); foreach (ManagementObject queryObj in searcher.Get()) { Console.WriteLine("-----------------------------------"); Console.WriteLine("Name: {0}", queryObj["Name"]); Console.WriteLine("PercentProcessorTime: {0}", queryObj["PercentProcessorTime"]); } } catch (ManagementException e) { MessageBox.Show("An error occurred while querying for WMI data: " + e.Message); } } } }
输出: –