Verfolgung der CPU- und Speicherauslastung pro Prozess


163

Ich vermute, dass eine meiner Anwendungen mehr CPU-Zyklen verbraucht, als ich möchte. Das Problem ist - es passiert in Bursts, und nur ein Blick auf den Task-Manager hilft mir nicht, da er nur die sofortige Verwendung anzeigt.

Gibt es eine Möglichkeit (unter Windows), den Verlauf der CPU- und Speicherauslastung für einen bestimmten Prozess zu verfolgen? ZB werde ich anfangen, "Firefox" zu verfolgen, und nach ungefähr einer Stunde wird ein Diagramm der CPU- und Speicherauslastung während dieser Stunde angezeigt.

Ich suche entweder ein fertiges Werkzeug oder einen programmatischen Weg, um dies zu erreichen.

Antworten:


167

Geben Sie einfach perfmonin Start > Runund drücken Sie die Eingabetaste. Wenn das Leistungsfenster geöffnet ist, klicken Sie auf das Pluszeichen (+), um dem Diagramm neue Zähler hinzuzufügen. Die Zähler sind verschiedene Aspekte der Funktionsweise Ihres PCs und werden nach Ähnlichkeit in Gruppen gruppiert, die als "Leistungsobjekt" bezeichnet werden.

Für Ihre Fragen können Sie die Leistungsobjekte "Prozess", "Speicher" und "Prozessor" auswählen. Sie können diese Zähler dann in Echtzeit sehen

