2013-11-12 01:10:06 +0000 2013-11-12 01:10:06 +0000
75
75

Windows che usa troppa RAM, come diagnosticare il monopolizzatore di risorse

Ho 16GB di RAM di sistema. All'avvio, senza applicazioni aperte tranne il task-manager, Windows sta usando circa 3gb di RAM. Ho guardato nella scheda dei processi, ma niente sembra essere fuori dall'ordinario. Come posso scoprire perché il mio Windows sta usando così tanta RAM.

tutti i processi di tutti gli utenti


Leggendo dal poolmon sembra che il mio driver broadcom wireless stia usando circa 0.4GB di RAM. Anche se lo rimuovo, starebbe ancora usando 2.6GB all'avvio, che è ancora troppo.


dopo aver reinstallato il driver wireless associato alla perdita di memoria. Ho un nuovo screenshot e vorrei confermare che si trattava effettivamente di una perdita di memoria.

Risposte (4)

85
85
85
2013-11-12 04:54:18 +0000

Avete una perdita di memoria causata da un driver. Guardate l'alto valore della memoria nonpaged del kernel. Nel vostro caso è più di 3,7 GB. Puoi usare poolmon per vedere quale driver sta causando l'alto utilizzo.

Installa il Windows WDK , esegui poolmon, ordinalo tramite P dopo il tipo di pool in modo che non paginato sia in cima e tramite B dopo i byte per vedere il tag che usa più memoria. Esegui poolmon andando nella cartella dove è installato il WDK, vai su Tools (o C:\Program Files (x86)\Windows Kits\10\Tools\x64) e clicca su poolmon.exe.

Ora guarda quale pooltag usa più memoria come mostrato qui:

Ora aprite un prompt di cmd ed eseguite il comando findstr. Per fare questo, aprite il prompt di cmd e digitate “cd C:\Windows\System32\drivers”, senza virgolette. Poi digitate “findstr /s __ .”, dove __ è il tag (il nome più a sinistra in poolmon). Fai così per vedere quale driver usa questo tag:

Ora, vai nella cartella dei driver (C:\Windows\System32\drivers) e fai clic con il tasto destro sul driver in questione (intmsd.sys nell'esempio dell'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 nel pooltag.txt ("C:\Program Files (x86)\Windows Kits.1\Debuggers\x64\triage\pooltag.txt")

devi usare xperf per rintracciare cosa causa l'utilizzo . Installare il WPT dal Windows SDK , aprire un cmd.exe come amministratore ed eseguire 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

cattura 30 -60s della crescita. Aprire l'ETL con WPA.exe, aggiungere i grafici del Pool al pannello di analisi.

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

Ora trovate altri driver di terze parti che potete vedere nello stack. Qui il tag Thre (Thread) è usato da AVKCl.exe di G-Data. Cerca gli aggiornamenti del driver/programma per risolverlo.

15
15
15
2013-11-12 05:41:48 +0000

Bene, prima di entrare in una risposta più dettagliata. Nel tuo primo screenshot, il tuo Non-Paged Pool (un tipo di utilizzo della memoria del kernel) è a 1,3GB. Questo mi sembra insolitamente alto, specialmente per soli 30 minuti dopo l'avvio. Immagino che potrei vedere il Pool NP diventare così alto dopo un lungo periodo di utilizzo o con un programma che perde come un colabrodo. Per contrasto, il mio NP Pool è di solito tra i 100 e i 200 megabyte, e il mio pool impaginato potrebbe arrivare a 400 o 500 (e questo dopo aver fatto funzionare il mio sistema senza un riavvio per settimane).


Puoi abilitare alcune colonne aggiuntive in Task Manager cliccando con il tasto destro sulle intestazioni delle colonne e scegliendo seleziona colonne. Dovresti aggiungere Working Set (private), Working Set (shared), Commit e NP Pool. Farei una scansione di tutti i tuoi processi da tutti gli utenti, e vedere se qualcuno di loro ha un NP Pool più di circa 256KB. Se ne vedi qualcuno, specialmente qualcuno che è considerevolmente più alto, potrebbe essere la fonte del problema, o almeno parte di esso.

Il vostro working set totale, la quantità di memoria fisica in uso da un processo, è la combinazione dei working set (WS) privati e condivisi. Quello privato è solitamente più grande per la maggior parte dei processi, tuttavia ce ne possono essere alcuni che usano una quantità maggiore di WS condiviso. I due dovrebbero normalmente sommarsi al totale del WS. Commit è la quantità del tuo set di lavoro che è stato impegnato nel backing store (nella maggior parte dei casi, il file di pagina di Windows). Le applicazioni in background avranno spesso un Commit maggiore del WS, indicando che molto del loro pool di paginazione è stato scambiato fuori dalla memoria e nel vostro file di paginazione (che è abbastanza normale per le applicazioni desktop che sono state minimizzate e non utilizzate per un po’).

Il Non-Paged Pool è la memoria che non può, e non sarà mai, scambiata fuori dalla memoria fisica… che è effettivamente il tuo uso 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, heaps speciali, ecc. Su 60 processi, se tutti hanno 256KB di memoria NP Pool, allora il tuo utilizzo minimo assoluto di memoria fisica sarebbe di circa 15.360KB. Nella maggior parte dei casi una o due applicazioni possono avere un pool NP di 256KB, mentre la maggior parte ne ha meno, spesso molto meno (o nessuno). È altamente improbabile che il sistema paghi l'intero set di processi in funzione, quindi non aspettatevi mai che l'uso della memoria sia così basso.


Infine, lo scopo di avere più memoria è quello di evitare di dover impaginare i dati da e verso lo spazio di memoria esteso (swap, page file) su un disco fisico. Il paging è un processo che comporta lo spostamento di blocchi di memoria fisica allocata, spingendone alcuni sul disco e portandone altri nella memoria fisica dal disco. Il paging è, per farla semplice, altamente indesiderabile. Non è “cattivo” di per sé, ma può essere un vero freno alle prestazioni quando si verifica troppo frequentemente. Lo scopo ultimo di aumentare la RAM fisica totale in un sistema è di permettere a più processi di tenere più del loro impegno nella memoria fisica (set di lavoro più grande). Il consumo di memoria non è un problema, e quando più processi in esecuzione utilizzano più memoria, le prestazioni totali del sistema e quelle dei processi attivi saranno solitamente più alte, poiché l'attività del disco fisico relativa agli accessi alla memoria (errori di pagina, in particolare) sarà inferiore.

Windows gestisce la memoria al posto vostro, e automaticamente esegue la pagina dei dati in e dalla memoria verso e dal file di pagina (swap) per voi. Se esegui un processo che ha bisogno di 9GB di memoria e il tuo sistema sta già usando 4GB (su 12GB), allora il sistema capirà automaticamente quali processi non hanno bisogno di un accesso immediato al loro intero set di lavoro, e pagherà alcuni o tutti i loro pool paginati in swap per liberare 1GB extra. Se il vostro grande processo alla fine ha bisogno di più memoria, windows ridurrà ulteriormente l'insieme di lavoro degli altri processi finché non avrà abbastanza spazio libero per allocare il nuovo blocco richiesto. Il vostro grande processo potrebbe alla fine consumare tutta la memoria disponibile eccetto il Pool NP e forse un minimo overhead aggiuntivo per i processi in esecuzione periodica che non stanno permettendo a Windows di liberare più del loro insieme di lavoro (cioè hanno errori di pagina pendenti che Windows altrimenti scambierebbe fuori dalla memoria fisica, ma poiché sono richiesti, non possono essere spostati).

Se un processo ha bisogno di più memoria di quella a cui può accedere (i processi a 32bit possono di solito accedere a 2Gb, e alcuni un po’ meno di 4Gb con tecniche avanzate, mentre i processi a 64bit possono di solito accedere a circa 48Gb di memoria, ciascuno), allora Windows a volte cercherà di virtualizzare la sua memoria con spazio di swap. Se un'applicazione a 32bit vuole usare il suo massimo consentito di 2Gb di spazio, ma solo 1.2Gb sono disponibili, windows riserverà l'intero 2Gb nel file di pagina, e sposterà i dati del processo dentro e fuori il file di pagina come necessario per supportare l'uso della memoria dell'applicazione. L'utilizzo totale della “memoria” in questo caso può sembrare essere maggiore della memoria fisica disponibile, quando si va per Impegno totale. Total Commit di solito raggiunge il massimo alla grande dimensione totale del file di pagina, che quando è gestita dal sistema, è di solito 2-3 volte la quantità di memoria fisica. Nel tuo caso, Total Commit sarebbe circa 24Gb, o 2x i tuoi 12Gb di memoria fisica (e questo è indicato nel tuo primo screenshot, dove c'è scritto: Commit (GB) 3 / 23).


