C#程序能以某种方式测量自己的CPU使用情况吗?
我正在研究一个将要运行很长时间的后台程序,并且我有一个外部日志程序( SmartInspect ),我想定期使用一些值来进行debugging,以在debugging时实时监控它。
我知道我可以简单地启动多个程序,比如任务pipe理器,或者IARSN TaskInfo,但是我想把所有的东西放在我自己的程序中,因为我也想添加一些简单的规则,比如程序使用多于X%CPU,在日志中标记这个。
我有一个后台线程,定期向SmartInspect提供一些统计信息,如内存消耗,工作集等。
这个线程是否有可能准确衡量它消耗了多less计算机的CPU资源? 主程序是一个单线程应用程序(除了看门狗线程logging统计),所以如果一种技术被限制在一个线程使用多less,那么这也是一个好主意。
我发现了一些与Linux和C的rusage相关的条目。有没有类似的东西可以用于这个?
编辑:好的,我尝试了性能计数器的方式,但是每次调用时都添加了很多GC数据,所以内存使用和垃圾收集的graphics猛增。 我想我现在就把这个部分留下。
您也可以使用System.Diagnostics。 Process.TotalProcessorTime和System.Diagnostics。 ProcessThread.TotalProcessorTime属性来计算您的处理器使用情况,如本文所述。
看看System.Diagnostics.PerformanceCounter
。 如果运行perfmon.exe
,您将看到可用的性能计数器范围(将“性能对象”设置为“进程”),其中之一是“处理器时间百分比”。
你可以通过System.Diagnostic.PerformanceCounter类。 以下是某人监视CPU使用情况的示例:
请注意,这确实需要提升特权。 使用它可能会造成性能下降。
这是好事,你正在login像smartInspect监视器。 但是Windows本身收集每个资源的数据,在这种情况下你的程序(或进程)。 WMI是应用程序监视的标准。 我们可以查看WMI捕获的数据。 许多应用程序pipe理,运行状况监视或应用程序监视工具都支持WMI。
所以我不build议你将应用程序中的CPU使用情况logging到日志文件中。
如果您认为可用性和性能至关重要,那么请使用Microsoft Operations Manager解决scheme等解决scheme。
想了解一下WMI和获取进程列表,请参阅下面的内容: – Win32_PerfFormattedData_PerfProc_Process
获取Cpu时间,filter是processID 请参阅本文 – 您可以从Win32_process类中获取processID。
WMI让C#变得简单 Kevin Matthew Goss
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()); }
您也可以从远程系统监视进程。
此代码项目文章介绍了如何使用高性能计时器:
http://www.codeproject.com/KB/cs/highperformancetimercshar.aspx
您可以使用它来计算代码的执行时间。
在这里你可以find一些开源的C#分析器: