Wie steuern Sie die CPU-Nutzung von ntoskrnl.exe! MiWalkPageTablesRecursively

790
Vijay

Nach dem Beitrag über die Überwachung der hohen CPU-Auslastung durch den Kernel dachte ich, ich hätte ein Problem debattiert, das mich geplagt hatte, nämlich 20-30% konsistente CPU-Auslastung durch den Systemprozess. Siehe meinen vorherigen Post darüber.

Ich habe Windows Performance Analyzer eingerichtet und konnte den Vorgang darauf zurückverfolgen: WPA-Ablaufprotokoll Ich dachte, es habe mit der Seitendatei zu tun, die anhand der Funktionsnamen erraten wurde, und meine Seitendatei wurde deaktiviert und neu gestartet, aber stattdessen eine Windows-Seitendatei und warf das Fenster ein Fehler. Also habe ich eine kleine Auslagerungsdatei mit 100MB - 2048MB erstellt.

Das schien das Problem für ein paar Wochen gelöst zu haben, aber jetzt ist es wieder da, obwohl die Auslagerungsdatei nur 2 GB groß ist. Es scheint zu passieren, nachdem das System eine Weile in Betrieb war. Die aktuelle Betriebszeit beträgt 8 Tage.

Wenn ein Kernel-Experte Ratschläge gibt, was ich als nächstes versuchen sollte, würde ich das gerne tun.

Process Explorer zeigt jedoch einen anderen Thread unter dem Systemabbild. Ich weiß nicht, wie ich diesen Unterschied ausgleichen kann:

InitAnsiStringEx

Der Prozess - Explorer zeigt normalerweise das obige, zu anderen Zeiten kann er jedoch den Status des Debug - Filters anzeigen ... usw.

Wie steuern Sie die CPU-Nutzung von ntoskrnl.exe! MiWalkPageTablesRecursively

(Es ist immer ThreadID 56, glaube ich) Aber die verschiedenen Ablaufprotokolle scheinen immer zu zeigen, was wir oben als Problem gesehen haben.

BEARBEITEN

Bilder hinzugefügt, wie für RAM angefordert. Dies ist nach einem Neustart, bei dem das Problem nicht besteht.

RAM-Nutzung Arbeitssatz für Prozessdetails

Die konfigurierten Symbolpfade, wie von Blog empfohlen, um das Laden von Symbolen zu beschleunigen

Process Explorer

procexp-symbolpfad

WPA

WPA-Symbolpfad

Die Dateigrößen der Cache-Ordner

symbols info

Mehrere Versionen von dbghelp.dll wurden auf dem System gefunden. Derzeit wies man auf das System, weiß aber nicht, auf welches es zeigen soll.

dbghelp.dll versions


AKTUALISIEREN

Nachdem ich dem Link zum Finden von Zombie-Prozessen gefolgt bin, entdeckte ich die folgenden Daten (abgeschnitten, um kleinere Einträge zu entfernen)

374 total zombie processes. 334 zombies held by explorer.exe(1768) 298 zombies of Fences.exe 9 zombies of LogonUI.exe 7 zombies of chrome.exe 10 zombies held by ctfmon.exe(4568) 2 zombies of chrome.exe 7 zombies held by dopus.exe(27672) 3 zombies of AcroRd32.exe 2 zombies held by RuntimeBroker.exe(12184) 2 zombies of WWAHost.exe 1 zombie held by SkypeHost.exe(190152) 1 zombie of SkypeApp.exe 1 zombie held by SecurityHealthService.exe(4536) 1 zombie of MsMpEng.exe 1 zombie held by svchost.exe(1988) 1 zombie of userinit.exe 

Dies bedeutet, dass FENCES.exe die Ursache war. Daher habe ich das Programm aktualisiert und werde es später erneut prüfen. Auch deaktiviert Synergie, um sicherzustellen, dass dies nicht die Ursache war.

Update 2

Nach einem Neustart und Update der Zäune. Das Problem bleibt von den Zombie-Prozessen bestehen. Daher muss ich Zäune deinstallieren, um das Problem zu beheben.

Dies ist die Version von Zäunen

enter image description here

und die Liste der Zombie-Prozesse nach einem Neustart.

16 total zombie processes. 7 zombies held by explorer.exe(9484) 5 zombies of Fences.exe 1 zombie of GoogleUpdateCore.exe 1 zombie of DropboxUpdate.exe 1 zombie held by svchost.exe(1788) 1 zombie of userinit.exe 