Sie können auch das Dienstprogramm angeben, um die Leistungsdaten für Ihre spätere Überprüfung zu speichern. Wählen Sie dazu im linken Bereich "Leistungsprotokolle und Warnungen". (Es befindet sich direkt unter der Systemmonitor-Konsole, die die oben genannten Leistungsindikatoren bereitstellt. Wenn diese nicht vorhanden ist, klicken Sie auf "Datei"> "Snap-In hinzufügen / entfernen", klicken Sie auf "Hinzufügen" und wählen Sie "Leistungsprotokolle und Warnungen" in der Liste aus ".) Erstellen Sie unter" Leistungsprotokolle und Warnungen "eine neue Überwachungskonfiguration unter" Zählerprotokolle ". Anschließend können Sie die Zähler hinzufügen, die Abtastrate, das Protokollformat (Binär- oder Nur-Text) und den Protokollspeicherort angeben.


1
Was ist das ideale Intervall, um eine Datenprobe in einem Zählerprotokoll zu erfassen?
Steph Rose

8
MS hat die Benutzeroberfläche offensichtlich in PerformanceMonitor geändert, seit Sie dies geschrieben haben. Irgendeine Idee, wie Sie dies in Windows 2008 R2 tun?
Martin Brown

5
@MartinBrown - Gefunden dies . Es ist exzellent.
JNF

2
weiß jemand, wie man den zweiten Teil des Speicherns eines Logs auf Vista macht? Es scheint nirgendwo "Leistungsprotokolle und Warnungen" zu geben
Xitcod13

11
Klicken Sie mit der rechten Maustaste auf Datenkollektorsätze-> Benutzerdefiniert. Wählen Sie Neu-> Datenkollektorsatz. Geben Sie ihm einen Namen und wählen Sie Manuell erstellen. Weiter klicken. Wählen Sie Leistungsindikator. Weiter klicken. Fügen Sie die Leistungsindikatoren hinzu und geben Sie das Abtastintervall ein. Klicken Sie dann unter Datenkollektorsätze mit der rechten Maustaste auf Ihren Satz und klicken Sie auf "Start". Nach einiger Zeit klicken Sie mit der rechten Maustaste auf Ihr Set und klicken auf "Stop". Dann finden Sie den Bericht unter Berichte-> Benutzerdefiniert-> Ihr Set. Klicken Sie mit der rechten Maustaste auf das Diagramm und wählen Sie Daten speichern unter.
Gremio

43

Der Prozess-Explorer kann die von einem Prozess benötigte Gesamt-CPU-Zeit sowie ein Verlaufsdiagramm pro Prozess anzeigen.


3
Wie würden Sie es also verwenden, um einen Prozess zu finden, der zufällig in einem kurzen Burst mehr Speicher oder Prozessorleistung verbraucht? Könnten Sie näher darauf eingehen?
Xitcod13

Klicken Sie mit der rechten Maustaste auf Spaltenüberschriften, wählen Sie Spalten auswählen und überprüfen Sie "CPU-Verlauf" unter "Prozessleistung"
Laurent

Kannst du es auf Null zurücksetzen?
Simon_Weaver

Kann ich den Speicherverbrauch einer bestimmten PID in eine Datei einloggen?
Royi

Ich wollte nur für andere Benutzer darauf hinweisen: Das CPU-Diagramm für jeden Prozess beginnt erst mit der Aufzeichnung, nachdem Sie es zum ersten Mal geöffnet haben, selbst wenn der Prozess-Explorer geöffnet war. Daher ist diese Methode praktisch nutzlos, um ein sporadisches Ereignis zu erfassen und zu isolieren zu einem einzigen Prozess. Ich werde darauf hinweisen, dass, wenn Sie auf das globale System-CPU-Diagramm klicken (das beim Öffnen des Prozess-Explorers mit der Aufzeichnung beginnt) und mit der Maus über einen beliebigen Punkt fahren, der Prozess angezeigt wird, bei dem die CPU zu diesem Zeitpunkt am häufigsten verwendet wurde.
SUM1

19

Mit perfmon.exe habe ich versucht, den Zähler "Private Bytes" unter "Prozess" -Zähler zum Verfolgen der Speichernutzung zu verwenden, und er funktioniert gut.


1
Dies ist die richtige Antwort. Sie können auch CPU-Informationen unter Prozess abrufen. Klicken Sie auf Verarbeiten und wählen Sie dann Ihre App (in Ihrem Beispiel Firefox) unter Instanzen des ausgewählten Objekts aus.
Chris McCowan

11

Vielleicht kannst du das benutzen. Es sollte für Sie funktionieren und die Prozessorzeit für den angegebenen Prozess melden.

@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

Ich bin damit einverstanden, dass Sie mit perfmon.exe Zähler (Rechtsklick auf das rechte Feld) für jeden Prozess hinzufügen können, den Sie überwachen möchten.

Leistungsobjekt: Prozessprüfung "Instanzen aus Liste auswählen" und Firefox auswählen.


1
Vielen Dank. Wie sehe ich den Verlauf der CPU-Nutzung über einen vordefinierten Zeitraum, z. B. eine Stunde?
Eli Bendersky

6

WMI ist Windows Management Instrumentation und in alle neueren Windows-Versionen integriert. Sie können damit programmgesteuert Dinge wie CPU-Auslastung, Festplatten-E / A und Speicherauslastung verfolgen.

Perfmon.exe ist ein GUI-Frontend für diese Schnittstelle und kann einen Prozess überwachen, Informationen in ein Protokoll schreiben und es Ihnen ermöglichen, das Protokoll nachträglich zu analysieren. Es ist nicht das eleganteste Programm der Welt, aber es erledigt den Job.


5
Technisch gesehen ist perfmon eine Schnittstelle zur zugrunde liegenden Windows Performance Counter-API, die viele Jahre älter ist als WMI. WMI macht auch die Leistungsindikator-API in seinem Namespace verfügbar.
Rob Walker

2

Process Lasso wurde eher für die Prozessautomatisierung und die Optimierung von Prioritätsklassen entwickelt, nicht für Diagramme. Das heißt, es bietet einen Prozess-CPU-Auslastungsverlauf pro Prozess (in der Grafik als weiße Linie dargestellt), aber KEIN Prozess-Speicher-Auslastungsverlauf pro Prozess.

HAFTUNGSAUSSCHLUSS: Ich bin der Autor von Process Lasso, befürworte es hier jedoch nicht - da es bessere Lösungen gibt (Perfmon ist das Beste).

Das Beste ist Windows Vista + Resource and Performance Monitor. Es kann die Nutzung von CPU-, Speicher-, Netzwerk- und Festplattenzugriffen durch Prozesse im Laufe der Zeit verfolgen. Es ist ein großartiges Dienstprogramm für Gesamtsysteminformationen, das vor langer Zeit erstellt werden sollte. Sofern ich mich nicht irre, kann es die CPU- und Speicherauslastung pro Prozess im Laufe der Zeit verfolgen (unter anderem).


2

Sie können auch versuchen, mithilfe eines C # / Perl / Java-Skripts die Nutzungsdaten mithilfe von WMI-Befehlen abzurufen. Nachfolgend finden Sie die entsprechenden Schritte.

Wir müssen 2 WMI-Auswahlabfragen ausführen und die CPU% -Nutzungsformel anwenden

1. Um die Gesamtzahl der logischen Prozesse abzurufen

select NumberOfLogicalProcessors from Win32_ComputerSystem

2. Um die Werte von PercentProcessorTime abzurufen, müssen TimeStamp_Sys100NS (CPU-Auslastungsformel wurde angewendet, um den tatsächlichen Auslastungsprozentsatz abzurufen) und WorkingSetPrivate (RAM) mindestens zweimal mit einem Ruheintervall von 1 Sekunde abgerufen werden

select * from Win32_PerfRawData_PerfProc_Process where IDProcess=1234

3. Wenden Sie die CPU% -Nutzungsformel an

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

p2 zeigt an, dass PercentProcessorTime zum zweiten Mal abgerufen wurde, und p1 zeigt an, dass PercentProcessorTime zum ersten Mal abgerufen wurde. t2 und t1 sind für TimeStamp_Sys100NS.

Ein Beispiel für einen Perl-Code hierfür finden Sie unter dem Link http://www.craftedforeveryone.com/cpu-and-ram-utilization-of-an-application-using-perl-via-wmi/

Diese Logik gilt für alle Programmiersprachen, die WMI-Abfragen unterstützen


WMI und Powershell?
PreguntonCojoneroCabrón

2

Obwohl ich dies nicht ausprobiert habe, scheint ProcDump eine bessere Lösung zu sein.

Beschreibung von der Website:

ProcDump ist ein Befehlszeilenprogramm, dessen Hauptzweck darin besteht, eine Anwendung auf CPU-Spitzen zu überwachen und Crash-Dumps während einer Spitze zu generieren, mit denen ein Administrator oder Entwickler die Ursache der Spitze ermitteln kann. ProcDump umfasst auch die Überwachung von hängengebliebenen Fenstern (unter Verwendung derselben Definition eines Fensterhangs, die Windows und der Task-Manager verwenden), die Überwachung nicht behandelter Ausnahmen und kann Speicherauszüge basierend auf den Werten der Systemleistungsindikatoren generieren. Es kann auch als allgemeines Prozessspeicherprogramm dienen, das Sie in andere Skripte einbetten können.




1

Vielleicht möchten Sie einen Blick auf Process Lasso werfen .


1

Unter Windows 10 kann der Task-Manager die kumulierten CPU-Stunden anzeigen. Gehen Sie einfach zur Registerkarte "App-Verlauf" und "Nutzungsverlauf löschen". Lassen Sie die Dinge jetzt ein oder zwei Stunden laufen:

Windows 10 Kumulative CPU-Zeit

Dies führt NICHT dazu, dass die Verwendung in Browsern nach Registerkarten aufgeschlüsselt wird. Sehr oft erledigen inaktive Registerkarten eine enorme Menge an Arbeit, wobei jede geöffnete Registerkarte Energie verbraucht und Ihren PC verlangsamt.


1

Es war erforderlich, den Status und die CPU- / Speichernutzung einiger bestimmter Windows-Server abzurufen. Ich habe das folgende Skript verwendet:

Dies ist ein Beispiel für den Windows-Suchdienst.

  $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

Ich verwende taskinfo für das Verlaufsdiagramm der CPU / RAM / IO-Geschwindigkeit. http://www.iarsn.com/taskinfo.html

Aber Reaktionen, die nicht mehr reagieren, klingen eher nach einer Unterbrechungszeit aufgrund eines fehlerhaften HD / SS-Laufwerks.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.