Benutzer mit den meisten Antworten
Prozentuale CPU Auslastung der einzelnen Prozesse ermitteln

Frage
-
Hallo,
gibt es mit Powershell eine Möglichkeit die prozentuale CPU Auslastung der einzelnen Prozesse wie Sie im Taskmanager dargestellt werden zu ermitteln? Mit get-process erhalte ich lediglich die CPU(s), mit dem WMI Object win32_perfformatteddata_perfproc_process erhalte ich insgesamt Werte von weiter über 100%... ist dies ein Problem mit Mutlicore Prozessoren? Müssen diese Werte dann durch die Anzahl der Kerne geteilt werden? Für einen Lösungsvorschlag oder Alternative Vorschläge wäre ich sehr dankbar.
Antworten
-
Hallo,
habe mal was als Grundlage fuer einen Process gebaut. hier mit der ID 5860, ein IE Process, dessen aktuelle CPU-Auslastung in % alle 500 Millisekunden aktualisiert wird.
Mit der Ausgabe habe ich auf die schnelle ein wenig getrickst, dass kann man auch besser machen.do { $TS = 500 $ProcTS = Get-Process -Id 5860 $ProcTSCPU = $ProcTS.CPU Start-Sleep -MilliSeconds $TS $ProcTE = Get-Process -Id 5860 $ProcTECPU = $ProcTE.CPU $ProcRT = $ProcTECPU - $ProcTSCPU $CPUPercent = @{ Name = 'CPUPercent'; Expression = { [Math]::Round( ($ProcRT * 100 / $TS), 2) } } Clear-Host "Name CPU CPUPercent Description" "---- --- ---------- -----------" $ProcTE | Select-Object -Property Name, CPU, $CPUPercent, Description | Sort-Object -Property CPUPercent -Descending } while ($True)
Die Do While Schleif ist als Endloschleife gebaut, du musst also mit CTRL-C abbrechen!
Wenn Du die Zeilen Clear-Host und die beiden folgenden weg laesst, bekommst Du die Werte tabellarisch, mit Ihnen immer in der gleichen Zeile.
Beste Gruesse
brima- Als Antwort vorgeschlagen Alex Pitulice Dienstag, 4. Februar 2014 16:16
- Als Antwort markiert IT-Scotty Montag, 10. Februar 2014 14:31
-
Hallo,
das ist logisch, d.h. der Code funktioniert schon, wenn Du das aber so haben willst wie im TaskManger, der sich staending aktualisiert, musst du nur ein wenig Hand anlegen, ob der Aufwand aber lohnt stelle ich mal in Frage!
In dem Code siehst Du, dass die StartZeit des jeweiligen Process genommen wird, und die vom Ihm seit dem verbrauchte CPU Zeit.
Du willst dann aber z.B.: wissen, was die Processe in den letzten 2 Sekunden verbraucht haben.
Dann musst Du ganz einfach, Get-Process ausloesen, nach zwei Sekunden noch mal, dann waere auf ...
$GPL1 = Get-Process
Start-Sleep -seconds 2
$GPL2 = Get-Process... das Script bezogen $TotalSec eben diese 2 Sekunden und $_.CPU ergibt sich aus ($_.CPU 1. Lauf - $_.CPU 2. Lauf pro Process.
Bei der Loesung muss Du dann halt bedenken, dass beim 2 Lauf schon Process weggefallen sein koennten, andere hinzugekommen sind, also am besten die zuordnung ueber die ID der Processe machen.
Dann kommt hinzu, das der Taskmanager das im Millisekunden Bereich macht, so oft kannst Du gar nicht von Hand starten.Mit anderen Worten: Ich bezweifele, dass dir die Ergebnisse was bringen, wenn Du diese in einer Text Console ermittelst. Im Taskmanager kannst Du ja nach der Spalte CPU sortieren und ans kannst schnell erkennen wer gerade was braucht, das wird textbasiert eher schwierig.
Beste Gruesse
brima
Alle Antworten
-
Hallo,
CPU(s) ist Zeit die der jeweilige Process die CPU(s) genutzt hat, die man mit der Gesamtlaufzeit des Process in Beziehung setzen muss ...
... wegen Zeitknappheit hier ein Link mit einem Loesungsansatz und Erklaerung.
Beste Gruesse
brima -
Hallo,
danke für den Tipp, ich habe es auch direkt einmal ausprobiert. Leider stimmt diese Berechnung scheinbar auch nicht. Ich habe sämtliche Prozesse ausgelesen u.a. sehr viele iexplore.exe Prozesse, da es sich um einen WTS Server handelt. Allein für die dieversen Prozesse iexplore.exe komme ich dabei schon auf einen Wert von über 100%.
-
Hallo,
das ist logisch, d.h. der Code funktioniert schon, wenn Du das aber so haben willst wie im TaskManger, der sich staending aktualisiert, musst du nur ein wenig Hand anlegen, ob der Aufwand aber lohnt stelle ich mal in Frage!
In dem Code siehst Du, dass die StartZeit des jeweiligen Process genommen wird, und die vom Ihm seit dem verbrauchte CPU Zeit.
Du willst dann aber z.B.: wissen, was die Processe in den letzten 2 Sekunden verbraucht haben.
Dann musst Du ganz einfach, Get-Process ausloesen, nach zwei Sekunden noch mal, dann waere auf ...
$GPL1 = Get-Process
Start-Sleep -seconds 2
$GPL2 = Get-Process... das Script bezogen $TotalSec eben diese 2 Sekunden und $_.CPU ergibt sich aus ($_.CPU 1. Lauf - $_.CPU 2. Lauf pro Process.
Bei der Loesung muss Du dann halt bedenken, dass beim 2 Lauf schon Process weggefallen sein koennten, andere hinzugekommen sind, also am besten die zuordnung ueber die ID der Processe machen.
Dann kommt hinzu, das der Taskmanager das im Millisekunden Bereich macht, so oft kannst Du gar nicht von Hand starten.Mit anderen Worten: Ich bezweifele, dass dir die Ergebnisse was bringen, wenn Du diese in einer Text Console ermittelst. Im Taskmanager kannst Du ja nach der Spalte CPU sortieren und ans kannst schnell erkennen wer gerade was braucht, das wird textbasiert eher schwierig.
Beste Gruesse
brima -
Hallo,
habe mal was als Grundlage fuer einen Process gebaut. hier mit der ID 5860, ein IE Process, dessen aktuelle CPU-Auslastung in % alle 500 Millisekunden aktualisiert wird.
Mit der Ausgabe habe ich auf die schnelle ein wenig getrickst, dass kann man auch besser machen.do { $TS = 500 $ProcTS = Get-Process -Id 5860 $ProcTSCPU = $ProcTS.CPU Start-Sleep -MilliSeconds $TS $ProcTE = Get-Process -Id 5860 $ProcTECPU = $ProcTE.CPU $ProcRT = $ProcTECPU - $ProcTSCPU $CPUPercent = @{ Name = 'CPUPercent'; Expression = { [Math]::Round( ($ProcRT * 100 / $TS), 2) } } Clear-Host "Name CPU CPUPercent Description" "---- --- ---------- -----------" $ProcTE | Select-Object -Property Name, CPU, $CPUPercent, Description | Sort-Object -Property CPUPercent -Descending } while ($True)
Die Do While Schleif ist als Endloschleife gebaut, du musst also mit CTRL-C abbrechen!
Wenn Du die Zeilen Clear-Host und die beiden folgenden weg laesst, bekommst Du die Werte tabellarisch, mit Ihnen immer in der gleichen Zeile.
Beste Gruesse
brima- Als Antwort vorgeschlagen Alex Pitulice Dienstag, 4. Februar 2014 16:16
- Als Antwort markiert IT-Scotty Montag, 10. Februar 2014 14:31
-
Hallo Duncan,
wenn die Thematik geklärt ist, markiere bitte den Beitrag von Brima "als Antwort".
Viele Grüße,
AlexAlex Pitulice, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.