Warum summiert sich die gesamte RAM-Auslastung von Resource Monitor und Task Manager nicht einmal aus der Ferne zur gesamten physischen Speicherauslastung? [Duplikat]

30

Ich habe dies auf vielen verschiedenen Windows-Rechnern bemerkt, und zwar zu vielen verschiedenen Gelegenheiten: Die vom Task-Manager oder vom Ressourcenmonitor gemeldete RAM-Auslastung scheint sich häufig zu einer Menge zu summieren, die erheblich unter der tatsächlich verwendeten Menge liegt.

Zum Beispiel habe ich oft auf meinem Laptop oder meinem Desktop 7 GB im Einsatz gesehen, und dennoch entspricht die Gesamtmenge des Arbeits-RAM-Satzes eher 3 GB. Ich kann nur nicht herausfinden, wo es verwendet wird!

Hier ist ein extremes Beispiel, das mir heute im Ressourcenmonitor auf einem Server aufgefallen ist:

Ressourcenmonitor
Klicken Sie für volle Größe

Wenn Sie mit der rechten Maustaste auf das Bild klicken, eine neue Registerkarte öffnen und die Zahlen anzeigen, werden Sie feststellen, dass der Arbeitssatz (der keinen nicht physischen virtuellen Speicher enthält) sich auf etwa 1,7 GB beläuft. Ich erhalte ähnliche Zahlen, indem ich die RAM-Auslastung im Task-Manager addiere, wenn "Prozesse aller Benutzer anzeigen" aktiviert ist.

Hier ist ein Screenshot der Registerkarte "Leistung" des Task-Managers:

Taskmanager
Klicken Sie für volle Größe

Dies besagt, dass 7,6 GB physischer Speicher verwendet werden.

Ich sehe das die ganze Zeit auf PCs, Laptops und jetzt auf Servern: Die von Systemtools gemeldete RAM-Auslastung macht nur etwa 1/4 der von mir beobachteten RAM-Auslastung aus. WTF ist los ???

Gibt es eine zufriedenstellende Erklärung, wo sich mein gesamter RAM befindet? Was verschlingt es und warum hinterlässt es keine Spuren?

BEARBEITEN: Hier ist ein Bild der grafischen RAM-Nutzung, wie der Benutzer gefragt hat:

RamMap verwenden
Klicken Sie für volle Größe

BEARBEITEN 2: Als Antwort auf James 'Antwort sehen Sie hier ein Bild der nicht ausgelagerten Prozesse in poolmon.exe, sortiert nach Größe:

Bildbeschreibung hier eingeben

Diese Ergebnisse verwirren mich. poolmonEs wird korrekt angegeben, dass 6 GB nicht ausgelagerter Pool verwendet werden, aber alle nicht ausgelagerten Poolprozesse haben eine Größe von weniger als 8 MB.

Was könnte das heißen? Ist poolmonandernfalls einige der Prozesse zu erkennen , die nicht ausgelagerten Pool mit?

MüllcontainerDoofus
quelle
Können Sie bitte ein Bild von Ihrer Registerkarte Ressourcenmonitor> Speicher posten (nur der untere Teil mit den Farben und Zahlen)? Das wäre aufschlussreicher.
Whs
2
@Ramhound: Danke, dass du mich auf diesen Link verwiesen hast! Leider habe ich, wie gerade angefordert, ein Bild der grafischen Zuordnung des physischen Arbeitsspeichers von Resource Monitor hochgeladen, und der Standby-Anteil des physischen Arbeitsspeichers macht weniger als 2% des gesamten Arbeitsspeichers aus. Die Antwort von David Schwartz legt nahe, dass die "verborgene" RAM-Nutzung vom Standby-RAM stammt (dh RAM, das für zwischengespeicherte Daten und nicht verwendeten Code verwendet wird), und das ist hier nicht der Fall. Daher glaube ich nicht, dass Davids Antwort erklärt, was los ist.
DumpsterDoofus
Verwenden Sie das Programm RamMap und erkunden Sie damit mehr. aber in der Tat ist es nicht der Standby (Cache). Führen Sie spezielle Programme aus, die den RAM reparieren oder den Computer beschleunigen sollen? Irgendwelche seltsamen Treiberelemente, die speziell für Ihre Computer sind?
Psycogeek
2
Der Link zum "zuvor beantwortet" deckt diesen Fall nicht ab.
Jamie Hanrahan

