Perché l'utilizzo totale della RAM di Resource Monitor e Task Manager non si somma nemmeno in remoto all'utilizzo totale della memoria fisica? [duplicare]


30

L'ho notato su molti computer Windows diversi, in molte occasioni diverse: l'utilizzo della RAM segnalato da Task Manager o Resource Monitor sembra spesso sommarsi a un importo significativamente inferiore a quello effettivo in uso.

Ad esempio, molte volte sul mio laptop o desktop, ho visto qualcosa come 7 GB in uso, eppure il set di RAM di lavoro è più simile a 3 GB. Non riesco proprio a capire dove viene utilizzato!

Ecco un esempio estremo che ho notato oggi in Resource Monitor su un server:

Sorvegliante delle risorse
Clicca per ingrandire

Se fai clic con il pulsante destro del mouse sull'immagine e apri in una nuova scheda e visualizzi i numeri, noterai che il Working Set (che non include la memoria virtuale non fisica) si aggiunge a circa 1,7 GB. Ottengo numeri simili aggiungendo l'utilizzo della RAM in Task Manager quando è abilitato "Mostra processi da tutti gli utenti".

Ora ecco uno screenshot della scheda Prestazioni del task manager:

Task Manager
Clicca per ingrandire

Questo dice che sono in uso 7,6 GB di memoria fisica.

Lo vedo sempre, su personal computer, laptop e ora server: l'utilizzo totale della RAM riportato dagli strumenti di sistema rappresenta solo circa 1/4 dell'utilizzo della RAM che osservo. Cosa sta succedendo ???

C'è qualche spiegazione soddisfacente di dove sia tutta la mia RAM? Cosa lo sta divorando, e perché non lascia traccia?

EDIT: Ecco un'immagine dell'utilizzo della RAM grafica, come richiesto dall'utente:

RamMap Use
Clicca per ingrandire

EDIT 2: in risposta alla risposta di James, ecco un'immagine dei processi non paginati in poolmon.exe, ordinati per dimensione:

inserisci qui la descrizione dell'immagine

Questi risultati mi confondono. poolmonafferma correttamente che ho in uso 6 GB di pool non di paging, ma tutti i processi di pool non di paging hanno dimensioni inferiori a 8 MB.

Cosa potrebbe significare questo? Non poolmonriesce a rilevare alcuni dei processi utilizzando il pool non di paging?



Puoi pubblicare una foto del tuo monitor risorse> scheda Memoria (solo la parte inferiore con i colori e i numeri). Sarebbe più eloquente.
whs

2
@Ramhound: Grazie per avermi indicato quel link! Sfortunatamente, come appena richiesto, ho caricato un'immagine della mappa grafica della memoria fisica di Resource Monitor e la porzione di standby della memoria fisica è inferiore al 2% dell'utilizzo totale della RAM. La risposta di David Schwartz suggerisce che l'uso della RAM "nascosta" proviene dalla RAM di standby (ovvero, la RAM utilizzata per i dati memorizzati nella cache e il codice non in uso), e non è questo il caso qui. Pertanto, non credo che la risposta di David spieghi cosa sta succedendo.
DumpsterDoofus

Utilizza il programma RamMap ed esplora con esso di più. Fino ad ora potrebbe esserci qualche guidatore che va storto? ma in effetti non è lo standby (cache). Esegui programmi speciali che consentono di riparare il ram o che suppongono di accelerare il computer? Qualche elemento del driver strano che sarebbe speciale per i tuoi computer?
Psycogeek,

2
Il link alla "risposta prima" non copre questo caso.
Jamie Hanrahan,

Risposte:


30

Mi dispiace, so che sembra una risposta irriverente ... ma la risposta alla domanda nel tuo titolo è "perché non dovrebbero".

O per dirla in modo più educato: c'è molto uso della RAM che non si trova nei set di lavoro privati ​​dei processi. Alcuni di questi sono nei set di lavoro condivisi dei processi, ma non è possibile avere un'idea affidabile dell'uso effettivo lì, a causa della condivisione; sommare i numeri dei processi ti darà un risultato fin troppo grande.

Altre cose che occupano la RAM, come il pool non di paging, la porzione residente del pool di paging e le parti residenti di altri usi dello spazio del kernel, non vengono affatto visualizzate nella schermata dei "processi" di Task Manager.

Per quanto riguarda il problema specifico:

Sul display del Task manager, vedi la sezione "memoria del kernel"? Hai 6 GB di "memoria non di paging" (ovvero pool non di paging). Fa parte della sezione "In uso" nel secondo grafico. Il pool non di paging non viene addebitato a nessun processo, motivo per cui l'aggiunta dei numeri per processo nel Task Manager non si avvicina al totale in uso. È probabile che alcuni driver lo stiano utilizzando. Questa è una quantità totalmente eccessiva; dovrebbe essere ben al di sotto di 1 GB. qualunque driver sia responsabile della parte eccessiva dell'utilizzo del pool non di paging è senza dubbio un bug.

RAMmap può confermarlo (nella scheda "Usa conteggi", guarda il totale di "Pool non di paging") ma non può aiutarti a trovare quale driver lo sta causando.

