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

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

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

这个线程是否有可能合理准确地衡量它消耗的计算机CPU资源量?主程序是一个单线程应用程序(除了记录统计信息的监视程序线程),所以如果一项技术仅限于单个线程使用多少,那么这也是好的。

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


编辑:好的,我尝试了性能计数器方式,但每次调用都会添加相当多的GC数据,因此内存使用和垃圾收集的图表飙升。我想我现在暂时离开这部分。

有帮助吗?

解决方案

您还可以使用 System.Diagnostics。 Process.TotalProcessorTime System.Diagnostics。 ProcessThread.TotalProcessorTime 属性,用于计算您的处理器使用情况,因为文章描述。

其他提示

查看 System.Diagnostics.PerformanceCounter 。如果你运行 perfmon.exe ,你会看到可用的性能计数器范围(将'性能对象'设置为'进程'),其中一个是'%Processor Time'。

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

http://blogs.msdn.com/dotnetinterop/archive/2007/02/02/system-diagnostics-performancecounter-and-processor-time-on-multi-core-or - 多cpu.aspx

请注意,这确实需要提升权限。使用它可能会有性能损失。

你很好地登录像smartinspect这样的监视器。但是在这种情况下,Windows本身会为您的程序(或进程)收集每个资源的数据。 WMI是应用程序监视的标准。我们可以查看WMI捕获的数据。许多应用程序管理,运行状况监控或应用程序监控工具都支持开箱即用的WMI。

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

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

要了解WMI并获取流程列表,请参阅以下内容:   - Win32_PerfFormattedData_PerfProc_Process 获取Cpu时间,filter是processID 查看此文章   - 您可以从Win32_process类获取processID。

Kevin Matthew Goss WMI轻松实现C#

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

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

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

http://csharp-source.net/open-source/profile

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top