从wmi获取每个进程的Cpu使用情况

我找到了许多来源来获取每个进程的CPU使用情况。 一般来说,有很多方法可以获得进程的CPU使用率。

  1. 来自win32_perfformatteddata_perfproc_process的percentprocessortime
  2. system.diagnostics中的performancecounter类
  3. 通过人工计算
  4. 进程类(通过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); } } } } 

输出: – 我在机器上运行时的输出