Antworten:

30

Es tut mir leid, ich weiß, dass dies wie eine flippige Antwort klingt ... aber die Antwort auf die Frage in Ihrem Titel lautet "weil sie nicht sollen".

Oder, um es höflicher auszudrücken: Es wird viel RAM verwendet, das nicht in den privaten Arbeitssätzen von Prozessen enthalten ist. Einige davon befinden sich in den gemeinsam genutzten Arbeitssätzen von Prozessen. Aufgrund der gemeinsamen Nutzung können Sie jedoch keine verlässliche Vorstellung von der tatsächlichen Verwendung erhalten. Wenn Sie die Prozessnummern addieren, erhalten Sie ein viel zu großes Ergebnis.

Andere Dinge, die RAM belegen, wie der nicht ausgelagerte Pool, der residente Teil des ausgelagerten Pools und die residenten Teile anderer Kernel-Space-Anwendungen, werden in der Task-Manager-Anzeige "Prozesse" überhaupt nicht angezeigt.

In Bezug auf Ihr spezielles Problem:

Weitere Informationen finden Sie in der Task-Manager-Anzeige im Abschnitt "Kernelspeicher". Sie haben 6 GB "nicht ausgelagerten Speicher" (dh nicht ausgelagerten Pool). Dies ist Teil des Abschnitts "In Benutzung" in Ihrem zweiten Diagramm. Der nicht ausgelagerte Pool wird keinem Prozess in Rechnung gestellt, weshalb das Aufsummieren der Prozessnummern im Task-Manager nicht annähernd die Gesamtzahl der verwendeten Prozesse erreicht. Einige Treiber verwenden es höchstwahrscheinlich. Dies ist eine völlig überhöhte Menge; es sollte deutlich unter 1 GB liegen. Welcher Treiber auch immer für den übermäßigen Teil der nicht ausgelagerten Poolnutzung verantwortlich ist, ist zweifellos fehlerhaft.

RAMmap kann dies bestätigen (auf der Registerkarte "Use Counts" die Gesamtsumme für "Nonpaged Pool" anzeigen), aber es kann Ihnen nicht helfen, den Treiber zu finden, der es verursacht.

So finden Sie es: Besorgen Sie sich eine Kopie des Microsoft-Tools "poolmon". Es ist ein Zeichenmodus-Tool (Junge, ist es jemals), das mit dem Windows-Treiberkit vertrieben wird. Für Windows 7 ist das WDK ein kostenloser Download . Sie müssen das Ganze herunterladen (es ist eine ISO) und von dort installieren, aber Sie können auch nur die Tools installieren, wenn Sie dies möchten.

Suchen Sie in den WDK-Verzeichnissen nach poolmon - stellen Sie sicher, dass Sie das richtige 32- oder 64-Bit-Verzeichnis auswählen - und führen Sie es an einer Administrator-Eingabeaufforderung aus. Sie erhalten eine Anzeige wie folgt:

Bildbeschreibung hier eingeben

Drücken Sie jetzt die Taste "p" (nein, ich mache keine Witze. Keine Menüs hier!), Bis in der Spalte "Typ" nur noch "Nonp" angezeigt wird. Drücken Sie dann "b" (zweimal, falls erforderlich), um die Anzeige in absteigender Reihenfolge nach der Spalte "Bytes" zu sortieren (die hier bereits im Beispiel durchgeführt wurde).

Schauen Sie sich dann die Spalte "Tag" für die oberste Zeile an. In dem hier gezeigten (offensichtlich künstlichen) Fall handelt es sich um "Leak". (Auf diesem System wird ein Treiber ausgeführt, der absichtlich abgehört wurde, um dieses Problem zu verursachen. Es "leckt" ein nicht ausgelagerter Pool.)

Übrigens sind die hervorgehobenen Linien diejenigen, die sich seit der letzten Aktualisierung dieses archaischen Bildschirms geändert haben.

Suchen Sie nun unter c: \ Windows \ System32 \ Drivers nach einer .sys-Datei, die diese Zeichenfolge enthält. In diesem Fall würden Sie nach "Leak" wie folgt suchen:

c:\windows\system32> findstr /s Leak *.sys

Durchsuchen Sie dann das Web nach Verweisen auf diese Zeichenfolge und / oder diesen Treibernamen.

Es wäre auch hilfreich, hierher zurückzukehren und den vollständigen Namen, den Herstellernamen usw. aus der .sys-Datei anzugeben.

(Ich wette, dass das Tag, das Sie finden, ECMC ist, der Treiber intmsd.sys ist und mit einem Produkt namens ExpressCache oder IntelliMemory verknüpft ist. Ich würde dieses Produkt "deinstallieren". Es gibt ein Update, um das Problem zu beheben, aber auch Mit der festen Version konnte ich noch nie feststellen, dass die Leistung eines Systems durch dieses Produkt verbessert wurde.

Wenn dies nicht der Fall ist, verwenden Sie im nächsten Schritt das "Windows Performance Toolkit". Durchsuchen Sie dieses Forum nach dieser Zeichenfolge mit Antworten von magicandre1981, um eine Anleitung zu erhalten. Ignoriere Antworten, die xperf erwähnen - es ist eine ältere Version des Tools.

UPDATE: Laut den Kommentaren hat das OP das oben Gesagte getan und festgestellt, dass Poolmon zwar von einer riesigen Gesamtgröße des nicht ausgelagerten Pools berichtet hat, aber alle zugewiesenen Teile anscheinend winzig waren. Meine Vermutung (auch in den Kommentaren) ist, dass dies auf das zurückzuführen ist, was ich "aufgeblähten" Pool nennen werde: Pool wurde zugewiesen und dann freigegeben, aber aus irgendeinem Grund wurde die dem Pool zugewiesene RAM-Menge nicht verkleinert, um die "Freigabe" widerzuspiegeln. . Das Befolgen des in dieser Antwort von magicandre beschriebenen Verfahrens kann den Täter identifizieren.

Jamie Hanrahan
quelle
Vielen Dank, dass Sie sich die Zeit genommen haben, weitere Nachforschungen anzustellen als andere! poolmonWenn ich Zeit habe, werde ich heute nach einer undichten Stelle stöbern und versuchen, auch Ihre Antwort genauer zu lesen, um sicherzustellen, dass ich sie verstehe. Wollen Sie damit sagen, dass wahrscheinlich ein Speicherverlust vorliegt? Wenn dem so ist, ist das durchaus plausibel, da wir an Software arbeiten, von der bekannt ist, dass sie einige schreckliche Speicherlecks aufweist.
DumpsterDoofus
@DumpsterDoofus: Ja. Es liegt wahrscheinlich ein Speicherverlust in einem Kernelmodustreiber vor. Dies unterscheidet sich von einem Speicherverlust in einer App.
Jamie Hanrahan
So kam ich endlich dazu, poolmon.exeauf dem fraglichen Server zu laufen , und bearbeitete meine Frage so, dass sie einen Screenshot enthielt. poolmonStaaten Ich habe 6 GB nicht ausgelagerten Pool (wie Sie in meinem Task-Manager-Screenshot gezeigt haben), aber wenn ich nur "Nonp" -Prozesse betrachte und nach Größe sortiere, sind sie alle winzig (der größte ist 8 MB). Haben Sie eine Idee, warum poolmonder Großteil der nicht ausgelagerten Poolnutzung nicht erkannt wird?
DumpsterDoofus
2
Ah ... das Problem liegt hier im Wort "Verwendung". Sie haben also einen nicht ausgelagerten Pool mit 6 GB, aber es scheint, dass derzeit nur ein Bruchteil davon verwendet wird. Leider zeigt nichts, was ich kenne (nicht TM, nicht Poolmon, nicht RAMmap), wie viel des Pools tatsächlich in Gebrauch ist. Ich vermute, dass es zu einem Zeitpunkt einen starken Poolbenutzer gab, sodass der Pool erweitert wurde, um ihn aufzunehmen, und dann ging der starke Benutzer weg. Aufgrund der Art und Weise, wie der Pool verwaltet wird, ist es nicht einfach, den zugewiesenen RAM freizugeben, es sei denn, die Zuordnung erfolgte in großen zusammenhängenden Teilen. Ich würde vorschlagen, dies nach einem Neustart des Systems zu beobachten.
Jamie Hanrahan
In den Support-Tools für Server 2003 ( serverfault.com/questions/84479/… ) ist eine Version von poolmon.exe verfügbar. Sie ist zwar etwas alt, aber nur 5,2 MB groß und läuft immer noch auf (mindestens) Server 2016.
Mwfearnley