Windows utilizza troppa RAM, come diagnosticare il porco di risorse


73

Ho 16 GB di RAM di sistema. All'avvio senza applicazioni aperte tranne il task manager di Windows utilizza circa 3 GB di RAM. Ho guardato nella scheda dei processi, ma nulla sembra essere fuori dal comune. Come faccio a sapere perché Windows utilizza così tanta RAM.

inserisci qui la descrizione dell'immagine

tutti i processi da tutti gli utenti

inserisci qui la descrizione dell'immagine


Leggendo dal poolmon sembra che il mio driver wireless Broadcom stia usando circa 0,4 GB di RAM. Anche se lo rimuovo, utilizzerei comunque 2,6 GB all'avvio, il che è ancora troppo.

inserisci qui la descrizione dell'immagine


Dopo aver reinstallato il driver wireless associato alla perdita di memoria. Ho un nuovo screenshot e vorrei confermare che era davvero una perdita di memoria.

inserisci qui la descrizione dell'immagine


3
Prima di tutto, hai solo 12 GB. Uno dei quattro stick da 4 GB è danneggiato o mal posizionato o la scheda madre non supporta 16 GB. In secondo luogo, hai provato a eseguire programmi di sicurezza per verificare la presenza di malware? Security Essentials è integrato, quindi assicurati di aggiornare le sue definizioni ed eseguire una scansione. Prova anche alcuni programmi anti-rootkit poiché i rootkit si nascondono specificamente (anche se di solito cercano di mantenere un profilo basso per passare inosservati, e l'utilizzo di un paio di gigabyte di RAM difficilmente si confonde).
Synetech,

Potresti voler guardare le prestazioni -> monitoraggio delle risorse
Journeyman Geek

Prova a eseguire il comando tasklist reindirizzando il suo output su un file, C: \ blah> tasklist> aa, quindi apri il file aa, vedrai i totali per ogni processo, ad esempio 15.100K, rimuovi la K dopo di essi e somma il totale con Excel. Verifica se il totale corrisponde alla figura utilizzata che il task manager ti fornisce vicino al suo grafico per usato. Per me il totale dalla lista delle attività è di 4 GB e il task manager dice 4,5 GB. Non riesco a spiegare la discrepanza che ho ma non è enorme. sarebbe interessante se hai un'enorme discrepanza.
barlop

Non ho eccellenza
Vader

1
I tag NDxx sono ndis.sys. Immagino che BRCM fosse Broadcom. Ciò significherebbe che la scheda di rete è il problema.
David Marshall,

Risposte:


82

Si è verificata una perdita di memoria causata da un driver. Guarda l'alto valore della memoria del kernel non di paging. Nel tuo caso questo è superiore a 3,7 GB. È possibile utilizzare poolmon per vedere quale driver sta causando l'utilizzo elevato.

Installa il WDK di Windows , esegui poolmon, ordinalo tramite il Ptipo di pool after in modo che il non paging sia in cima e tramite i Bbyte after per vedere il tag che utilizza la maggior parte della memoria. Esegui poolmon accedendo alla cartella in cui è installato WDK, vai su Strumenti (o C: \ Programmi (x86) \ Windows Kits \ 10 \ Tools \ x64) e fai clic su poolmon.exe.

Ora guarda quale pooltag utilizza la maggior parte della memoria, come mostrato qui:

inserisci qui la descrizione dell'immagine

Ora apri un prompt cmd ed esegui il comando findstr. Per fare ciò, apri il cmd prompt e digita "cd C: \ Windows \ System32 \ drivers", senza virgolette. Quindi digitare "findstr / s __ . ", Dove __ è il tag (il nome più a sinistra in poolmon). Fai questo per vedere quale driver usa questo tag:

inserisci qui la descrizione dell'immagine

Ora vai alla cartella dei driver (C: \ Windows \ System32 \ drivers) e fai clic con il pulsante destro del mouse sul driver in questione (intmsd.sys nell'esempio di immagine sopra). Fai clic su Proprietà, vai alla scheda dettagli per trovare il nome del prodotto. Cerca un aggiornamento per quel prodotto.

Se il pooltag mostra solo i driver di Windows o è elencato in pooltag.txt ( "C:\Program Files (x86)\Windows Kits\8.1\Debuggers\x64\triage\pooltag.txt")

hai usato xperf per tracciare ciò che causa l'utilizzo . Installa WPT da Windows SDK , apri un cmd.exe come admin ed esegui questo:

xperf -on PROC_THREAD + LOADER + POOL -stackwalk PoolAlloc + PoolFree + PoolAllocSession + PoolFreeSession -BufferSize 2048 -MaxFile 1024 -FileMode Circular && timeout -1 && xperf -d C: \ pool.etl

catturare 30 -60 anni di crescita. Aprire ETL con WPA.exe, aggiungere i grafici del pool al riquadro di analisi.

Metti la colonna pooltag al primo posto e aggiungi la colonna dello stack. Ora carica i simboli all'interno di WPA.exe ed espandi lo stack del tag che hai visto in poolmon.

inserisci qui la descrizione dell'immagine

Ora trova altri driver di terze parti che puoi vedere nello stack. Qui il Thretag (Thread) è utilizzato da AVKCl.exe da G-Data. Cerca aggiornamenti driver / programma per risolverlo.


1
Oh scusa. @Jebediah Kerman hai eseguito il comando findstr? Dal nome potrebbe essere correlato al driver della scheda di rete. Se i problemi persistono, eseguire RAMMap, archiviare i dati come RMP, comprimere il file RMP e caricare lo zip.
magicandre1981,

questo può sembrare stupido. Ma come posso iniziare poolmon. Ero in grado di cercare "poolmon.exe" e avviare
Vader

@JebediahKerman Penso che tu l'abbia già fatto e abbia trovato i tag. L'immagine del tuo post non è il tuo poolmon?
magicandre1981

L'immagine è mia. per qualche motivo l'indice di ricerca era incompleto.
Vader,

@JebediahKerman hai visto cos'è questo NDFT? Puoi anche usare xperf per tracciare l'utilizzo del pool: channel9.msdn.com/Shows/Defrag-Tools/…
magicandre1981

15

Bene, prima cosa, prima di entrare in una risposta più dettagliata. Nella prima schermata, il pool non paginato (un tipo di utilizzo della memoria del kernel) è di 1,3 GB. Mi sembra insolitamente alto, soprattutto per soli 30 minuti dopo l'avvio. Immagino di poter vedere NP Pool ottenere così in alto dopo un lungo periodo di utilizzo o con un programma che perdeva come un setaccio. Al contrario, il mio pool NP è in genere compreso tra 100 e 200 megabyte e il mio pool di paging potrebbe arrivare a 400 o 500 (e cioè dopo avere il sistema in esecuzione senza riavvio per settimane).


È possibile abilitare alcune colonne aggiuntive in Task Manager facendo clic con il pulsante destro del mouse sulle intestazioni delle colonne e scegliendo Seleziona colonne. Si dovrebbe aggiungere Working Set (private), Working Set (shared), Commit, e NP Pool. Scansionerei tutti i tuoi processi da tutti gli utenti e vedrei se qualcuno di loro ha un pool NP superiore a circa 256 KB. Se ne vedi qualcuno, specialmente quelli che sono considerevolmente più alti, potrebbe essere la fonte del problema, o almeno parte di esso.

Il set di lavoro totale, la quantità di memoria fisica utilizzata da un processo, è la combinazione dei set di lavoro privati ​​e condivisi (WS). Il privato è di solito più grande per la maggior parte dei processi, tuttavia potrebbero essercene alcuni che utilizzano una quantità maggiore di WS condivisi. I due dovrebbero normalmente sommare al totale WS. Commit è la quantità del set di lavoro che è stata impegnata nell'archivio di backup (nella maggior parte dei casi, il file di paging di Windows). Le applicazioni in background avranno spesso un commit maggiore rispetto a WS, a indicare che gran parte del loro pool di paging è stato sostituito dalla memoria e nel file di paging (che è abbastanza normale per le app desktop che sono state ridotte al minimo e non utilizzate per un po ').

Il pool non paginato è una memoria che non può e non potrà mai essere sostituita dalla memoria fisica ... questo è effettivamente l'utilizzo minimo permanente della memoria fisica. La memoria NP Pool spesso contiene codice di programma e sezioni critiche che devono essere nella memoria fisica per comportarsi correttamente o in modo sicuro, cumuli speciali, ecc. Su 60 processi, se tutti hanno 256 KB di memoria NP Pool, l'utilizzo della memoria fisica minima minima sarebbe di circa 15.360 KB. Nella maggior parte dei casi una o due app possono avere un pool NP da 256 KB, mentre la maggior parte ne ha meno, spesso considerevolmente meno (o nessuna). È altamente improbabile che il sistema esegua mai il paging dell'intero insieme di tutti i processi funzionanti, quindi non aspettatevi mai che l'utilizzo della memoria sia così basso.


Infine, il punto di avere più memoria è quello di evitare di dover eseguire la paginazione dei dati da e verso lo spazio di memoria esteso (scambio, file di paging) su un disco fisico. Il paging è un processo che comporta lo spostamento di blocchi di memoria fisica allocata, il trasferimento di alcuni su disco e il trasferimento di altri nella memoria fisica dal disco. Il paging è, per renderlo semplice, altamente indesiderabile. Non è "cattivo" di per sé, ma può essere un vero freno per le prestazioni quando si verifica troppo frequentemente. Il punto finale di aumentare la RAM fisica totale in un sistema è consentire a più processi di mantenere un maggior impegno nella memoria fisica (set di lavoro più ampio). Il consumo di memoria non è un problema e quando più processi in esecuzione utilizzano più memoria, le prestazioni totali del sistema e le prestazioni del processo attivo saranno generalmente più elevate,

Windows gestisce la memoria per te e inserisce automaticamente i dati dentro e fuori la memoria da e verso il file di pagina (swap). Se esegui un processo che richiede 9 GB di memoria e il tuo sistema sta già utilizzando 4 GB (su 12 GB), il sistema scoprirà automaticamente quali processi non richiedono l'accesso immediato all'intero set di lavoro e visualizzerà in parte o in parte del loro pool di paging fuori per scambiare per liberare quel 1 GB in più. Se il tuo grande processo alla fine ha bisogno di più memoria, Windows ridurrà ulteriormente il gruppo di lavoro di altri processi fino a quando non ha abbastanza spazio libero per allocare il blocco appena richiesto. Il tuo processo di grandi dimensioni potrebbe eventualmente consumare tutta la memoria disponibile tranne NP Pool e forse un sovraccarico minimo aggiuntivo per l'esecuzione periodica di processi che non consentono a Windows di liberare più del loro set di lavoro (i. e. presentano errori di pagina in sospeso che altrimenti Windows cambierebbe dalla memoria fisica, ma poiché vengono richiesti, non possono essere spostati.)

Se un processo ha bisogno di più memoria di quella a cui è consentito accedere (i processi a 32 bit in genere possono accedere a 2 Gb e alcuni a meno di 4 Gb con tecniche avanzate, mentre i processi a 64 bit in genere possono accedere a circa 48 Gb di memoria, ciascuno), a volte Windows proverà per virtualizzare la sua memoria con spazio di swap. Se un'app a 32 bit desidera utilizzare il massimo consentito di 2 GB di spazio, ma sono disponibili solo 1,2 GB, Windows riserverà i 2 GB completi nel file di pagina e sposta i dati propri dei processi dentro e fuori dal file di pagina secondo necessità per supporta l'utilizzo della memoria dell'app. L'utilizzo totale della "memoria" in questo caso può sembrare maggiore della memoria fisica disponibile, quando si passa a Total Commit. Total Commit di solito massimizza al massimo le dimensioni del file di pagina totale, che quando gestito dal sistema, è solitamente 2-3 volte la quantità di memoria fisica. Nel tuo caso,


Un ultimo punto. Nella tua risposta hai detto che avevi 16 GB di RAM, mentre come Task Manager vede solo 12 GB di RAM. Una delle due cose qui. O il tuo sistema ha davvero solo 12 GB di RAM o uno dei tuoi stick non si registra correttamente. Se uno stick di ram (suppongo che 4x stick da 4 GB), potrebbe essere difettoso, potrebbe non essere inserito correttamente nella scheda madre o la scheda madre potrebbe avere un problema di rilevamento della memoria.

Per verificare se si tratta di quest'ultimo, è necessario innanzitutto aggiornare il BIOS della scheda madre all'ultima versione. Ho avuto un problema simile ... i miei sei rametti DDR3 a tre canali DDR3 (6x 2Gb) erano tutti buoni in base al test individuale di ciascuno ... ma la mia scheda madre ha deciso casualmente di non contarne uno o due ogni tanto, spesso lasciandomi con solo 8 GB di RAM. Un aggiornamento del BIOS ha risolto il problema e ora ho un accesso affidabile a tutti i miei 12 GB di memoria.


interessante..e ho appena notato che la sua memoria non paginata è molto grande..la mia è 539 MB paginata, 139 MB non paginata. Ne sai chiaramente più di me su questo .. Ma, ti sbagli sul totale commit.U scrivi "Total Commit di solito raggiunge il massimo alla dimensione del file della pagina totale complessiva" La mia RAM è di 12 GB. Ho impostato il mio file di paging su 4000 MB (3,8 GB?) min e 1,5-2x di memoria come max. Il mio commit massimo è 15 GB (commit = 7 / 15 attualmente), il mio file di paging è di circa 4 GB o probabilmente un po 'meno di 3,8 GB. Il commit massimo è più simile alla dimensione del file di paging + dimensione della RAM. Quando il mio file di paging era di 12 GB, il mio commit massimo era di circa 24 GB. Il file di paging di quasi 3,8 GB o 4 GB di commit massimo è di 15 GB
partire dal

@barlop: Beh, in qualche modo fraintendete cos'è l'impegno. Tecnicamente parlando, il commit commit è lo "spazio di memoria praticamente indirizzabile" totale, incluso lo spazio supportato da gestori di memoria estesi e consapevolezza degli indirizzi di grandi dimensioni. Il commit massimo non sarebbe il file di paging + RAM, ma sarebbe descritto come lo spazio di indirizzi virtuale gestito dal sistema totale. Il file di paging dovrebbe generalmente coprire, per lo meno, la dimensione della memoria fisica totale ed estenderla oltre la dimensione della memoria fisica totale. Nel tuo caso, mi sarei aspettato un impegno di almeno 18 Gb (1,5x) o 24 Gb (2x), tuttavia che ...
jrista,

... sarebbe il caso di un file di paging gestito dal sistema. Sembra che tu abbia modificato manualmente le impostazioni del tuo file di pagina, nel qual caso dovrei sapere di più sulla tua configurazione specifica per dirti perché il tuo commit attuale è 15Gb (poiché il file di pagina 3.8 / 4Gb indicherebbe un commit di 16Gb, non 15Gb .) È del tutto possibile configurare manualmente nessun file di paging o un file di paging troppo piccolo e che può portare a strani problemi di prestazioni e problemi di allocazione della memoria. La migliore raccomandazione, a meno che non si disponga di un'impostazione del server (es. Database) altamente specifica, è quella di consentire a Windows di gestire il suo file di paging.
jrista,

Un'ultima nota. Per prestazioni ottimali, è consigliabile consentire a Windows di allocare anticipatamente le dimensioni massime del file di paging. Questo di solito viene eseguito su configurazioni server come un database SQL Server, in cui è possibile preallocare 64 GB o più (in genere 2x la dimensione della RAM fisica, quindi forse anche 128 GB o 256 GB) in un file di pagina distribuito uniformemente tra più dischi fisici per le massime prestazioni . I file di pagine distribuiti, specialmente se preallocati alla massima dimensione, consentono letture / scritture interlacciate su tutti i dischi partecipanti, consentendo così prestazioni di paginazione migliorate tramite I / O parallelo.
jrista,

Come esempio di un pesante carico di memoria, il mio sistema attualmente ha: 7.5 / 12Gb di utilizzo della memoria fisica; Impegno 14,7 / 23,3 GB; 491mb pool paginato; Piscina da 145mb np. Questo è per 146 processi, pool di paging massimo 2276k pool di np max 263k. Dimensione di commit più grande 696.396k, e per lo stesso processo WS è 714.256k (un processo di scheda Opera.) (Il mio elevato numero di processi è dovuto al browser Web ... in questi giorni isolano le schede tramite processo e io sono un hypertabber ... dozzine si aprono contemporaneamente, quindi dozzine di processi aggiuntivi.)
jrista,

12

Come faccio a sapere perché Windows utilizza così tanta RAM.

Sta usando così tanta RAM perché è progettata per farlo. Non vi è assolutamente alcun costo associato all'utilizzo della RAM. In effetti, la RAM usata è migliore della RAM libera perché il sistema operativo non deve fare nulla per usarla. L'uso della RAM libera richiede l'utilizzo, il che richiede impegno.

Se stai pensando "Voglio la mia RAM libera ora in modo da poterla utilizzare in seguito", dimenticala. La RAM non deve essere libera ora per essere utilizzata in seguito. Puoi usarlo ora e usarlo in seguito. Non c'è alcun compromesso qui - non c'è assolutamente alcun aspetto negativo nell'uso della RAM.

La RAM viene mantenuta utilizzata e passata direttamente da un uso all'altro senza dover passare attraverso lo sforzo di renderla libera solo per doverla riutilizzare. I moderni sistemi operativi lasciano RAM libera solo quando non hanno altra scelta.


12
Se il mio sistema Windows7 utilizza 3 GB di RAM all'avvio, senza app aperte, qualcosa deve essere sbagliato
Vader

5
@JebediahKerman Perché dici questo? Ho cercato di spiegarti perché non è così e perché Windows è progettato per farlo. Non hai capito la mia spiegazione? Oppure, se non sei d'accordo, potresti spiegare dove pensi che io abbia torto?
David Schwartz,

11
@DavidSchwartz risposta totalmente errata. Ha una perdita di memoria da un autista
magicandre1981,

9
@DavidSchwartz: il comportamento che descrivi (allocazioni RAM che possono essere riutilizzate) deve necessariamente essere effettuato dalla memoria paginabile. La cifra preoccupante è di 1,3 GB di memoria non paginata. Non puoi semplicemente liberarlo per altre risorse, dove andrebbero quei 1,3 GBbyte? Essere "non di paging" significa che il proprietario ha detto "questi byte sono così importanti che non puoi nemmeno metterli su disco, figuriamoci scartarli".
Salterio del

25
Perché questa "risposta" è stata votata così in alto? E ' completamente non coglie il punto. Indipendentemente dalle parole specifiche utilizzate (che erano perfettamente chiare per cominciare), la domanda non lo è “Why is Windows using RAM?”, la domanda è che “Why do the RAM usage numbers not add up; why is one part reporting a higher usage than another part?”questo post dovrebbe essere un commento nella migliore delle ipotesi perché non affronta la domanda reale o addirittura tenta di rispondere; interviene solo con un po 'di consigli e cattivi consigli in quanto, se l'OP lo avesse ignorato come suggerito, la perdita di memoria non sarebbe stata scoperta.
Synetech,

2

Un motivo non menzionato sopra è Hyper-V.

Sono stato in grado di identificarlo con l'eccellente utility RamMap :

inserisci qui la descrizione dell'immagine

Lo screenshot è di dopo. Prima che la memoria "Driver Locked" fosse superiore a 6 GB, oltre l'80% della RAM in questa particolare macchina. Ho dovuto andare su Hyper-V Manager e disabilitare "Dynamic Memory". Curiosamente, anche dopo averlo riattivato, la memoria "Driver Locked" è rimasta bassa - posso solo presumere che istanze precedenti lo abbiano aumentato e che Hyper-V non riduca automaticamente la memoria allocata:

inserisci qui la descrizione dell'immagine

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.