¿Puede un programa C# medir su propio uso de CPU de alguna manera?


Estoy trabajando en un programa en segundo plano que se ejecutará durante mucho tiempo, y tengo un programa de registro externo ( SmartInspect) que quiero alimentar con algunos valores periódicamente, para monitorearlo en tiempo real al depurar.

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

Tengo un hilo de fondo que periódicamente alimenta algunas estadísticas a SmartInspect, como el consumo de memoria, conjunto de trabajo, etc.

¿Es posible que este hilo obtenga una medida razonablemente precisa de la cantidad de recursos de CPU del equipo que consume? El programa principal es una aplicación de un solo subproceso (aparte del subproceso watchdog que registra las estadísticas), por lo que si una técnica se limita a cuánto usa un solo subproceso, entonces eso sería bueno demasiado.

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


Edit: Ok, probé la forma de contador de rendimiento, pero agregó una gran cantidad de datos GC cada vez que se llama, por lo que el gráfico para el uso de memoria y la recolección de basura se disparó. Supongo que dejaré esta parte por ahora.

Author: Blair Conrad, 2008-11-09

5 answers

También puede usar el sistema .Diagnostico.Proceso.Tiempo total del proceso y Sistema.Diagnostico. Processthead.Tiempo total del proceso propiedades para calcular el uso del procesador como se describe en este artículo.

 46
Author: axk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-09 15:43:07

Echa 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 '% Tiempo de procesador'.

 8
Author: Sunlight,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-09 14:27:07

Puede hacerlo a través del Sistema.Diagnostico.Clase PerformanceCounter. Aquí hay un ejemplo de alguien monitoreando el uso de la CPU:

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

Tenga en cuenta que esto requiere privilegios elevados. Y puede haber un éxito de rendimiento usándolo.

 4
Author: Keltex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-09 14:27:11

Es bueno que estés registrando en monitores como smartinspect. Pero windows en sí reúne los datos para 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 estado o monitoreo de aplicaciones admiten WMI desde el primer momento.

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

Si usted piensa que la disponibilidad y el rendimiento es crítico, entonces opte por soluciones como la solución Microsoft Operations Manager.

Para tener una idea sobre WMI y para obtener la lista de procesos, consulte a continuación: - Win32_PerfFormattedData_PerfProc_Process para obtener el tiempo de Cpu, filtro es processID Ver este artículo - Usted puede comenzar el proceso de Win32_process de clase.

WMI Hecho Fácil Para C # por 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());
} 

También puede monitorear el proceso desde el sistema remoto.

 3
Author: sundar venugopal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-10-01 09:16:04

Este artículo del proyecto code describe cómo usar el temporizador de alto rendimiento:

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

Puede usarlo para cronometrar la ejecución de su código.

Aquí puede encontrar una serie de perfiladores de C# de código abierto:

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

 -2
Author: Ashley Davis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-11 10:56:40