Rastreando o uso da CPU e da Memória por processo

163

Eu suspeito que um dos meus aplicativos consome mais ciclos de CPU do que eu gostaria. O problema é - isso acontece em rajadas e apenas olhar para o gerenciador de tarefas não me ajuda, pois mostra apenas o uso imediato.

Existe uma maneira (no Windows) de rastrear o histórico de uso de CPU e memória em algum processo. Por exemplo, começarei a rastrear o "firefox" e, depois de uma hora ou mais, verei um gráfico de seu uso de CPU e memória durante essa hora.

Estou procurando uma ferramenta pronta ou uma maneira programática de conseguir isso.

Eli Bendersky
fonte

Respostas:

167

Basta digitar perfmonem Start > Rune pressione enter. Quando a janela Desempenho estiver aberta, clique no sinal + para adicionar novos contadores ao gráfico. Os contadores são aspectos diferentes de como o seu PC funciona e são agrupados por similaridade em grupos chamados "Objeto de desempenho".

Para suas perguntas, você pode escolher os objetos de desempenho "Processo", "Memória" e "Processador". Você pode ver esses contadores em tempo real

Você também pode especificar o utilitário para salvar os dados de desempenho para sua inspeção posteriormente. Para fazer isso, selecione "Logs e alertas de desempenho" no painel esquerdo. (Está bem no console do System Monitor, que fornece os contadores mencionados acima. Se não estiver lá, clique em "Arquivo"> ​​"Adicionar / remover snap-in", clique em Adicionar e selecione "Logs e alertas de desempenho" na lista ".) Em" Logs e alertas de desempenho ", crie uma nova configuração de monitoramento em" Logs de contadores ". Em seguida, você pode adicionar os contadores, especificar a taxa de amostragem, o formato do log (texto binário ou sem formatação) e o local do log.

Martin08
fonte
1
Qual é o intervalo ideal para obter uma amostra de dados em um log de contador?
Steph Rose
8
A Microsoft obviamente mudou a interface do usuário para PerformanceMonitor desde que você escreveu isso. Alguma idéia de como você faz isso no Windows 2008 R2?
Martin Brown
5
@MartinBrown - Encontrei isso . É excelente.
JNF
2
alguém sabe como fazer a segunda parte de salvar um log no Vista? Parece que não há "Logs e alertas de desempenho" em lugar algum
Xitcod13 18/12/12
11
Clique com o botão direito do mouse em Conjuntos de Coletores de Dados-> Definido pelo Usuário. Selecione Novo-> Conjunto de Coletores de Dados. Dê um nome a ele e selecione Criar manualmente. Clique em Avançar. Selecione Contador de desempenho. Clique em Avançar. Adicione os contadores de desempenho e insira o intervalo de amostra. Em Conjuntos de coletores de dados, clique com o botão direito do mouse no seu conjunto e clique em "Iniciar". Depois de algum tempo, clique com o botão direito do mouse no seu aparelho e clique em "Parar". Em seguida, você pode encontrar o relatório em Relatórios-> Definido pelo usuário-> Seu conjunto. Clique com o botão direito do mouse no gráfico e selecione Salvar dados como.
Grêmio
43

O Process Explorer pode mostrar o tempo total de CPU gasto por um processo, bem como um gráfico de histórico por processo.

Niall
fonte
3
Então, como você o utilizaria para encontrar um processo que inicia aleatoriamente o uso de mais memória ou energia do processador em um curto espaço de tempo. Você poderia elaborar?
Xitcod13
Clique com o botão direito do mouse nos cabeçalhos das colunas, escolha Selecionar Colunas e marque "Histórico da CPU" em "Desempenho do Processo"
Laurent
você pode redefinir para zero?
Simon_Weaver
Posso registrar em um arquivo o consumo de memória de um determinado PID?
Royi
Só queria apontar para outros usuários: o gráfico da CPU para cada processo só começa a gravar depois que você o abre pela primeira vez, mesmo se o Process Explorer estiver aberto, portanto esse método é praticamente inútil para capturar um evento esporádico e tentar isolá-lo. para um único processo. Vou salientar que, se você clicar no gráfico da CPU do sistema global (que começa a gravar após a abertura do Process Explorer) e passar o mouse sobre qualquer ponto, ele mostrará o processo que mais usou a CPU naquele momento.
SUM1
19

Usando perfmon.exe, tentei usar o contador "Private Bytes" em contadores "Process" para rastrear o uso da memória e funciona bem.

CppNoob
fonte
1
Essa é a resposta correta. Você também pode obter informações da CPU em Processo. Clique em Processar e selecione seu aplicativo (Firefox no seu exemplo) nas instâncias do objeto selecionado.
Chris McCowan
11

talvez você possa usar isso. Deve funcionar para você e informará o tempo do processador para o processo 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
fonte
7

Concordo que o perfmon.exe permite adicionar contadores (clique com o botão direito no painel direito) para qualquer processo que você deseja monitorar.

Objeto de desempenho: processo Marque "Selecionar instâncias da lista" e selecione Firefox.

Ady Romantika
fonte
1
Obrigado. Como vejo o histórico de uso da CPU em um tempo predefinido, como uma hora?
Eli Bendersky
6

O WMI é a Instrumentação de Gerenciamento do Windows e é incorporado a todas as versões recentes do Windows. Permite rastrear programaticamente coisas como uso da CPU, E / S de disco e uso de memória.

O Perfmon.exe é um front-end da GUI para essa interface e pode monitorar um processo, gravar informações em um log e permitir que você analise o log após o fato. Não é o programa mais elegante do mundo, mas faz o trabalho.

doflynn
fonte
5
Tecnicamente, perfmon é uma interface para a API subjacente do Windows Performance Counter, que antecede a WMI por muitos anos. O WMI também expõe a API do contador de desempenho em seu espaço de nome.
Rob Walker
2

O Process Lasso foi projetado mais para automação de processos e otimização de classe de prioridade, não gráficos. Dito isto, faz oferta história de utilização da CPU por processo (desenhada como uma linha branca no gráfico), mas ele não oferecem história utilização de memória por processo.

AVISO LEGAL: Eu sou o autor do Process Lasso, mas na verdade não estou endossando aqui - como existem melhores soluções (perfmon sendo o melhor).

A melhor coisa de todos os tempos é o Windows Vista + Resource and Performance Monitor. Ele pode rastrear o uso de CPU, memória, rede e acesso ao disco por processos ao longo do tempo. É um ótimo utilitário geral de informações do sistema que deveria ter sido criado há muito tempo. A menos que eu esteja enganado, ele pode rastrear a utilização da CPU e da memória por processo ao longo do tempo (entre outras coisas listadas).

dyasta
fonte
2

Você também pode tentar usar um script C # / Perl / Java para obter os dados de utilização usando os comandos WMI, e abaixo estão as etapas para isso.

Precisamos executar 2 consultas de seleção WMI e aplicar a fórmula de utilização da CPU

1. Para recuperar o número total de processos lógicos

select NumberOfLogicalProcessors from Win32_ComputerSystem

2. Para recuperar os valores de PercentProcessorTime, TimeStamp_Sys100NS (a fórmula de utilização da CPU foi aplicada, obtenha a porcentagem real de utilização) e WorkingSetPrivate (RAM) no mínimo 2 vezes com um intervalo de sono de 1 segundo

select * from Win32_PerfRawData_PerfProc_Process where IDProcess=1234

3. Aplique a fórmula de utilização da CPU%

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

p2 indicou PercentProcessorTime recuperado pela segunda vez e p1 indica o PercentProcessorTime recuperado pela primeira vez, t2 e t1 são para TimeStamp_Sys100NS.

Um exemplo de código Perl para isso pode ser encontrado no link http://www.craftedforeveryone.com/cpu-and-ram-utilization-of-an-application-using-perl-via-wmi/

Essa lógica se aplica a toda linguagem de programação que suporta consultas WMI

Kaarthikeyan
fonte
WMI e PowerShell?
PreguntonCojoneroCabrón
2

Embora eu não tenha tentado isso, o ProcDump parece uma solução melhor.

Descrição do site:

ProcDump é um utilitário de linha de comando cujo objetivo principal é monitorar um aplicativo quanto a picos de CPU e gerar despejos de falha durante um pico que um administrador ou desenvolvedor pode usar para determinar a causa do pico. O ProcDump também inclui monitoramento de janela travada (usando a mesma definição de travamento de janela usada pelo Windows e pelo Gerenciador de Tarefas), monitoramento de exceção não tratada e pode gerar despejos com base nos valores dos contadores de desempenho do sistema. Ele também pode servir como um utilitário geral de despejo de processo que você pode incorporar em outros scripts.

sean
fonte
1

Hmm, vejo que o Process Explorer pode fazê-lo, embora seus gráficos não sejam muito convenientes. Ainda à procura de alternativas / melhores maneiras de fazê-lo.

Eli Bendersky
fonte
1

Perfmon.exe está embutido no Windows.

Desenvolvedor SaaS
fonte
1

Você pode dar uma olhada no Process Lasso .


fonte
1

No Windows 10, o Gerenciador de tarefas pode mostrar as horas acumuladas da CPU. Basta acessar a guia "Histórico do aplicativo" e "Excluir histórico de uso". Agora deixe as coisas funcionando por uma ou duas horas:

Tempo de CPU cumulativo do Windows 10

O que isso NÃO faz é dividir o uso nos navegadores por guia. Muitas vezes, as guias inativas fazem uma enorme quantidade de trabalho, com cada guia aberta usando energia e diminuindo a velocidade do seu PC.

Bryce
fonte
1

Havia um requisito para obter o status e o uso da CPU / memória de alguns servidores Windows específicos. Eu usei o script abaixo:

Este é um exemplo do Serviço de Pesquisa do 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
fonte
0

Eu uso o taskinfo para o gráfico do histórico de velocidade da CPU / RAM / IO. http://www.iarsn.com/taskinfo.html

Porém, surtos de falta de resposta parecem mais com o tempo de interrupção devido a uma unidade HD / SS falsa.

Terrik
fonte