Come misurare l'utilizzo totale della RAM di un programma in Windows?


7

Stavo confrontando l'utilizzo della memoria di diversi browser portatili, ma questa domanda è generale per tutti i programmi che si aprono in diversi processi secondari in Task Manager.

Vedi lo screenshot da Sysinternals Process Explorer di seguito:

Un programma apre diversi processi

Firefox, ad esempio, si apre in un solo processo, mentre Google Chrome avvia diversi processi per ogni scheda.

Quindi, come posso ottenere l'utilizzo totale della RAM per tutti i processi aperti da un programma? (Qui per Google Chrome per esempio.)

Ovviamente potrei semplicemente usare una calcolatrice e calcolare la somma ... ma deve esserci un modo più conveniente!


5
Questa domanda è interessante perché Chrome condivide molta memoria tra questi processi, quindi la memoria utilizzata è in realtà inferiore alla somma.
Daniel B,

1
Il set di lavoro privato totale dovrebbe darti un limite inferiore e la dimensione virtuale totale dovrebbe darti un limite superiore. È probabilmente da qualche parte tra quei due, forse vicino al set di lavoro totale.
Mehrdad,

No, la dimensione virtuale totale non è un limite superiore. Quella colonna riflette solo lo spazio degli indirizzi virtuali privati. Non include i mapping condivisi. La dimensione virtuale totale darebbe un limite superiore al "set di lavoro privato", ma non alla RAM totale utilizzata.
Jamie Hanrahan,

Risposte:


12

La risposta generale è: non puoi, non esattamente.

Supponendo che tu stia chiedendo della RAM (memoria fisica) e non virtuale - Windows pubblica due contatori rilevanti per ogni processo, il set di lavoro totale e il set di lavoro privato (nel processo). (PerfMon ti mostrerà questi.) Task Manager mostra "privato" e "condiviso" (sommati insieme darebbero il totale). Process Explorer mostra questi come "Working Set" (il totale), "WS Private", "WS Shareable" e "WS Shared". ProcExp fa un po 'di "scavo profondo" per trovare gli ultimi due.

Il "condiviso", o la parte condivisa del totale, sono ciò che causa i problemi.

Usando i termini di Process Explorer, "Condivisibile" mostra la RAM che è stata allocata al processo ma che è almeno potenzialmente condivisa con altri processi. E "Shared" è il sottoinsieme di ciò che viene effettivamente condiviso, da almeno un altro processo.

Il problema è che non sai quanti o quali processi lo stanno effettivamente condividendo. Sommare tutti i numeri "condivisibili" o "condivisi" ti darà un totale più grande della realtà, perché le pagine condivise verranno conteggiate in tutti i processi che li condividono. Non tutti i processi, nemmeno i processi che eseguono lo stesso programma (come Chrome), condivideranno necessariamente le stesse pagine dal loro spazio di indirizzi totale.

Per una serie di processi che eseguono tutti lo stesso .exe, come quelli di Chrome: sommando tutti i loro contatori "WS Private" e aggiungendo a quel totale il più grande di "WS condivisibile" di qualsiasi istanza di Chrome, otterrai un minimo figura ... ma l'attuale potrebbe essere più grande.

Chrome ha quella bella funzione di auto-segnalazione menzionata da ge0rdi. I contatori che desideri sono quelli in "Memoria". Chrome sulla mia macchina non concorda esattamente con ciò che riporta il sistema operativo, ma è abbastanza vicino per tutti gli usi pratici.

Un'altra cosa da considerare è che l '"utilizzo della memoria" di qualsiasi processo, o sottoinsieme di processi, in un sistema operativo di memoria virtuale è estremamente dipendente dal comportamento del processo e dalla pressione della RAM. Eseguilo su un sistema con più o meno RAM, o con più o meno altre cose in esecuzione ed esigente RAM, ei numeri appariranno molto diversi. Quindi non esiste un numero fisso per quanto riguarda la quantità di RAM richiesta da un determinato processo. Quindi anche "notare la tua RAM disponibile, quindi chiudere tutte le istanze di Chrome e vedere quanta RAM disponibile aumenta" non è un buon test. Il sistema operativo potrebbe assegnare parte della RAM rilasciata ad altri processi, in particolare se sono occupati.


1
Questa è una risposta interessante, e la cosa della memoria virtuale condivisa è qualcosa che ho dimenticato ... Quindi se ti capisco bene, solo il programmatore sa quanta memoria usa e Windows in realtà non può dirti ... quindi il programma deve offrire l'opportunità di generare l'utilizzo, come Chrome ha con chrome: // memory-redirect
UdeF

Destra. E l'unica ragione per cui Chrome può farlo economicamente è che sa come sta usando quelle aree di memoria condivise. I numeri che segnala per altri browser sono solo le cifre che offre il sistema operativo.
Jamie Hanrahan,

