Warum ist eine meiner 24 CPUs auf 100% festgelegt?

12

Ich habe ein HP ProLiant DL380 G7-System mit 2 6-Kern-CPUs und aktiviertem Hyper-Threading für insgesamt 24 logische CPUs (wie von Windows gesehen).

Beim Ausführen unserer Anwendung ist die CPU-Auslastung des gesamten Systems gut, aber einer der 24 CUPs ist zu 100% gebunden: Bildbeschreibung hier eingeben

Bearbeiten: Dies sind die PerfMon-Daten für den Systemprozess in dieser Zeit und für den Prozessor mit der hohen Auslastung: Bildbeschreibung hier eingeben

Ist das normal? Wenn nicht, gibt es eine Möglichkeit zu identifizieren, welche Prozesse diese logische CPU verwenden? Windows PerfMon, ResMon, Task-Manager und Process Explorer waren keine Hilfe, außer dass festgestellt wurde, dass die CPU zu 100% ausgelastet ist.

Patrick Cuff
quelle
29
Ich schätze, es wird verwendet, weil es von einem Prozess verwendet wird.
HopelessN00b
1
Sie wissen, dass Sie mit der Maus über das Diagramm fahren können, um einen Hinweis zu erhalten, welcher Prozess die meiste CPU auf diesem Prozessor beansprucht ?!
Lieven Keersmaekers
Ich wäre misstrauisch gegenüber dem 100k-Interrupt-Delta. Sie sollten einen Screenshot der Prozessliste von Process Explorer veröffentlichen, in dem wir sehen können, was dort für Dinge wie System, DPCs und Interrupts steht.
Gabe
@RyanRies; Unsere "Anwendung" besteht aus mehreren .NET WCF-Diensten, die auch WebSphere MQ und Überwachungssoftware von Drittanbietern umfassen.
Patrick Cuff
2
Es ist relativ teuer, einen Prozess von einer CPU auf eine andere zu verschieben, im Vergleich dazu, dass er auf derselben CPU geplant bleibt. Wenn also ein Prozess die CPU wirklich beansprucht, wird das Betriebssystem es oft vorziehen, ihn nicht zu verschieben.
Michael Hampton

Antworten:

11

Wie andere bereits betont haben, können wir aus diesem Screenshot ersehen, dass die CPU, die so hart arbeitet, ihre gesamte Zeit im Kernelmodus verbringt. (Die rote Farbe.)

Wenn Sie Powershell als Administrator ausführen, geben Sie Folgendes ein:

