Monitoraggio dell'utilizzo della CPU e della memoria per processo


163

Ho il sospetto che una delle mie applicazioni consuma più cicli di CPU di quanti ne voglia. Il problema è che succede a raffiche e solo guardare il task manager non mi aiuta in quanto mostra solo un utilizzo immediato.

C'è un modo (su Windows) per tenere traccia della cronologia dell'utilizzo della CPU e della memoria per alcuni processi. Ad esempio, inizierò a monitorare "firefox" e dopo circa un'ora vedremo un grafico dell'utilizzo della CPU e della memoria durante quell'ora.

Sto cercando uno strumento già pronto o un modo programmatico per raggiungere questo obiettivo.

Risposte:


167

Basta digitare perfmonin Start > Rune premere invio. Quando la finestra Prestazioni è aperta, fare clic sul segno + per aggiungere nuovi contatori al grafico. I contatori sono aspetti diversi di come funziona il tuo PC e sono raggruppati per somiglianza in gruppi chiamati "Performance Object".

Per le tue domande, puoi scegliere gli oggetti prestazione "Elaborazione", "Memoria" e "Processore". È quindi possibile visualizzare questi contatori in tempo reale

È inoltre possibile specificare l'utilità per salvare i dati sulle prestazioni per l'ispezione in un secondo momento. Per fare ciò, seleziona "Registri e avvisi sulle prestazioni" nel riquadro di sinistra. (È proprio sotto la console di System Monitor che ci fornisce i contatori sopra menzionati. Se non è presente, fai clic su "File"> "Aggiungi / rimuovi snap-in", fai clic su Aggiungi e seleziona "Registri e avvisi sulle prestazioni" nell'elenco ".) Da" Registri e avvisi sulle prestazioni ", creare una nuova configurazione di monitoraggio in" Registri contatori ". Quindi è possibile aggiungere i contatori, specificare la frequenza di campionamento, il formato del registro (binario o di testo semplice) e la posizione del registro.


1
Qual è l'intervallo ideale per acquisire un campione di dati in un registro contatori?
Steph Rose,

8
MS ha ovviamente cambiato l'interfaccia utente in PerformanceMonitor da quando hai scritto questo. Qualche idea su come farlo in Windows 2008 R2?
Martin Brown,

5
@MartinBrown - Trovato questo . È eccellente
JNF,

2
qualcuno sa come fare la seconda parte del salvataggio di un registro su Vista? Sembra che non ci siano "Registri e avvisi sulle prestazioni" da nessuna parte
Xitcod13

11
Fare clic con il pulsante destro del mouse su Set di raccolte dati-> Definito dall'utente. Seleziona Nuovo-> Set di raccolta dati. Dagli un nome e seleziona Crea manualmente. Fai clic su Avanti. Seleziona Contatore delle prestazioni. Fai clic su Avanti. Aggiungi i contatori delle prestazioni e inserisci l'intervallo di campionamento. Quindi in Set di raccolte dati fai clic con il pulsante destro del mouse sul set e fai clic su "Avvia". Dopo qualche tempo fai clic con il pulsante destro del mouse sul set e fai clic su "Stop". Quindi puoi trovare il rapporto in Rapporti-> Definito dall'utente-> Il tuo set. Fare clic con il tasto destro sul grafico e selezionare Salva dati con nome.
Gremio,

43

Process Explorer può mostrare il tempo totale della CPU impiegato da un processo, nonché un grafico cronologico per processo.


3
Quindi, come lo useresti per trovare un processo che inizia casualmente usando più memoria o potenza del processore in breve tempo. Potresti elaborare?
Xitcod13,

Fare clic con il tasto destro del mouse sulle intestazioni delle colonne, selezionare Seleziona colonne, quindi selezionare "Cronologia CPU" in "Prestazioni del processo"
Laurent

puoi resettarlo a zero?
Simon_Weaver,

Posso accedere a un file con il consumo di memoria di un determinato PID?
Royi,

Volevo solo sottolineare per altri utenti: il grafico della CPU per ciascun processo inizia a registrare solo dopo averlo aperto per la prima volta, anche se Process Explorer era aperto, quindi questo metodo è praticamente inutile per catturare un evento sporadico e provare a isolarlo ad un singolo processo. Sottolineerò che se si fa clic sul grafico della CPU di sistema globale (che inizia a registrare all'apertura di Process Explorer) e si passa il mouse su qualsiasi punto, mostrerà il processo che ha maggiormente utilizzato la CPU in quel punto.
SUM1

19

Utilizzando perfmon.exe, ho provato a utilizzare il contatore "Byte privati" in Contatori "Processo" per tenere traccia dell'utilizzo della memoria e funziona bene.


1
Questa è la risposta corretta È anche possibile ottenere informazioni sulla CPU in Processo. Fai clic su Elabora, quindi seleziona l'app (Firefox nel tuo esempio) nelle istanze dell'oggetto selezionato.
Chris McCowan,

11

forse puoi usarlo. Dovrebbe funzionare per te e riporterà il tempo del processore per il processo specificato.

@echo off
: Rich Kreider <rjk@techish.net>
: 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.

7

Sono d'accordo, perfmon.exe consente di aggiungere contatori (tasto destro sul pannello di destra) per qualsiasi processo che si desidera monitorare.

Oggetto prestazioni: processo Controlla "Seleziona istanze dall'elenco" e seleziona Firefox.


1
Grazie. Come posso vedere la cronologia dell'utilizzo della cpu in un tempo predefinito, ad esempio un'ora?
Eli Bendersky,

6

WMI è Strumentazione gestione Windows ed è integrato in tutte le versioni recenti di Windows. Ti consente di tenere traccia programmaticamente di cose come l'utilizzo della CPU, l'I / O del disco e l'utilizzo della memoria.

Perfmon.exe è un front-end della GUI per questa interfaccia e può monitorare un processo, scrivere informazioni in un registro e consentire di analizzare il registro dopo il fatto. Non è il programma più elegante del mondo, ma fa il suo lavoro.


5
Tecnicamente perfmon è un'interfaccia per l'API del contatore delle prestazioni di Windows che precede WMI di molti anni. WMI espone anche l'API del contatore delle prestazioni all'interno del suo spazio dei nomi.
Rob Walker,

2

Process Lasso è progettato più per l'automazione dei processi e l'ottimizzazione della classe di priorità, non per i grafici. Ciò detto, fa offerta per processo storia utilizzo della CPU (disegnato come una linea bianca sul grafico), ma lo fa non offrono per processo storia l'utilizzo della memoria.

NOTA BENE: sono l'autore di Process Lasso, ma in realtà non lo sto approvando qui - poiché ci sono soluzioni migliori (perfmon è il migliore).

La cosa migliore di sempre è Windows Vista + Resource and Performance Monitor. Può tenere traccia dell'utilizzo della CPU, della memoria, della rete e degli accessi al disco da parte dei processi nel tempo. È una grande utility di informazioni di sistema complessive che avrebbe dovuto essere creata molto tempo fa. A meno che non mi sbagli, può tenere traccia della CPU per processo e dell'utilizzo della memoria nel tempo (tra le altre cose elencate).


2

Puoi anche provare a utilizzare uno script C # / Perl / Java per ottenere i dati di utilizzo utilizzando i comandi WMI e di seguito sono riportati i passaggi per farlo.

Dobbiamo eseguire 2 query WMI Select e applicare la formula di utilizzo% CPU

1. Per recuperare il numero totale di processo logico

select NumberOfLogicalProcessors from Win32_ComputerSystem

2. Per recuperare i valori di PercentProcessorTime, TimeStamp_Sys100NS (è stata applicata la formula di utilizzo della CPU ottenere la percentuale di utilizzo effettiva) e WorkingSetPrivate (RAM) almeno 2 volte con un intervallo di sospensione di 1 secondo

select * from Win32_PerfRawData_PerfProc_Process where IDProcess=1234

3. Applicare la formula di utilizzo% CPU

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

p2 indica PercentProcessorTime recuperato per la seconda volta e p1 indica PercentProcessorTime recuperato per la prima volta, t2 e t1 è per TimeStamp_Sys100NS.

Un esempio di codice Perl è disponibile nel link http://www.craftedforeveryone.com/cpu-and-ram-utilization-of-an-application-using-perl-via-wmi/

Questa logica si applica a tutto il linguaggio di programmazione che supporta le query WMI


WMI e Powershell?
PreguntonCojoneroCabrón

2

Anche se non l'ho provato, ProcDump sembra una soluzione migliore.

Descrizione dal sito:

ProcDump è un'utilità della riga di comando il cui scopo principale è il monitoraggio di un'applicazione per picchi di CPU e la generazione di crash dump durante un picco che un amministratore o uno sviluppatore può utilizzare per determinare la causa del picco. ProcDump include anche il monitoraggio delle finestre sospese (utilizzando la stessa definizione di finestre sospese utilizzate da Windows e Task Manager), il monitoraggio delle eccezioni non gestite e può generare dump in base ai valori dei contatori delle prestazioni del sistema. Può anche fungere da utilità di dump di processo generale che è possibile incorporare in altri script.





1

In Windows 10, Task Manager può mostrarti ore CPU cumulative. Vai alla scheda "Cronologia app" e "Elimina cronologia utilizzo". Ora lascia le cose in esecuzione per un'ora o due:

Tempo cumulativo della CPU di Windows 10

Ciò che NON fa è scomporre l'utilizzo nei browser per scheda. Molto spesso le schede inattive faranno un'enorme quantità di lavoro, con ogni scheda aperta che consuma energia e rallenta il PC.


1

Era necessario ottenere lo stato e l'utilizzo della CPU / memoria di alcuni server Windows specifici. Ho usato sotto lo script:

Questo è un esempio del servizio di ricerca di 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
  }

0

Uso taskinfo per il grafico cronologico della velocità CPU / RAM / IO. http://www.iarsn.com/taskinfo.html

Ma scoppia di insensibilità, suona più come un tempo di interruzione a causa di un disco HD / SS difettoso.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.