none
Terminalserver hohe CPU-Last via PS auslesen RRS feed

  • Frage

  • Hallo,

    ich würde gern mittels PowerShell die CPU-Last meines Terminalservers auslesen.

    Gelegentlich passiert es, dass sich der Terminalserver "festfrisst", bedeutet irgend ein Prozess verursacht 100% Prozessorlast und bei allen Usern friert die Sitzung fest.

    Das große Problem dabei, ich komme als Admin (wenn er in diesem Stadium ist) weder an die Konsole (Anmeldebildschirm) noch via mstsc (Remotedesktopverbindung) ran - und so bleibt mir meist nur einen Kaltstart durchzuführen.

    Heute ist dieses Problem wieder vorgekommen und ich konnte mir mittels psexec von einem anderem Server und "tasklist /v" auslesen welche prozesse ausgeführt worden sind, allerdings stehen dort keine Werte der CPU-Last mit drin.

    Ich hatte gehofft, dass ich nun mittel PowerShell "Get-Process" weiterkomme, aber auch dort sehe ich keine Prozentwerte...? Im Grund würde mir der Taskmanager mit seinen Werten auf cmd-Ebene reichen. Gibt es vielleicht ein cmd-tool für den Taskmanager?

    Mich interessieren nur ProzessID, Prozessname, CPU-Last, Benutzer

    So wäre es mir jedenfalls in Zukunft möglich den verursachenden Prozess zu ermitteln und ggf. zu killen.

    Vielleicht gibt es einen Power-Shell Guru der sowas zusammenbauen kann, bin auch über google nicht fündig geworden.

    Gruß

    Daniel

    Freitag, 17. März 2017 10:04