Get-Process | Select Name, PrivilegedProcessorTime | `
Sort-Object PrivilegedProcessorTime -Descending

Der Prozess oben in der Liste ist der Prozess, der momentan die meiste CPU-Zeit im Kernel-Modus belegt. Wenn dieser Prozess nicht "System" ist, haben Sie gerade herausgefunden, welcher Benutzermodus-Prozess diese CPU-Auslastung verursacht. Wenn der Prozess mit der höchsten privilegierten Prozessorzeit System ist, was ich vermute, ist es etwas komplizierter.

Öffnen Sie den Prozess-Explorer. Optional können Sie Ihren Symbolserver einrichten. Stellen Sie sicher, dass Sie mit voller UAC-Erhebung ausgeführt werden. Klicken Sie mit der rechten Maustaste auf den "Systemprozess" und gehen Sie zu "Eigenschaften". Gehen Sie dann zur Registerkarte Threads. Sortieren Sie die Threads nach CPU-Auslastung. Der Thread, der all diese Kernel-Modus-Arbeit verursacht, sollte hier sein. Wenn Sie sich das unter Startadresse aufgeführte Modul ansehen, sollte es Ihnen einen Hinweis darauf geben, womit die Arbeit zusammenhängt. Wenn es sich beispielsweise um NDIS.sys handelt, handelt es sich um einen Netzwerkschnittstellentreiber. Wenn Sie den Symbolserver einrichten, sollte der Name einer Funktion innerhalb eines Moduls angezeigt werden (es sei denn, das Modul gehört nicht zu Microsoft). Andernfalls wird nur ein numerischer Versatz von der Startadresse des Moduls angezeigt.

Verwenden Sie alternativ Xperf aus dem Windows Performance Toolkit, um Interrupts, DPCs usw. zu profilieren.

xperf -on PROC_THREAD+LOADER+DPC+INTERRUPT

und beenden Sie die Aufnahme mit xperf -d logfile.etl

Xperf ersetzt das alte Kernrate-Tool und kann Ihnen einige extrem detaillierte Daten liefern.

Wenn eine CPU im Kernel-Modus arbeitet, werden meistens Interrupt-Serviceroutinen ausgeführt. (ISRs) Wenn ein Interrupt auftritt, wird die Arbeit im Benutzermodus auf diesem Prozessor angehalten, und die CPU führt den für diesen Interrupt registrierten ISR aus. Wenn Sie feststellen, dass Ihre CPU übermäßig viel Zeit mit diesen Interrupts verbringt, weist dies normalerweise auf einen fehlerhaften Gerätetreiber hin, der aktualisiert werden muss.

Was für mich Bugs (kein Wortspiel beabsichtigt) zu diesem Szenario ist aber, dass es scheint , als ob alles , was Kernel - Thread, scheint dies tut , wird affinitize zu diesem einem Kern. Ich frage mich, warum der Dispatcher scheinbar nur die Ausführung des Threads auf diesem scheinbar willkürlichen Kern plant. Ich habe also das Gefühl, wir müssen herausfinden, wer diesen Gerätetreiber geschrieben hat, und ihnen zeigen, wie man DPCs mit Threads erstellt, und nicht explizit eine Affinität für Kernel-Threads festlegen usw.

Ryan Ries
quelle
IIRC, es ist ein ganz normales Verhalten für ein Betriebssystem, nur eine einzige CPU zu verwenden, um Hardware-Interrupts zu behandeln ...
Massimo
1
@Massimo Das mag bei alten Betriebssystemen der Fall gewesen sein, aber nicht mehr. Jede CPU bekommt eine eigene Interrupt-Deskriptor-Tabelle und jeder Prozessor hat eine eigene IRQL. Wenn eine CPU aus irgendeinem Grund auf einem hohen IRQL-Wert feststeckt (dh wenn sie bereits einen Interrupt bedient), kann sie keine Interrupts derselben oder einer niedrigeren Ebene empfangen, und Windows gibt den Interrupt entweder an einen anderen Prozessor weiter oder hält ihn einfach fest bis eine CPU verfügbar wird. Sogar Timer (ein Objekt, das früher nur auf CPU0 lief) verfügen jetzt über einen Prozessorauswahlalgorithmus.
Ryan Ries
Aber ja, das kann so einfach sein wie das Ausführen einer alten oder schlecht geschriebenen App, die schlecht affinisiert ist und anschließend viele Systemaufrufe ausführt. Interrupts müssen normalerweise auf derselben CPU beginnen und enden, von der aus sie aufgerufen wurden. Normalerweise wird jedoch auch eine Single-Thread-App beim Ausführen zwischen den Kernen "lastausgeglichen". Diese scheint seltsam zu sein Affinität.
Ryan Ries
@RyanRies; Ich habe das Windows Performance Toolkit auf dem System installiert und den Windows Performance Recorder verwendet. Der obige Befehl xperf lieferte weiterhin Fehler. Die hohe CPU sieht so aus, als käme sie von: Process - System; Modul - ntoskrnl.exe; Thread - Phase1Initialize; Funktion - KeZeroPages. Es passiert nur, wenn die App ausgeführt wird, also denke ich (hoffe), dass ich genug habe, um mich an die Entwickler zu wenden, aber ich bin auch an Ihren Ideen interessiert.
Patrick Cuff
23

Zeigen Sie die Spalte "CPU-Zeit" auf der Registerkarte "Details" im "Task-Manager" an und suchen Sie nach einem Prozess mit einer ständig wachsenden CPU-Zeit. Das ist dein keilförmiger Prozess. Es sollte ständig rund 4,17% CPU verbrauchen.

Evan Anderson
quelle
10

Es scheint alles Kernel-Zeit zu sein, es könnten Interrupts sein, sie könnten nur von einer einzelnen CPU gehandhabt werden.

MichelZ
quelle
+1 - Es sieht wirklich nach Kernel-Zeit aus, nicht wahr?
Evan Anderson
Erscheint das unter dem "System" -Prozess? Die PerfMon-Daten, die wir während eines Testlaufs gesammelt haben, haben 100% CPU für den "System" -Prozess.
Patrick Cuff
Ja, ich denke, das würde unter System fallen (wenn es überhaupt aufgeführt ist ...)
MichelZ
6
Könnte das nicht auch ein Treiberfehler oder eine schlechte Hardware sein, die mit einem Treiber ohne Fehlerbehebung interagiert? Oder vielleicht Software, die in einer engen Schleife in den Kernel ruft.
Zan Lynx
1
@MichelZ, Ein Benutzerprozess, der eine Reihe von Systemaufrufen ausführt (die jede Art von E / A beinhalten würden), würde so aussehen.
Reirab
6

Suchen Sie nach einem Prozess mit einer konstanten CPU-Auslastung von ~ 4% (= 1/24 der gesamten verfügbaren CPU). Das sollte derjenige sein, der ständig eine einzelne CPU belegt.

Massimo
quelle