40

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

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

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

该线程是否有可能对它消耗的计算机 CPU 资源量进行合理准确的测量?主程序是一个单线程应用程序(除了记录统计信息的看门狗线程),因此如果一项技术仅限于单个线程使用多少,那也很好。

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


编辑:好的,我尝试了性能计数器的方式,但每次调用它都会添加相当多的 GC 数据,因此内存使用和垃圾收集的图表猛增。我想我现在就把这部分放在一边。

4

5 回答 5

50

您还可以使用System.Diagnostics。Process.TotalProcessorTimeSystem.Diagnostics。ProcessThread.TotalProcessorTime属性来计算您的处理器使用情况,如本文所述。

于 2008-11-09T14:47:49.477 回答
9

看看System.Diagnostics.PerformanceCounter。如果您运行起来perfmon.exe,您将看到可供您使用的性能计数器范围(将“性能对象”设置为“进程”),其中之一是“%处理器时间”。

于 2008-11-09T14:27:07.710 回答
4

您可以通过 System.Diagnostic.PerformanceCounter 类。以下是监控 CPU 使用率的示例:

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

请注意,这确实需要提升的权限。使用它可能会影响性能。

于 2008-11-09T14:27:11.860 回答
3

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

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

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

要了解 WMI 并获取进程列表,请参见下文: -Win32_PerfFormattedData_PerfProc_Process要获取 Cpu 时间,过滤器是 processID 请参阅这篇文章 - 您可以从 Win32_process 类中获取 processID。

凯文·马修·高斯 (Kevin Matthew Goss)为 C# 简化了 WMI

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());
} 

您也可以从远程系统监控进程。

于 2008-11-09T17:40:06.697 回答
-2

这篇代码项目文章描述了如何使用高性能定时器:

http://www.codeproject.com/KB/cs/highperformancetimercshar.aspx

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

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

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

于 2010-05-11T10:56:40.940 回答