一个C#程序能以某种方式测量它自己的CPU使用率吗?

一个C#程序能以某种方式测量它自己的CPU使用率吗?,c#,monitoring,cpu,performancecounter,C#,Monitoring,Cpu,Performancecounter,我正在开发一个将运行很长时间的后台程序,我有一个外部日志程序(),我想定期向它提供一些值,以便在调试时实时监控它 我知道我可以简单地启动多个程序,比如任务管理器或IARSN TaskInfo,但我想将所有内容都保存在我自己的程序中,因为我还想添加一些简单的规则,比如如果程序使用超过X%的CPU,请在日志中对此进行标记 我有一个后台线程,定期向SmartInspect提供一些统计数据,如内存消耗、工作集等 这个线程是否有可能获得一个合理准确的度量,它消耗了多少计算机的CPU资源?主程序是一个单线程

我正在开发一个将运行很长时间的后台程序,我有一个外部日志程序(),我想定期向它提供一些值,以便在调试时实时监控它

我知道我可以简单地启动多个程序,比如任务管理器或IARSN TaskInfo,但我想将所有内容都保存在我自己的程序中,因为我还想添加一些简单的规则,比如如果程序使用超过X%的CPU,请在日志中对此进行标记

我有一个后台线程,定期向SmartInspect提供一些统计数据,如内存消耗、工作集等

这个线程是否有可能获得一个合理准确的度量,它消耗了多少计算机的CPU资源?主程序是一个单线程应用程序(除了记录统计数据的看门狗线程),因此,如果一种技术仅限于单线程使用多少,那么这也很好

我发现了一些与rusage for Linux和C相关的条目。我可以使用类似的条目吗



编辑:好的,我尝试了性能计数器的方法,但是每次调用它都会添加相当多的GC数据,因此内存使用和垃圾收集的图表急剧上升。我想我现在就不谈这部分了。

看一下
系统.诊断.性能计数器。如果运行
perfmon.exe
,您将看到可用的性能计数器范围(将“性能对象”设置为“进程”),其中一个是“%Processor Time”。

您可以通过System.Diagnostic.PerformanceCounter类。下面是一个监视CPU使用情况的示例:


请注意,这确实需要提升权限。使用它可能会带来性能上的冲击

您还可以使用和属性来计算处理器的使用情况,如下所述。

您最好登录到smartinspect之类的监视器。但是windows本身会收集每个资源的数据,在本例中是您的程序(或进程)。WMI是应用程序监视的标准。我们可以查看WMI捕获的数据。许多应用程序管理、运行状况监视或应用程序监视工具都支持现成的WMI

因此,我不建议您将应用程序中的CPU使用情况记录到日志文件中

如果您认为可用性和性能至关重要,请选择Microsoft Operations manager解决方案等解决方案

要了解WMI并获取进程列表,请参见以下内容: -
Win32\u PerfFormattedData\u PerfProc\u进程
要获取Cpu时间,过滤器是processID -您可以从Win32_进程类获取processID

凯文·马修·戈斯

oConn.Username = "JohnDoe";
oConn.Password = "JohnsPass";

System.Management.ManagementScope oMs = new System.Management.ManagementScope("\\MachineX", oConn);    

//get Fixed disk stats
System.Management.ObjectQuery oQuery = new System.Management.ObjectQuery("select FreeSpace,Size,Name from Win32_LogicalDisk where DriveType=3");

//Execute the query 
ManagementObjectSearcher oSearcher = new ManagementObjectSearcher(oMs,oQuery);

//Get the results
ManagementObjectCollection oReturnCollection = oSearcher.Get();   

//loop through found drives and write out info
foreach( ManagementObject oReturn in oReturnCollection )
{
    // Disk name
    Console.WriteLine("Name : " + oReturn["Name"].ToString());
    // Free Space in bytes
    Console.WriteLine("FreeSpace: " + oReturn["FreeSpace"].ToString());
    // Size in bytes
    Console.WriteLine("Size: " + oReturn["Size"].ToString());
} 

您还可以从远程系统监视进程。

此代码项目文章介绍了如何使用高性能计时器:

您可以使用它来计时代码的执行

在这里,您可以找到许多开源C#分析器:


这一方法效果更好,没有给GC增加太多压力,只是稍微增加了一点。谢谢@axk文章似乎不可用,您是否可以完成您的答案,其中仅说明如何检索当前处理器部件?这是一个严格的调试工具,记录此内容的代码甚至不会编译到发布版本中。只有方法级日志才会被编译,以防我需要在不同的机器上重现一个奇怪的崩溃。不过,感谢您提供的详细信息,我已经记下了itI不需要计时器,我需要一种方法来测量程序在一段时间内使用了多少CPU,这与所花费的时间没有直接关系,例如,可能会有I/O操作阻塞。这个答案对我来说效果最好。不过,我想补充一点:1。您必须确保每秒只从计数器中获取一次下一个值,或者频率小于该值,否则结果为关闭,2。如果要查看CPU统计数据,必须将其除以Environment.ProcessorCount,否则在8核计算机上会得到高达800%的疯狂百分比。处理完性能计数器后,是否关闭了它们-