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:
Bearbeiten: Dies sind die PerfMon-Daten für den Systemprozess in dieser Zeit und für den Prozessor mit der hohen Auslastung:
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.
windows-server-2008-r2
performance
cpu-usage
Patrick Cuff
quelle
quelle
Antworten:
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:
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.
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.
quelle
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.
quelle
Es scheint alles Kernel-Zeit zu sein, es könnten Interrupts sein, sie könnten nur von einer einzelnen CPU gehandhabt werden.
quelle
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.
quelle