Un ultimo punto. Hai detto nella tua risposta che avevi 16Gb di RAM, mentre Task Manager vede solo 12Gb di RAM. Una delle due cose qui. O il tuo sistema ha davvero solo 12Gb di RAM, o uno dei tuoi stick non si sta registrando correttamente. Se uno stick di RAM (sto assumendo 4 stick da 4Gb), potrebbe essere difettoso, potrebbe non essere posizionato del tutto correttamente nella tua scheda madre, o la tua scheda madre potrebbe avere un problema di rilevamento della memoria.

Per verificare se è quest'ultimo, dovreste prima aggiornare il BIOS della vostra scheda madre all'ultima versione. Ho avuto un problema simile… i miei sei stick di ram DDR3 Tripple-Channel (6x 2Gb) erano tutti buoni basati su test individuali di ciascuno… ma la mia scheda madre decideva casualmente di non contarne uno o due ogni tanto, lasciandomi spesso con soli 8Gb di ram. Un aggiornamento del BIOS ha risolto il problema, e ora ho un accesso affidabile a tutti i 12Gb della mia memoria.

12
12
12
2013-11-12 01:35:00 +0000

Come posso scoprire perché il mio Windows sta usando così tanta RAM.

Sta usando così tanta RAM perché è progettato per farlo. Non c'è assolutamente nessun costo associato all'uso della RAM. Infatti, la RAM usata è meglio della RAM libera perché il sistema operativo non deve fare nulla per usarla. Usare la RAM libera richiede di renderla usata, il che richiede uno sforzo.

Se state pensando “voglio la mia RAM libera ora così posso usarla più tardi”, dimenticatelo. La RAM non deve essere libera ora per usarla dopo. Potete usarla ora e usarla dopo. Non c'è nessun compromesso qui – non c'è assolutamente nessun svantaggio nell'usare la RAM.

la RAM viene mantenuta usata e passa direttamente da un uso all'altro senza dover fare lo sforzo di renderla libera solo per doverla rendere di nuovo usata. I sistemi operativi moderni lasciano la RAM libera solo quando non hanno altra scelta.

2
2
2
2017-01-14 12:37:08 +0000

Una ragione non menzionata sopra è Hyper-V.

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

Lo screenshot è di dopo. Prima del “Driver Locked” la memoria era oltre 6GB, più dell'80% della RAM in questa particolare macchina. Ho dovuto andare in Hyper-V Manager e disabilitare la “memoria dinamica”. Curiosamente, anche dopo averla riabilitata, la memoria “Driver Locked” è rimasta bassa - posso solo presumere che le istanze precedenti l'abbiano aumentata e che Hyper-V non riduca automaticamente la memoria allocata: