我正在开发一个将运行很长时间的后台程序,我有一个外部日志记录程序(SmartInspect),我希望定期提供一些值,以便在调试时实时监控它
我知道我可以简单地启动多个程序,比如任务管理器或IARSN TaskInfo,但是我想在我自己的程序中保留所有内容,因为我还想添加一些简单的规则,比如程序使用超过X%的CPU,在日志中标记它。
我有一个后台线程,定期向SmartInspect提供一些统计信息,如内存消耗,工作集等。
这个线程是否有可能合理准确地衡量它消耗的计算机CPU资源量?主程序是一个单线程应用程序(除了记录统计信息的监视程序线程),所以如果一项技术仅限于单个线程使用多少,那么这也是好的。
我发现了一些与Linux和C相关的名为 rusage 的条目。我可以使用类似的内容吗?
编辑:好的,我尝试了性能计数器方式,但每次调用时都添加了大量的GC数据,因此内存使用和垃圾收集的图表飙升。我想我现在暂时离开这部分。
答案 0 :(得分:49)
您还可以使用System.Diagnostics.Process.TotalProcessorTime和System.Diagnostics.ProcessThread.TotalProcessorTime属性来计算处理器使用情况,如article所述。
答案 1 :(得分:8)
看看System.Diagnostics.PerformanceCounter
。如果你运行perfmon.exe
,你会看到可用的性能计数器范围(将'性能对象'设置为'进程'),其中一个是'%Processor Time'。
答案 2 :(得分:4)
您可以通过System.Diagnostic.PerformanceCounter类。这是一个监视CPU使用情况的例子:
请注意,这确实需要提升权限。使用它可能会有性能损失。
答案 3 :(得分:3)
你很好地登录像smartinspect这样的监视器。但是在这种情况下,Windows本身会为您的程序(或进程)收集每个资源的数据。 WMI是应用程序监视的标准。我们可以查看WMI捕获的数据。许多应用程序管理,运行状况监控或应用程序监控工具都支持开箱即用的WMI。
因此,我不建议您将应用程序中的CPU使用情况记录到日志文件中。
如果您认为可用性和性能至关重要,那么请选择Microsoft Operations Manager解决方案等解决方案。
要了解WMI并获取流程列表,请参阅以下内容:
- Win32_PerfFormattedData_PerfProc_Process
获取Cpu时间,filter是processID
See this article
- 您可以从Win32_process类获取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());
}
您也可以从远程系统监控进程。
答案 4 :(得分:-2)
此代码项目文章介绍了如何使用高性能计时器:
http://www.codeproject.com/KB/cs/highperformancetimercshar.aspx
您可以使用它来计算代码的执行时间。
在这里您可以找到许多开源C#剖析器: