c# process-monitoring

c# - Monitorea el uso de un proceso de cada núcleo de CPU



¿Hay alguna forma de consultar o calcular el uso de la CPU de un proceso único por cada núcleo por separado?

Por ejemplo,

Nombre - - - - Core1 - Core2 - Core3 - Core4
firefox.exe - 0.5% - - 0.1% - - 0.2% - - 0.3%

Conozco un programa llamado "Process Explorer" (por Mark Russinovich) que puede hacer esto, pero ¿cómo puedo hacer esto en C #? He echado un vistazo al espacio de nombres de System.Diagnostics , pero no he podido encontrar nada que se ajuste a mis requisitos.

Aquí hay una foto de lo que estoy tratando de lograr,


Esta pregunta me llamó la atención y empecé a estudiarla. Hace mucho tiempo yo también tenía un requisito similar, pero no pude encontrar una respuesta para el mismo.

En última instancia, tuve que usar el repliegue y la única opción disponible para monitorear el tiempo de uso del procesador en% ( sin ningún tipo de trabajo de cálculo teórico o arreglos de afinidad ): Proceso /% Tiempo de proceso .

Vi el gráfico: "Mostrar un gráfico por CPU" (instantánea) en cuestión y comencé a investigar "Explorador de procesos" con sorpresa para descubrir cómo se las arregla para mostrar lo que tú o yo (en el pasado) buscábamos.

La respuesta a su pregunta es: "No, no es posible averiguar el uso del procesador central por proceso" y su suposición de lo que se muestra en el "Explorador de procesos" se explica en la siguiente declaración citada que encontré en "procexp.chm" ( disponible con el zip descargado ) tema> Explorador de procesos> Información del sistema> Último párrafo:

Tenga en cuenta que la información sobre herramientas del mouse para un gráfico de procesador muestra el nombre del proceso que consumió la mayor cantidad de CPU en todo el sistema en el momento asociado, no el proceso que consumió más CPU en una CPU en particular

Espero que tenga sentido aquí.


Hay una forma de obtener esa información, necesitará usar un Depurador de Kernel. Mi sospecha era que si Visual Visual Concurrency Visualizer puede obtener esta información para crear hermosos informes y visualizaciones, también puede obtenerla del Kernel de Windows para su uso.

Puede ver algunos documentos aquí http://msdn.microsoft.com/en-us/library/windows/hardware/ff552961(v=vs.85).aspx .

Pero se pueden encontrar cosas más interesantes invirtiendo el Microsoft.ConcurrencyVisualizer.dll que se puede encontrar en el directorio de instalación de Visual Studio 2012. Creo que también puede usar directamente esta DLL en su proyecto, aunque no puede volver a implementarla según http://msdn.microsoft.com/en-US/vstudio/hh857605#files . Esa DLL está disponible de forma independiente aquí http://www.microsoft.com/en-us/download/details.aspx?id=41646 .

La idea es aprender cómo esta DLL utiliza el Kernel Trace para saber qué Thread estaba en qué Core y replicarlo para obtener estadísticas precisas. Además, creo que ProcessExplorer obtiene algunas estadísticas mediante el uso de la API del depurador de kernel porque Visual Studio entra en conflicto con él cuando inicio la herramienta Visualizador de concurrencia.

Esto será divertido y difícil de hacer.


Prueba el siguiente (lo encontraste here )

int coreCount = 0; foreach (var item in new System.Management.ManagementObjectSearcher("Select * from Win32_Processor").Get()) { coreCount += int.Parse(item["NumberOfCores"].ToString()); } PerformanceCounter[] pc = new PerformanceCounter[coreCount]; for (int i = 0; i < coreCount; i++) { pc[i] = new PerformanceCounter("Processor", "% Processor Time", i.ToString()); Console.WriteLine(pc[i].CounterName); }