Seguimiento del uso de CPU y memoria por proceso

163

Sospecho que una de mis aplicaciones consume más ciclos de CPU de los que quiero. El problema es que ocurre en ráfagas, y solo mirar el administrador de tareas no me ayuda, ya que solo muestra el uso inmediato.

¿Hay alguna manera (en Windows) de rastrear el historial de uso de CPU y memoria para algún proceso. Por ejemplo, comenzaré a rastrear "firefox", y después de aproximadamente una hora veré un gráfico de su uso de CPU y memoria durante esa hora.

Estoy buscando una herramienta ya hecha o una forma programática para lograr esto.

Eli Bendersky
fuente

Respuestas:

167

Sólo tienes que escribir perfmonen Start > Runy pulse enter. Cuando la ventana Rendimiento esté abierta, haga clic en el signo + para agregar nuevos contadores al gráfico. Los contadores son diferentes aspectos del funcionamiento de su PC y están agrupados por similitud en grupos llamados "Objeto de rendimiento".

Para sus preguntas, puede elegir los objetos de rendimiento "Proceso", "Memoria" y "Procesador". Luego puede ver estos contadores en tiempo real

También puede especificar la utilidad para guardar los datos de rendimiento para su inspección posterior. Para hacer esto, seleccione "Registros y alertas de rendimiento" en el panel izquierdo. (Está justo debajo de la consola del Monitor del sistema que nos proporciona los contadores mencionados anteriormente. Si no está allí, haga clic en "Archivo"> ​​"Agregar / quitar complemento", haga clic en Agregar y seleccione "Registros y alertas de rendimiento" en la lista ".) En" Registros y alertas de rendimiento ", cree una nueva configuración de monitoreo en" Registros de contador ". Luego puede agregar los contadores, especificar la frecuencia de muestreo, el formato de registro (texto binario o simple) y la ubicación del registro.

Martin08
fuente
1
¿Cuál es el intervalo ideal para tomar una muestra de datos en un registro de contador?
Steph Rose
8
MS obviamente ha cambiado la interfaz de usuario a PerformanceMonitor desde que escribió esto. ¿Alguna idea de cómo hacer esto en Windows 2008 R2?
Martin Brown
55
@MartinBrown - Encontré esto . Es excelente.
JNF
2
Alguien sabe cómo hacer la segunda parte de guardar un inicio de sesión de Vista? Parece que no hay "Registros y alertas de rendimiento" en ninguna parte
Xitcod13
11
Haga clic con el botón derecho en Conjuntos de recopiladores de datos-> Definido por el usuario. Seleccione Nuevo-> Conjunto de recopiladores de datos. Déle un nombre y seleccione Crear manualmente. Haga clic en Siguiente. Seleccione el contador de rendimiento. Haga clic en Siguiente. Agregue los contadores de rendimiento e ingrese el intervalo de muestra. Luego, en Conjuntos de recopiladores de datos, haga clic con el botón derecho en su conjunto y haga clic en "Inicio". Después de un tiempo, haga clic derecho en su conjunto y haga clic en "Detener". Luego puede encontrar el informe en Informes-> Definido por el usuario-> Su conjunto. Haga clic derecho en el gráfico y seleccione Guardar datos como.
Gremio
43

Process Explorer puede mostrar el tiempo total de CPU que tarda un proceso, así como un gráfico de historial por proceso.

Niall
fuente
3
Entonces, ¿cómo lo usarías para encontrar un proceso que comience a usar aleatoriamente más memoria o potencia del procesador en una ráfaga corta? ¿Podrías dar más detalles?
Xitcod13
Haga clic con el botón derecho en los encabezados de las columnas, elija Seleccionar columnas, luego marque "Historial de CPU" en "Rendimiento del proceso"
Laurent del
¿Puedes restablecerlo a cero?
Simon_Weaver
¿Puedo iniciar sesión en un archivo con el consumo de memoria de un PID determinado?
Royi
Solo quería señalar a otros usuarios: el gráfico de CPU para cada proceso solo comienza a grabar después de abrirlo por primera vez, incluso si Process Explorer estaba abierto, por lo que este método es prácticamente inútil para capturar un evento esporádico y tratar de aislarlo a un solo proceso. Señalaré que si hace clic en el gráfico de la CPU del sistema global (que comienza a grabar al abrir Process Explorer) y coloca el mouse sobre cualquier punto, mostrará el proceso que más usó la CPU en ese punto.
SUM1
19

Usando perfmon.exe, he intentado usar el contador "Bytes privados" en los contadores "Proceso" para rastrear el uso de memoria y funciona bien.

CppNoob
fuente
1
Esta es la respuesta correcta. También puede obtener información de la CPU en Proceso. Haga clic en Proceso, luego seleccione su aplicación (Firefox en su ejemplo) en las instancias del objeto seleccionado.
Chris McCowan
11

tal vez puedas usar esto. Debería funcionar para usted e informará el tiempo del procesador para el proceso especificado.

@echo off
: Rich Kreider <[email protected]>
: report processor time for given process until process exits (could be expanded to use a PID to be more
: precise)
: Depends:  typeperf
: Usage:  foo.cmd <processname>

set process=%~1
echo Press CTRL-C To Stop...
:begin
for /f "tokens=2 delims=," %%c in ('typeperf "\Process(%process%)\%% Processor Time" -si 1 -sc 1 ^| find /V "\\"') do (
if %%~c==-1 (
goto :end
) else (
echo %%~c%%
goto begin
)
)

:end
echo Process seems to have terminated.
Rich Kreider
fuente
7

Estoy de acuerdo, perfmon.exe le permite agregar contadores (clic derecho en el panel derecho) para cualquier proceso que desee monitorear.

Objeto de rendimiento: Proceso Marque "Seleccionar instancias de la lista" y seleccione firefox.

Ady Romantika
fuente
1
Gracias. ¿Cómo veo el historial de uso de la CPU durante un tiempo predefinido, como una hora?
Eli Bendersky
6

WMI es Instrumental de administración de Windows, y está integrado en todas las versiones recientes de Windows. Le permite realizar un seguimiento programático de cosas como el uso de CPU, E / S de disco y uso de memoria.

Perfmon.exe es una interfaz gráfica de usuario para esta interfaz y puede monitorear un proceso, escribir información en un registro y permitirle analizar el registro después del hecho. No es el programa más elegante del mundo, pero hace el trabajo.

doflynn
fuente
55
Técnicamente, perfmon es una interfaz para la API subyacente de Windows Performance Counter que es anterior a WMI por muchos años. WMI también expone la API del contador de rendimiento dentro de su espacio de nombres.
Rob Walker
2

Process Lasso está diseñado más para la automatización de procesos y la optimización de la clase de prioridad, no para gráficos. Dicho esto, se hace la oferta historia de utilización de la CPU por proceso (dibujado como una línea blanca en el gráfico) pero sí NO ofrecer la historia de uso de memoria por proceso.

DESCARGO DE RESPONSABILIDAD: Soy el autor de Process Lasso, pero en realidad no lo estoy respaldando aquí, ya que hay mejores soluciones (perfmon es el mejor).

Lo mejor de todo es Windows Vista + Resource and Performance Monitor. Puede rastrear el uso de accesos de CPU, memoria, red y disco por procesos a lo largo del tiempo. Es una gran utilidad general de información del sistema que debería haberse creado hace mucho tiempo. A menos que me equivoque, puede rastrear la utilización de CPU y memoria por proceso a lo largo del tiempo (entre otras cosas enumeradas).

dyasta
fuente
2

También puede intentar usar un script C # / Perl / Java para obtener los datos de utilización utilizando los comandos WMI, y a continuación se detallan los pasos para ello.

Necesitamos ejecutar 2 consultas WMI Select y aplicar la fórmula de utilización de CPU%

1. Para recuperar el número total de procesos lógicos

select NumberOfLogicalProcessors from Win32_ComputerSystem

2. Para recuperar los valores de PercentProcessorTime, TimeStamp_Sys100NS (se ha aplicado la fórmula de utilización de la CPU, obtenga el porcentaje de utilización real) y WorkingSetPrivate (RAM) como mínimo 2 veces con un intervalo de suspensión de 1 segundo

select * from Win32_PerfRawData_PerfProc_Process where IDProcess=1234

3. Aplicar la fórmula de utilización de CPU%

CPU%= ((p2-p1)/(t2-t1)*100)/NumberOfLogicalProcessors

p2 indicó PercentProcessorTime recuperado por segunda vez, y p1 indica PercentProcessorTime recuperado por primera vez, t2 y t1 es para TimeStamp_Sys100NS.

Se puede encontrar un código Perl de muestra para esto en el enlace http://www.craftedforeveryone.com/cpu-and-ram-utilization-of-an-application-using-perl-via-wmi/

Esta lógica se aplica a todos los lenguajes de programación que admiten consultas WMI

Kaarthikeyan
fuente
WMI y Powershell?
PreguntonCojoneroCabrón
2

Aunque no he probado esto, ProcDump parece una mejor solución.

Descripción del sitio:

ProcDump es una utilidad de línea de comandos cuyo propósito principal es monitorear una aplicación para detectar picos de CPU y generar volcados de memoria durante un pico que un administrador o desarrollador puede usar para determinar la causa del pico. ProcDump también incluye monitoreo de ventanas bloqueadas (usando la misma definición de bloqueo de ventanas que usan Windows y Task Manager), monitoreo de excepciones no manejadas y puede generar volcados basados ​​en los valores de los contadores de rendimiento del sistema. También puede servir como una utilidad de volcado de proceso general que puede incrustar en otros scripts.

sean
fuente
1

Hmm, veo que Process Explorer puede hacerlo, aunque sus gráficos no son demasiado convenientes. Todavía estoy buscando alternativas / mejores formas de hacerlo.

Eli Bendersky
fuente
1

Perfmon.exe está integrado en Windows.

Desarrollador SaaS
fuente
1

En Windows 10, el Administrador de tareas puede mostrarle horas de CPU acumulativas. Simplemente dirígete a la pestaña "Historial de aplicaciones" y "Eliminar historial de uso". Ahora deje las cosas funcionando durante una o dos horas:

Tiempo de CPU acumulativo de Windows 10

Lo que NO hace es desglosar el uso en los navegadores por pestaña. Muy a menudo las pestañas inactivas harán una gran cantidad de trabajo, con cada pestaña abierta utilizando energía y ralentizando su PC.

Bryce
fuente
1

Se requería obtener el estado y el uso de la CPU / memoria de algunos servidores Windows específicos. Usé el siguiente script:

Este es un ejemplo del servicio de búsqueda de Windows.

  $cpu = Get-WmiObject win32_processor
  $search = get-service "WSearch"
  if ($search.Status -eq 'Running')
  {
  $searchmem = Get-WmiObject Win32_Service -Filter "Name = 'WSearch'"
  $searchid = $searchmem.ProcessID
  $searchcpu1 = Get-WmiObject Win32_PerfRawData_PerfProc_Process | Where {$_.IDProcess -eq $searchid}
  Start-Sleep -Seconds 1
  $searchcpu2 = Get-WmiObject Win32_PerfRawData_PerfProc_Process | Where {$_.IDProcess -eq $searchid}
  $searchp2p1 = $searchcpu2.PercentProcessorTime - $searchcpu1.PercentProcessorTime
  $searcht2t1 = $searchcpu2.Timestamp_Sys100NS - $searchcpu1.Timestamp_Sys100NS
  $searchcpu = [Math]::Round(($searchp2p1 / $searcht2t1 * 100) /$cpu.NumberOfLogicalProcessors, 1)
  $searchmem = [Math]::Round($searchcpu1.WorkingSetPrivate / 1mb,1)
  Write-Host 'Service is' $search.Status', Memory consumed: '$searchmem' MB, CPU Usage: '$searchcpu' %'
  }

  else
  {
  Write-Host Service is $search.Status -BackgroundColor Red
  }
Prosenjit Sen
fuente
0

Uso taskinfo para el gráfico histórico de la velocidad de CPU / RAM / IO. http://www.iarsn.com/taskinfo.html

Pero estallidos de falta de respuesta, suena más como el tiempo de interrupción debido a un disco HD / SS defectuoso.

Terrik
fuente