10

Non so come farlo in generale, ma per misurare l'utilizzo totale della memoria di Chrome puoi scrivere about://memorysulla barra degli indirizzi.

La Summarysezione mostra l'utilizzo totale della memoria di tutti i processi di Chrome.


Non sono sicuro sotto Windows, ma sicuramente non funziona con OSX .
o0 '.

1
In alternativa, puoi premere Maiusc + Esc per visualizzare il task manager di Chrome (simile al task manager di Windows) e visualizzare le statistiche (compresa la memoria) su ogni scheda in Chrome, processo in background di Chrome e Chrome in generale.
David Grinberg,

non è più supportato da Chrome ... così tanto per la "bella caratteristica" - suppongo che non vogliono che nessuno sappia quanto porco. FF onora questo comando. Questo è l'unico fattore irritante che voglio passare a FF.
killjoy,

Come farlo in OPERA?
The Beast

0

Qualche tempo fa ho scritto un ottimo file batch (e forse un po 'brutto) che lo fa, richiede la sed e cut di gnuwin32.

L'ho scritto perché ero inorridito dalla quantità di RAM utilizzata dai moderni browser e volevo vedere rapidamente.

Attualmente sto cercando di ridimensionarlo, ma è così com'è.

Quindi, sta dicendo che Chrome utilizza 3,4 GB

    C:\>ramchrome<ENTER>
    >=1GB
    3GB
    3,480,288
    3.4GB (rounded down)
    3480288KB

Ecco il file batch. Un tempo era molto più semplice. Ma volevo aggiungere ad esempio GB e KB .. e questo occupa gran parte del file batch. È una prova molto futura perché anche se Chrome occupasse un mucchio di yottabyte (una yottabyte è di milioni di miliardi di miliardi di megabyte), il mio batch dovrebbe o almeno è scritto per supportarlo.

La base di come funzionano gli interni del file batch è semplice .. Crea alcuni file temporanei .. che puoi guardare .. Vedi che fondamentalmente genera un elenco di tutti i processi, filtra quelli per chrome.exe grabs solo la parte che indica quanti byte utilizza. Quindi l'ultimo file temporaneo che è possibile visualizzare si vede che ha solo un elenco di tutti i byte utilizzati da ciascun processo chrome.exe, con eventuali virgole o spazi rimossi, quindi un'istruzione for li somma tutti. L'ultimo file temporaneo potrebbe essere aperto in Excel ... anche se non è necessario.

Vedi come usare il file bat, basta eseguirlo e vedere cosa genera. Non è necessario sapere come funziona, ma è così che funziona. Vedi guardando i file temporanei che genera.

@echo off
setlocal enableextensions enabledelayedexpansion


set tempfile1=%temp%\asdf1.a
set tempfile2=%temp%\asdf2.a
set tempfile3=%temp%\asdf3.a
set tempfile4=%temp%\asdf4.xls

tasklist >%tempfile1%
type %tempfile1% | grep "chrome" > %tempfile2%
cut -b 68- %tempfile2% > %tempfile3%
sed -r "s/\d32|K|,//g" %tempfile3% >%tempfile4%


set total=0
for /f %%f in (%tempfile4%) do @(set /a total+=%%f)>nul

:: --- added this
set a=%total%

if "%a:~-9,-6%"=="" echo ^< 1GB
if NOT "%a:~-13,-6%"=="" echo ^>=1GB

set yotta=%a:~-24,-21%
set zetta=%a:~-21,-18%
set exa=%a:~-18,-15%
set peta=%a:~-15,-12%
set tera=%a:~-12,-9%
set giga=%a:~-9,-6%
set mega=%a:~-6,-3%
set kilo=%a:~-3%

set prefix=

if NOT "!yotta!"=="" (
    set yotta=!yotta!,
    if "!prefix!"=="" (
        set prefix=YB
        echo !a:~-24,-21!!prefix!
    )
)

if NOT "!zetta!"=="" (
    set zetta=!zetta!,
    if "!prefix!"=="" (
      set prefix=ZB
      echo !a:~-21,-18!!prefix!
    )
)

if NOT "!exa!"=="" (
    set exa=!exa!,
    if "!prefix!"=="" (
      set prefix=EB
      echo !a:~-18,-15!!prefix!
    )
)

if NOT "!peta!"=="" (
    set peta=!peta!,
    if "!prefix!"=="" (
      set prefix=PB
      echo !a:~-15,-12!!prefix!
    )
)

if NOT "!tera!"=="" (
    set tera=!tera!,
    if "!prefix!"=="" (
      set prefix=TB
      echo !a:~-12,-9!!prefix!
    )
)

if NOT "!giga!"==""  (
    set giga=!giga!,
    if "!prefix!"=="" (
      set prefix=GB
      echo !a:~-9,-6!!prefix!
    )
)

if NOT "!mega!"==""  (
    set mega=!mega!,
    if "!prefix!"=="" (
      set prefix=MB
      echo !a:~-6,-3!!prefix!
    )
)

if "!mega!"=="" (
  if "!prefix!"=="" (
   set prefix=KB
   echo !kilo!
  )
)


echo !yotta!!zetta!!exa!!peta!!tera!!giga!!mega!!kilo!

if "%prefix%"=="YB" echo !a:~-24,-21!.!a:~-21!YB (rounded down)
if "%prefix%"=="TB" echo !a:~-12,-9!.!a:~-9,1!TB  (rounded down)
if "%prefix%"=="GB" echo !a:~-9,-6!.!a:~-6,1!GB (rounded down)
if "%prefix%"=="MB" echo !a:~-6,-3!.!a:~-3,1!MB (rounded down)


:: echo %a:~-13,-6%,%a:~-6,-3%,%a:~-3%
 set a=
:: -----------

echo %total%KB
set tempfile1=
set tempfile2=
set tempfile3=
set tempfile4=

Per riassumere come funziona, ecco un esempio del primo file temporaneo asdf1.a come puoi vedere che elenca molti processi non solo chrome.exe

chrome.exe                    5572 Console                    1     64,784 K
chrome.exe                    3880 Console                    1    155,376 K
chrome.exe                   14516 Console                    1    106,932 K
chrome.exe                    2524 Console                    1     88,464 K
dllhost.exe                  15996 Console                    1      8,844 K
tasklist.exe                 16232 Console                    1      7,152 K

Il secondo file temporaneo si avvicina a ciò che vogliamo, filtrando chrome.exe

asdf2.a

chrome.exe                    5572 Console                    1     64,784 K
chrome.exe                    3880 Console                    1    155,376 K
chrome.exe                   14516 Console                    1    106,932 K
chrome.exe                    2524 Console                    1     88,464 K

asdf3.a si avvicina ancora

 64,784 K
155,376 K
106,932 K
 88,464 K

asdf4.xml (non chiedere perché sono .xls, forse intendevo aprirlo in Excel)

64796
155592
114084
88464

Quindi il file batch ha generato un semplice elenco da sommare.

e ovviamente questa riga del file batch fa la somma

for /f %%f in (%tempfile4%) do @(set /a total+=%%f)>nul

Nota L' uso di un file batch per scrivere questo è stato sciocco. I file batch spesso non sono molto portabili perché una leggera modifica nell'output di un comando con una nuova versione del sistema operativo o una nuova versione di un comando, può far sì che il programma non funzioni . E se si basa su programmi di terze parti in cui sono disponibili diverse versioni, non va bene. E molti dei comandi di gnuwin32 sono obsoleti, cygwin tende ad essere più aggiornato con le sue versioni dei comandi. Questo andava bene per me, anche se ora l'ho provato ha dato un errore.

Potrei scrivere qualcosa in C # invece ad un certo punto.

Si noti inoltre che, come sottolineato da Rick, questo non tiene conto delle DLL utilizzate da un programma. Anche se personalmente trovo che ciò che mi sia utile è sapere quanto viene usato dall'eseguibile (o nel caso di alcuni browser moderni, i molti esempi dell'eseguibile!)


