2008-11-09 15 views
35

Estoy trabajando en un programa en segundo plano que se ejecutará durante mucho tiempo, y tengo un programa de registro externo (SmartInspect) que deseo alimentar periódicamente con algunos valores, para supervisarlo en tiempo real cuando se depura.¿Puede un programa C# medir su propio uso de CPU de alguna manera?

Sé que puedo simplemente iniciar varios programas, como el Administrador de tareas o IARSN TaskInfo, pero me gustaría tener todo en mi propio programa para esto, ya que también quiero agregar algunas reglas simples como si el el programa usa más del X% de CPU, marque esto en el registro.

que tienen un subproceso de fondo que se alimenta periódicamente algunas estadísticas a SmartInspect, al igual que el consumo de memoria, conjunto de trabajo, etc.

¿Es posible que este hilo para obtener una medida bastante exacta de la cantidad de recursos de CPU de la computadora ¿consume? El programa principal es una aplicación de subproceso único (aparte del subproceso de vigilancia que registra las estadísticas), por lo que si una técnica se limita a , cuánto utilizará un solo subproceso, entonces eso sería bueno también.

Encontré algunas entradas relacionadas con algo llamado rusage para Linux y C. ¿Hay algo similar que pueda usar para esto?


Editar: Ok, me trataron de la manera contador de rendimiento, pero añade un buen montón de GC-datos cada vez que se llama, por lo que la gráfica de uso de la memoria y la recolección de basura se disparó. Supongo que dejaré esta parte por ahora.

Respuesta

46

También puede usar las propiedades System.Diagnostics.Process.TotalProcessorTime y System.Diagnostics.ProcessThread.TotalProcessorTime para calcular el uso de su procesador, como se describe en article.

+0

Esto funcionó mucho mejor y no agregó tanta presión en el GC, solo un ligero aumento. ¡Gracias! –

+0

@axk El artículo no parece estar disponible, ¿puede completar su respuesta que indica simplemente cómo recuperar SOLAMENTE la parte del procesador actual? – J4N

8

Eche un vistazo a System.Diagnostics.PerformanceCounter. Si ejecuta perfmon.exe, verá el rango de contadores de rendimiento disponibles para usted (establezca el "objeto de rendimiento" en "Proceso"), uno de los cuales es "% de tiempo del procesador".

+1

Esta respuesta trabajaron lo mejor para mí. Sin embargo, me gustaría añadir que: 1. Debes asegurarte de que solo obtienes el siguiente valor del contador una vez por segundo o menos a menudo que eso o los resultados están apagados, y 2. Si estás mirando a la CPU estadísticas, tiene que dividir eso por Environment.ProcessorCount de lo contrario, obtendrá porcentajes locos como hasta 800% en una máquina de 8 núcleos. –

3

Es bueno que esté iniciando sesión en monitores como smartinspect. Pero Windows mismo recopila los datos de cada recurso, en este caso su programa (o proceso). WMI es el estándar para el monitoreo de aplicaciones. Podemos ver los datos capturados por WMI. Muchas herramientas de administración de aplicaciones, monitoreo de la salud o monitoreo de aplicaciones son compatibles con WMI desde el primer momento.

Así que no le recomendaría que registre el uso de la CPU dentro de la aplicación en un archivo de registro.

Si cree que la disponibilidad y el rendimiento son críticos, busque soluciones como la solución Microsoft Operations Manager.

para tener una idea acerca de WMI y para obtener la lista de proceso de ver a continuación: - Win32_PerfFormattedData_PerfProc_Process para obtener el tiempo de la CPU, el filtro es idProceso See this article - Usted puede obtener el idProceso de la clase Win32_Process.

WMI Made Easy For C# por Kevin Mateo 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()); 
} 

Puede controlar el proceso desde el sistema remoto también. Artículo proyecto

+2

Esto es estrictamente una herramienta de depuración, y el código que registra esto ni siquiera se compilará en la compilación de lanzamiento. Solo el registro a nivel de método se compilará para eso, en caso de que necesite intentar reproducir un bloqueo extraño en una máquina diferente. Gracias por la información detallada, sin embargo, he tomado nota de ello –

-2

Este código se describe cómo utilizar el temporizador de alto rendimiento:

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

Se puede utilizar en cuando termina la ejecución del código.

Aquí puede encontrar un número de código abierto de C# perfiladores:

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

+0

No necesitaba un temporizador, necesitaba una forma de medir la cantidad de CPU que el programa estaba usando durante un período de tiempo, esto no está directamente relacionado con el tiempo tomado, podría haber operaciones de E/S que bloquean, por ejemplo. –

Cuestiones relacionadas