Randnotiz

Wäre es nicht cool, wenn wir eine Software-KI hätten, die bei all diesen Dingen helfen könnte?

1
Sie haben Ihre HW-Spezifikationen und Ihre Arbeitslast nicht gepostet. Ich denke, Sie müssen einfach mehr RAM installieren, um zu vermeiden, dass Windows Arbeitssätze trimmt magicandre1981 vor 5 Jahren 0
@ magicandre1981 Ich habe 32 GB RAM. Ich habe den Beitrag mit den Details aktualisiert, die in der Antwort von Jamie Hanrahan angefragt wurden Vijay vor 5 Jahren 0
@magicandre Windows _always_ führt den Arbeitssatz-Trimmer aus. Abhängig vom RAM-Druck kann es zwar nicht wirklich etwas abschneiden - es wird jedoch immer danach gesucht, ob dies der Fall ist. Jamie Hanrahan vor 5 Jahren 0
Die ETL weist auf Speicherprobleme hin. Ich sehe Zugriff auf D: \ pagefile.sys. [Suchen Sie nach Zombie-Prozessen] (https://superuser.com/a/1326187/174557), da Sie im Laufe der Zeit mehrere synergys.exe ausführen und möglicherweise keinen Speicher freigeben. magicandre1981 vor 5 Jahren 2
@ magicandre1981 Danke für das Update. Ich habe den Beitrag mit den gefundenen Details aktualisiert und versucht herauszufinden, was getan werden kann, um die Zombies zu beseitigen! yaay Vijay vor 5 Jahren 0
ok, aktualisieren / entfernen Sie Fenses und schauen Sie, was passiert magicandre1981 vor 5 Jahren 0
@ magicandre1981 Ich glaube, ich erinnere mich an ein vorhergehendes Q, in dem gefunden wurde, dass Synergien Zombie-Prozesse hinterlassen. otoh, meintest du "Zäune" ​​von Stardock? Wenn ja, starte ich das und habe so keine derartigen Probleme gesehen. Jamie Hanrahan vor 5 Jahren 0
@JamieHanrahan Ja, es ist Zäune von Stardock. Ich hatte es nicht mehr benutzt und die Zäune deaktiviert. Möglicherweise hat die Deaktivierungsroutine einen Fehler? aber das ist eine alte Version 3.0.5, glaube ich. Ich habe es aktualisiert und werde es testen und berichten Vijay vor 5 Jahren 0
neue Anzahl von ZombieProcesses ist viel besser. Ist das Problem jetzt verschwunden? magicandre1981 vor 5 Jahren 0
Die Zahl steigt immer noch an. Habe es bei stardock gemeldet. Ich muss es deinstallieren und sehen Vijay vor 5 Jahren 0
Ok, jetzt habe ich 220 Zombiezäune, aber die CPU-Nutzung ist normal. Ich vermute also, dass Synergie die Ursache war, da ich das auch deaktiviert hatte. Vijay vor 5 Jahren 0

1 Antwort auf die Frage

2
Jamie Hanrahan

Die schnelle Antwort: Geben Sie dieser Routine weniger Arbeit. Was meiner Meinung nach bedeutet, dass entweder weniger virtueller Adressraum auf einmal verwendet wird oder mehr RAM hinzugefügt wird.

Details: Erstens, die Routine Sie sehen, MiWalkPageTablesRecursivelyhat wenig mit der Auslagerungsdatei direkt zu tun, sondern eher mit Seitentabellen . Seitentabellen sind In-Memory-Strukturen (und sind unabhängig von der Auslagerungsdatei-Konfiguration in allen Windows-Systemen vorhanden). Jeder Prozess verfügt über eine Reihe von Seitentabellen, und es gibt auch einen Satz für den Adressraum des Betriebssystems ("Kernel Space").

Seitentabellen bestehen aus Seitentabelleneinträgen. Für jede Seite (4 KB) des definierten virtuellen Adressraums des Prozesses gibt es einen PTE. Mit "definiert" meine ich, dass es den zugeordneten und den privaten festgeschriebenen Adressraum des Prozesses und gegebenenfalls AWE-Regionen enthält. Es enthält keinen reservierten oder freien Adressraum - Regionen, in denen eine Zugriffsverletzung ausgelöst würde, wenn Sie versuchen, sie zu lesen oder zu schreiben.

(Übrigens: Sie haben nicht nur noch Seitentabellen, auch wenn Sie keine Auslagerungsdatei haben. Sie haben auch weiterhin Paging- und Seitenfehler auf und von der Festplatte, auch wenn Sie keine Auslagerungsdatei haben.)

Das Problem ist wahrscheinlich nicht inhärent MiWalkPageTablesRecursively. Schließlich ist diese Funktion (oder ein Äquivalent unter einem anderen Namen) seit Windows NT 3.1 Bestandteil von Windows. Es ist in der Tatsache, dass es viel Arbeit tun muss. Dies bedeutet wahrscheinlich, dass es häufig aufgerufen wird.

Ein Hinweis darauf, warum dies der Fall ist, ist in den Routinen zu sehen, die sich früher auf dem Stapel befinden. (Das heißt, näher an der Spitze des WPA-Displays.) Es sieht so aus, als ob der Anrufer MiWalkPageTablesRecursivelyin diesem Szenario ist MiWalkPageTables, das seinerseits von angerufen wird MiAgeWorkingSet, das wiederum von angerufen wird MiTrimOrAgeWorkingSet, welches wiederum von MiProcessWorkingSets, welches angerufen wird wiederum wird gerufen von ... das ist so weit, wie wir gehen müssen.

Jeder Prozess in einem Windows-System hat eine Struktur, die als "Arbeitssatzliste" bezeichnet wird. Dies ist eine Liste aller physischen Seitennummern, die aufgrund von Seitenfehlern des Prozesses im RAM fehlerhaft waren. Der Thread (der "Balance Set Manager" -Thread) wird einmal pro Sekunde aktiviert, um die Arbeitssätze jedes Prozesses zu bereinigen und zu warten. So MiProcessWorkingSetsdurchläuft die Prozesse, mit jedem Verfahren zu tun Arbeits wiederum gesetzt.

MiProcessWorkingSetsAufrufe für jeden Prozess im System MiTrimOrAgeWorkingSet. Dieser Routinenname bezieht sich auf das "Trimmen" eines Arbeitssatzes (d. H. Das Erkennen von lange nicht verwendeten Seiten und das Entfernen dieser Seiten aus dem Prozess, um im RAM Platz für andere Dinge zu schaffen), oder "Altern" des Arbeitssatzes, was das "Alter" erhöht. Zähler für jeden Arbeitssatzlisteneintrag, auf den seit dem letzten Scannen noch nicht zugegriffen wurde, oder Nullen des Zählers, falls vorhanden. (Der Name bezieht sich auf die "Altern" -Aufgabe, die in der Buchhaltung normalerweise jeden Monat oder jeden Tag ausgeführt wird.) Der Zähler "Alter" wird dann von der Funktion "Trimmen" verwendet, um die am häufigsten nicht verwendeten Seiten zu identifizieren.

Aus der Tatsache, dass dies MiTrimOrAgeWorkingSetendet MiWalkPageTablesRecursively, können wir daraus schließen, dass sie den von den Seitentabellen definierten virtuellen Adressraum nach den Seiten durchsuchen, die sich im Arbeitssatz befinden. Bedenken Sie Folgendes: Die für MiTrimOrAgeWorkingSetdie Verarbeitung jedes Prozesses benötigte Zeit ist in etwa proportional zur Größe des virtuellen Adressraums des Prozesses. Die Gesamtzeit, die für jeden Durchlauf benötigt MiProcessWorkingSetswird, ist in etwa proportional zur Anzahl der Prozesse.

Entweder handelt es sich hier um eine sehr große Anzahl von Seiten in einem Arbeitssatz eines Prozesses oder es muss sich um viele Prozesse handeln.

Und ... warum sollte es so beschäftigt sein? Arbeitspakete werden erst nach dem Älterwerden "getrimmt", und der Betrag, um den die Arbeitspakete "gekürzt" werden, hängt vom RAM-Druck ab - das heißt, wie wenig Arbeitsspeicher Sie haben.

Hat Ihr System zu wenig RAM? Bitte posten Sie Snaps auf der Registerkarte Leistung des Task-Managers Speicherseite plus Detailseite, sortiert nach der Spalte "Arbeitssatz"; plus Registerkarte "Speicher" des Ressourcenmonitors, sortiert nach der Spalte "Harte Fehler"; und RAMmap 'Use Counts' Seite.

Bitte posten Sie mehr von Ihrem WPA-Trace, um mehr "Tiefe" der Anrufe anzuzeigen. Oder stellen Sie die .etl-Datei irgendwo in einem Freigabedienst bereit und verknüpfen Sie sie hier. (Zip es zuerst - sie komprimieren wirklich gut.)

Nebenbei: Warum Routinenamen nicht zwischen WPA und Process Explorer passen

Die eigentliche Frage für die Routinennamen wäre "warum in Process Explorer angezeigte Routennamen einfach falsch sind." In Ihrem Fall gibt es zwei Gründe, die Sie beheben müssen.

Das erste Problem ist, dass anscheinend keine Symbole für Process Explorer richtig konfiguriert sind. Die Konfiguration für Windows Performance Analyzer reicht nicht aus.

Ein sicheres Zeichen, dass Sie dieses Recht nicht haben, ist, dass alle oder fast alle Threads im Prozess "System" mit einem Modulnamen (some.sys oder something.exe, normalerweise ntoskrnl.exe) gefolgt von einem Offset angezeigt werden, wie +0x245- wie in Ihrer Bildschirmkappe. Es ist in Ordnung, einige davon zu sehen, aber Sie sollten eine ganze Reihe von Ntoskrnl sehen! routinenname gefolgt von keinem offset.

Um dieses Problem zu beheben, besuchen Sie diese Seite im Feldhandbuch zur Windows-Leistungsanalyse . Sie müssen den Symbolsuchpfad für Process Explorer festlegen. Sie können denselben Symboldateipfad verwenden, den Sie für WPA eingerichtet haben, und Sie müssen ProcExp auf eine DLL zeigen, die mit den Windows-Debugging-Tools geliefert wird. Sie müssen also die Debugging-Tools installiert haben - nicht, dass Sie den Debugger direkt verwenden, aber Process Explorer benötigt diese DLL.

Der zweite Grund für die Diskrepanz besteht darin, dass selbst wenn Sie die Symboldateien korrekt für Process Explorer festgelegt haben, die angezeigten Routinenamen nicht häufig mit den Namen einer von Performance Analyzer identifizierten Routine auf innerer Ebene übereinstimmen. Sie sollten jedoch eine Entsprechung auf einem Routinennamen am Anfang des Stapels finden (oben in der Routine-Aufrufstruktur angezeigt, wie in WPA gezeigt).

Zum Beispiel - in Ihrem Fall ist die erste Routine von Interesse KeBalanceSetManager. (Die beiden vorherigen davor sind für jeden Thread im Systemprozess gleich, aber KeBalanceSetManagerdie Routine ist die "oberste" Routine für diesen Thread.) Wenn Sie die Symbole richtig konfiguriert haben, sollte der Process Explorer einen Thread mit dem als "Startadresse", wie hier gezeigt:

here

Der Prozess-Explorer kann Sie nicht anzeigen, MiWalkPageTablesRecursivelyda es sich um etwa sechs Aufrufe des Stapels von der als Thread-Startadresse aufgezeichneten Task handelt, und es ist nicht einmal die innerste Routine (dh sie steht nicht ganz oben im Stack). Solche Informationen (auch wenn sie leicht verfügbar sind, was sie nicht sind) würden sich viel zu schnell ändern, um in einer Process Explorer-Anzeige nützlich zu sein, und versuchen es daher nicht.

Hinweis: Auch bei korrekten Symbolen ist es nicht ungewöhnlich, einige Threads im Systemprozess zu finden, die beispielsweise "Startadresse" zeigen GemCCID.sys+0xd138, wie Sie in meinem Beispiel sehen werden. Bei dem fraglichen Modul (GemCCID.sys) handelt es sich offensichtlich nicht um eines, für das Microsoft Symboldateien bereitstellt, daher muss Process Explorer nur sagen "Die Thread-Startadresse befindet sich um 0xd138 Bytes vom Anfang des Codes in dieser Datei, und das ist alles, was ich davon wissen."

Hoffe das hilft! Bitte lassen Sie mich wissen, wenn Sie weitere Fragen haben.

Vielen Dank für die ausführliche Antwort @jamiehanrahan Ich habe den Beitrag mit den Details aktualisiert, die Sie gesucht haben. Ihrer Meinung nach ist es ein anderer Prozess, der der Täter ist, oder? Ich würde denken, dass es Google Chrome wäre, da dies die ressourcenhungrigste App ist, die ich mit jeder Menge geöffneter Fenster und Registerkarten betreibe. Wie kann man sich in die Analyse der Systemfunktionsaufrufe einarbeiten? Vijay vor 5 Jahren 0
irgendwelche Vorschläge, was als nächstes zu tun ist? Denken Sie daran, zu Ubuntu zu wechseln: P Vijay vor 5 Jahren 0
Können Sie die .etl-Datei freigeben? Jamie Hanrahan vor 5 Jahren 1
Oh - für Process Explorer-Symboleinstellungen: Angenommen, Sie befinden sich auf einer 64-Bit-Maschine, für den Pfad dbghelp.dll möchten Sie `C: \ Programme (x86) \ Windows Kits \ 10 \ Debuggers \ x64 \ dbghelp.dll` . Für den Symbolpfad des Prozess-Explorers möchten Sie nicht ** zeigen auf ... \ NGenPdbs_Cache! Das enthält nur zwischengespeicherte PDBs aus den Modulen, die Unterstützung für Dot-net-Code bereitstellen, was für den Kernelmoduscode, der im Systemprozess ausgeführt wird, völlig irrelevant ist. Ändern Sie es in "srv * c: \ symbols * http: // msdl.microsoft.com / download / symbols". (Forts.) Jamie Hanrahan vor 5 Jahren 1
(...) Sie können `srv * c: \ symcache * http: // msdl.microsoft.com / download / symbols verwenden, wenn Sie möchten. Beachten Sie, dass Process Explorer das neue zwischengespeicherte Symbolformat (.symcache-Dateien) nicht kennt, das in diesem Blog beschrieben wird. Die beiden Caches können jedoch nebeneinander existieren, so dass alles funktioniert. Machen Sie sich keine Gedanken über die Ladezeiten von Symbolen in Process Explorer. Der Ordner-basierte Symboldatei-Cache im alten Stil ist für ProcExp schnell genug, da _far_ weniger Symbole als WPA nachschlagen kann. Jamie Hanrahan vor 5 Jahren 1
Und wenn Sie von diesem Blog sprechen - in der WPA-Symbolkonfiguration _ignore_ den Hinweis, den Symbolpfad zu deaktivieren, der auf den MS-Symbolserver verweist (Sie haben ihn in Ihrem Bildschirmauszug deaktiviert). Alles was Sie tun müssen, ist sicherzustellen, dass es das letzte in der Liste ist. Auf diese Weise verwendet WPA immer die lokalen Caches, bevor es ins Web geht, und verwendet den neuen Fast-Symcache, bevor der alte Ordner-basierte Cache verwendet wird. Jamie Hanrahan vor 5 Jahren 1
Nach dem Hinzufügen von "srv * c: \ symcache * http: // msdl.microsoft.com / download / symbols" zum Prozess-Explorer wird nun "KeBalanceSetManager" als TID 56 angezeigt, und die CPU-Auslastung liegt nach einer Betriebszeit von 2 Tagen bei etwa 7% . Vijay vor 5 Jahren 0
[ETL-Datei] (http://www.mediafire.com/file/1f4sz17ra94bqc4/MGMT-001.09-20-2018.20-50-30.7z/file) Das Kennwort ist "test" Vijay vor 5 Jahren 0
Wie Sie aus der Aufrufstruktur in Ihrem WPA-Bildschirmausschnitt erkennen können, ist KeBalanceSetManager in der Tat die Routine auf oberster Ebene dieses Threads (die beiden darüber nicht zu zählen, die für jeden Thread in diesem Prozess gleich sind). Ich muss mir morgen die ETL ansehen. Jamie Hanrahan vor 5 Jahren 1
Glauben Sie, dass der Zombie-Prozess die CPU-Auslastung erklärt, die wir im KeBalanceSetManager sehen? Vijay vor 5 Jahren 0
Zombie verarbeitet Plural. Sehr viel Plural ... Es ist eine Möglichkeit. Ich glaube nicht, dass KeBalanceSetManager eine Möglichkeit hat, zu überprüfen, ob der Prozess, den er betrachtet, ein Zombie ist oder nicht, daher geben all diese Zombies nur noch mehr Arbeit. Bekommst du immer noch Zombies, denen Zäune vorgeworfen werden, obwohl du sie deaktiviert hast? Vielleicht sollten Sie es einfach entfernen. Jamie Hanrahan vor 5 Jahren 0