1
Siamo spiacenti ma questo non terrà correttamente conto della memoria condivisa. Ciò si tradurrà in una cifra troppo grande. Anche se hai solo una singola istanza di un determinato nome eseguibile, perché parte di questo "utilizzo mem" è nelle DLL di sistema che vengono distrutte con ogni altro processo. Devo, tuttavia, salutare le tue abilità .BAT. :)
Jamie Hanrahan,

Come farlo in OPERA?
The Beast

@TheBeast bene, farlo in un file bat era un po 'folle ... i file bat non sono così portatili, una leggera modifica del sistema operativo o la versione di un comando possono farli non funzionare. così è stato stupido .. anche se è stato automatizzato .. si potrebbe cambiare grep "chrome" a grep opera ma in questo momento ho ottenere un bug con quella mazza, forse una versione di un comando di cambiata. Ma quello che puoi fare è vedere superuser.com/questions/209555/… Quindi il comando tasklist /FO csv > c:\crp\a.aaa quindi puoi aprirlo in Excel, dire a Excel che la virgola è il delimitatore ...
barlop

potresti quindi arrivare a quella colonna di dati dove dice l' elenco delle attività i.imgur.com/W8x47m9.png Quindi puoi rimuovere ogni K e virgola dalla colonna D. E puoi ordinare per Colonna A (nome del processo). Quindi, usando ancora Excel, puoi sommare il totale solo per esempio opera.exe. ad esempio la somma da E12: E20 sarebbe la somma per chrome.exe e se tu avessi elencato l'opera lì ad esempio E90: E97 potresti sommarlo.
barlop
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.