Ecco come trovarlo: ottenere una copia dello strumento Microsoft "poolmon". È uno strumento in modalità personaggio (ragazzo, mai) distribuito con Windows Driver Kit. Per Windows 7 il WDK è un download gratuito . Devi scaricare il tutto (è un ISO) e installarlo da quello, ma puoi scegliere di installare solo gli strumenti, se è tutto ciò che vuoi.

Trova poolmon nelle directory WDK - assicurati di scegliere quello giusto, a 32 o 64 bit - ed eseguilo dal prompt dei comandi dell'amministratore. Otterrai un display come questo:

inserisci qui la descrizione dell'immagine

Ora, premi il tasto "p" (no, non sto scherzando. Nessun menu qui!) Fino a quando la colonna "Tipo" mostra solo "Nonp". Quindi premere "b" (due volte se necessario) per ordinare la visualizzazione in ordine decrescente dalla colonna Byte (che era già stato fatto nell'esempio qui).

Quindi osserva la colonna "Tag" per la riga più in alto. Nel caso (ovviamente artificiale) mostrato qui è "Perdita". (Questo sistema esegue un driver che è stato deliberatamente corretto per causare questo problema: si tratta di un pool non di paging "con perdite").

tra l'altro, le linee evidenziate sono quelle modificate dal precedente aggiornamento a questa schermata arcaica.

Ora cerca c: \ Windows \ System32 \ Drivers per un file .sys contenente quella stringa. In questo caso dovresti cercare "Perdita", in questo modo:

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

Quindi cerca nel web i riferimenti a quella stringa e / o al nome del driver.

Tornare qui e riportare il nome completo, il nome del produttore, ecc. Dal file .sys sarebbe utile.

(La mia scommessa è che il tag che troverai sarà ECMC, il driver è intmsd.sys ed è associato a un prodotto chiamato ExpressCache o IntelliMemory. Vorrei "disinstallare" quel prodotto. C'è un aggiornamento per risolvere il problema, ma anche con la versione fissa non ho mai visto le prestazioni di un sistema migliorate da questo prodotto; essenzialmente duplica la funzionalità che è già in Windows.)

Se non riesci a trovarlo in questo modo, il passaggio successivo consiste nell'utilizzare "Windows Performance Toolkit". Cerca in questo forum quella stringa, con le risposte di magicandre1981, per un tutorial. Ignora le risposte che menzionano xperf: è una versione precedente dello strumento.

AGGIORNAMENTO: Secondo i commenti, l'OP ha fatto quanto sopra e ha scoperto che sebbene il poolmon riferisse che la dimensione totale del pool non di paging era davvero enorme, tutti i pezzi assegnati erano apparentemente minuscoli. La mia congettura (anche nei commenti) è che ciò è dovuto a quello che chiamerò pool "gonfio": il pool è stato allocato, quindi liberato, ma per qualche ragione quella quantità di RAM allocata al pool non è stata ridotta per riflettere il "liberazione" . Seguendo la procedura descritta in questa risposta da magicandre può identificare il colpevole.


Grazie per aver deciso di indagare oltre rispetto ad altri! poolmonCercherò una perdita usando oggi se ho tempo e cercherò di leggere la tua risposta più da vicino per assicurarmi di capirla. Stai dicendo che probabilmente c'è una perdita di memoria? In tal caso, è del tutto plausibile, poiché stiamo lavorando su software noti per avere orribili perdite di memoria.
DumpsterDoofus,

@DumpsterDoofus: Sì. Probabilmente c'è una perdita di memoria in un driver in modalità kernel. Ciò è diverso da una perdita di memoria in un'app.
Jamie Hanrahan,

Quindi ho finalmente iniziato a correre poolmon.exesul server in questione e ho modificato la mia domanda per includere uno screenshot. poolmonafferma che ho un pool non di paging da 6 GB (come hai sottolineato dal mio screenshot di Task Manager), ma quando guardo solo i processi "Nonp" e li ordina per dimensione, sono tutti minuscoli (il più grande è 8 MB). Hai idee sul perché poolmonnon viene rilevata la maggior parte dell'utilizzo del pool non di paging?
DumpsterDoofus

2
Ah ... il problema qui è nella parola "utilizzo". Quindi hai un pool non di paging da 6 GB, ma al momento sembra che solo una parte di esso sia in uso. Purtroppo nulla di ciò che so (non TM, non poolmon, non RAMmap) mostra la quantità di pool effettivamente utilizzata. La mia ipotesi è che ci fosse un utente di pool pesante contemporaneamente, quindi il pool è stato ampliato per adattarlo e quindi l'utente pesante è andato via. A causa del modo in cui viene gestito il pool, non è facile liberare la RAM una volta allocata, a meno che l'allocazione non sia avvenuta in grossi blocchi contigui. Suggerirei di guardare questo dopo un nuovo avvio del sistema.
Jamie Hanrahan,

C'è una versione di poolmon.exe disponibile negli Strumenti di supporto per Server 2003 ( serverfault.com/questions/84479/… ) - un po 'vecchia, ma è un semplice download da 5,2 MB e funziona ancora (almeno) su Server 2016.
mwfearnley,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.