Antworten

  • > Vielleicht gibt es einen Power-Shell Guru der sowas zusammenbauen kann, bin auch über google nicht fündig geworden.

    Sicher, das wird aber niemand tun.Wir helfen dir aber gerne das selbst zu machen. :)
    Aber sei dir klar, das du dir da nicht die leichteste Aufgabe ausgesucht hast, insbesondere wenn der ganze Prozess (Konstantes Monitoring der CPU-Last -> Erkennung des "Freeze" -> automatischer Neustart) automatisiert ablaufen soll. Ohne solide PoSh-Kenntnisse wird das -auch mit Hilfe- befürchte ich, nix werden. Ich hab sowas kürzlich erst für einen Kunden für ne größere Umgebung gebaut...

    Ich würde mich zunächst auf die Kernaufgabe, die Prozessor-Auslastung zuverlässig auszulesen, beschränken. Dafür ist es am sinnvollsten dafür Perfmon-Counter zu benutzen und zwar "% Processor time", Beispiele siehe hier: LINK (Achtung: die Namen der  Perfmon-Counter sind -leider,leider- lokalisiert, d.h. auf nem deutschen System heisst dieser z.b. "prozessorzeit (%)")

    Es ist aber ebenso wichtig zu verstehen, was das ist "Prozessorzeit" und wie genau du daraus sinnvoll das ableitetest was du eigentlich wissen willst. Das ist nicht ganz so klar und eindeutig wie du aktuell wahrscheinlich meinst. Lies mal hier, hier und wenn du dann noch Lust hast: hier.

    Auch musst du dir Indikatoren überlegen, wann der Zustand des "Freeze" eigentlich erreicht ist, du möchtest ja nicht das der Server rebootet, nur weil die Last mal kurz bei 100% ist.

    Damit würde ich mal anfangen.

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Code Manager v5: Link
    (u.a. Codesnippets verwalten + komplexe Scripte graphisch darstellen)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.


    Freitag, 17. März 2017 12:36
    Moderator
  • Ich bin nicht sicher, ob das der richtige Ansatz ist, denn unabhängig davon, was du genau wie mit irgendwelchen PowerShell-Kommandos auslesen kannst, zu diesem Zeitpunkt ist das Kind schon in den Brunnen gefallen. Als Startpunkt würde ich mir mit Perfmon ein Data Collector Set einrichten und hinterher schauen, welche(r) Prozess(e) wieviele Ressourcen verwendet haben.

    https://technet.microsoft.com/en-us/library/cc749337(v=ws.11).aspx
    https://technet.microsoft.com/en-us/library/cc788038(v=ws.11).aspx

     
    Dienstag, 21. März 2017 20:53
  • Schade dass in diesem Thread [https://social.technet.microsoft.com/Forums/de-DE/0435e7c5-3cda-41a0-953e-7fa462fde03b/perfmon-process-processor-time-vs-task-managers-cpu-usage-for-monitoring-a-specific-user?forum=perfmon] keiner mehr geantwortet hat, mich würde es nun interessieren ob die Formel richtig ist oder nicht....

    Moin,

    das Problem ist, die beiden sind sich nicht einig, welches Ergebnis sie haben wollen, daher kann die Formel weder richtig noch falsch sein. Für jeden ist jeweils seine Formel richtig, nur sind die Werte, die rauskommen, unterschiedlich zu interpretieren.

    Deine Herausforderung, wenn ich sie richtig verstanden habe, ist doch eigentlich viel simpler: Du willst diejenigen Nicht-System-Prozesse identifizieren, die besonders viel CPU verbraten. Dann vergiss doch einfach mal die relativen Werte und werte die absolute CPU-Zeit aus, die liefert Dir Get-Process sogar als TimeSpan-Objekt.

    Was Joachim unten schreibt, ist allerdings auch nicht von der Hand zu weisen: ein kumulierter Wert wäre hier besonders nützlich.


    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> http://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com

    Dienstag, 21. März 2017 21:47

Alle Antworten

  • Hallo,

    hier kommst du besser, wenn du über WMI gehst, schau dir dazu mal die Class Win32_Process und win32_Processor an.

    Get-WmiObject -Class win32_Processor
    Get-WmiObject -Class win32_process

    Grüße Andy

    Freitag, 17. März 2017 10:44
  • > Vielleicht gibt es einen Power-Shell Guru der sowas zusammenbauen kann, bin auch über google nicht fündig geworden.

    Sicher, das wird aber niemand tun.Wir helfen dir aber gerne das selbst zu machen. :)
    Aber sei dir klar, das du dir da nicht die leichteste Aufgabe ausgesucht hast, insbesondere wenn der ganze Prozess (Konstantes Monitoring der CPU-Last -> Erkennung des "Freeze" -> automatischer Neustart) automatisiert ablaufen soll. Ohne solide PoSh-Kenntnisse wird das -auch mit Hilfe- befürchte ich, nix werden. Ich hab sowas kürzlich erst für einen Kunden für ne größere Umgebung gebaut...

    Ich würde mich zunächst auf die Kernaufgabe, die Prozessor-Auslastung zuverlässig auszulesen, beschränken. Dafür ist es am sinnvollsten dafür Perfmon-Counter zu benutzen und zwar "% Processor time", Beispiele siehe hier: LINK (Achtung: die Namen der  Perfmon-Counter sind -leider,leider- lokalisiert, d.h. auf nem deutschen System heisst dieser z.b. "prozessorzeit (%)")

    Es ist aber ebenso wichtig zu verstehen, was das ist "Prozessorzeit" und wie genau du daraus sinnvoll das ableitetest was du eigentlich wissen willst. Das ist nicht ganz so klar und eindeutig wie du aktuell wahrscheinlich meinst. Lies mal hier, hier und wenn du dann noch Lust hast: hier.

    Auch musst du dir Indikatoren überlegen, wann der Zustand des "Freeze" eigentlich erreicht ist, du möchtest ja nicht das der Server rebootet, nur weil die Last mal kurz bei 100% ist.

    Damit würde ich mal anfangen.

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Code Manager v5: Link
    (u.a. Codesnippets verwalten + komplexe Scripte graphisch darstellen)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.


    Freitag, 17. März 2017 12:36
    Moderator
  • Auch musst du dir Indikatoren überlegen, wann der Zustand des "Freeze" eigentlich erreicht ist, du möchtest ja nicht das der Server rebootet, nur weil die Last mal kurz bei 100% zu hoch ist.

    Damit würde ich mal anfangen.

    ganz ruhig, ich will keine vollautomatisierte Lösung!

    Es geht mir nur darum den schuldigen Prozess zu finden. Wenn der freeze das nächste mal passiert will ich einfach nur noch via PSexec mein PowerShell Script starten um zu wissen welcher Prozess es ist und diesen ggf. zu beenden - in der Hoffnung der Terminalserver läuft danach wieder ohne Probleme weiter.

    Hab nun auch schon einige Blogs und Foren studiert, aber kein Befehl kann mir mit einfachen Mitteln die CPU-Last des Prozesses in % anzeigen - ich wünsche mir nen taskmgr.exe auf cmd-basis... =(

    Mit den zwei Befehlen bekomme ich schonmal den namen und die ID, jetzt muss ich nur noch ne PowerShell-Bibel finden um noch die Last-% und den Besitzer reinzupflanzen... =P

    Get-Process | select id,name,cpu | sort CPU -Descending

    Get-WmiObject -Class win32_process | select processid,processname


    arrghh, ausgerechnet bei Get-Process wird kein Besitzer des Prozesses als Attribut mitgeliefert

    Freitag, 17. März 2017 12:45
  • Ich sehe schon, du bist noch im "das muss doch eigentlich ganz einfach gehen"-Stadium. :)  Na dann mach mal... :)


    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Code Manager v5: Link
    (u.a. Codesnippets verwalten + komplexe Scripte graphisch darstellen)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Freitag, 17. März 2017 13:00
    Moderator
  • > arrghh, ausgerechnet bei Get-Process wird kein Besitzer des Prozesses als Attribut mitgeliefert
     
    Ach nicht doch...
     
    Get-Process -IncludeUserName
     
    Muß dann aber als Admin laufen :)
     
    Freitag, 17. März 2017 13:07
  • Ich sehe schon, du bist noch im "das muss doch eigentlich ganz einfach gehen"-Stadium. :)  Na dann mach mal... :)

    Ich bin ja immer der Meinung Microsoft kann es den Administratoren nicht so schwer machen, aber wie ich sehe zerreißen sich hier die Forenmitglieder gegenseitig das Maul und im Endeffekt hat keiner Recht und keiner Ahnung...

    Was mir halt nicht in den Kopf will, warum zeigt man im Taskmanager %-Werte an die man mit PowerShell nicht abrufen kann? Beim letzten Lehrgang hies es, mit PowerShell ist fast alles möglich. Das sowas simples gerade nicht dazugehört, ist ehrlich gesagt ein ziemliches Armutszeugnis.

    Schade dass in diesem Thread [https://social.technet.microsoft.com/Forums/de-DE/0435e7c5-3cda-41a0-953e-7fa462fde03b/perfmon-process-processor-time-vs-task-managers-cpu-usage-for-monitoring-a-specific-user?forum=perfmon] keiner mehr geantwortet hat, mich würde es nun interessieren ob die Formel richtig ist oder nicht....

    <Zitat>

    Using Bruce formula :
    Real process CPU would be = 1.0002 / 2 cores * 0.6000 = 30.01 % => WRONG

    Using my formula :
    Real process CPU would be = 1.0002 / 2 cores = 50.01 % => TRUE (the process does stress 1 whole CPU)
    ...and it does confirm the value reported in the Task Manager.

    </Zitat>

    Danke für die Links, sehr informativ, werde mal weiter stöbern =)

    Freitag, 17. März 2017 13:20
  • Ich bin nicht sicher, ob das der richtige Ansatz ist, denn unabhängig davon, was du genau wie mit irgendwelchen PowerShell-Kommandos auslesen kannst, zu diesem Zeitpunkt ist das Kind schon in den Brunnen gefallen. Als Startpunkt würde ich mir mit Perfmon ein Data Collector Set einrichten und hinterher schauen, welche(r) Prozess(e) wieviele Ressourcen verwendet haben.

    https://technet.microsoft.com/en-us/library/cc749337(v=ws.11).aspx
    https://technet.microsoft.com/en-us/library/cc788038(v=ws.11).aspx

     
    Dienstag, 21. März 2017 20:53
  • Schade dass in diesem Thread [https://social.technet.microsoft.com/Forums/de-DE/0435e7c5-3cda-41a0-953e-7fa462fde03b/perfmon-process-processor-time-vs-task-managers-cpu-usage-for-monitoring-a-specific-user?forum=perfmon] keiner mehr geantwortet hat, mich würde es nun interessieren ob die Formel richtig ist oder nicht....

    Moin,

    das Problem ist, die beiden sind sich nicht einig, welches Ergebnis sie haben wollen, daher kann die Formel weder richtig noch falsch sein. Für jeden ist jeweils seine Formel richtig, nur sind die Werte, die rauskommen, unterschiedlich zu interpretieren.

    Deine Herausforderung, wenn ich sie richtig verstanden habe, ist doch eigentlich viel simpler: Du willst diejenigen Nicht-System-Prozesse identifizieren, die besonders viel CPU verbraten. Dann vergiss doch einfach mal die relativen Werte und werte die absolute CPU-Zeit aus, die liefert Dir Get-Process sogar als TimeSpan-Objekt.

    Was Joachim unten schreibt, ist allerdings auch nicht von der Hand zu weisen: ein kumulierter Wert wäre hier besonders nützlich.


    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> http://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com

    Dienstag, 21. März 2017 21:47