posts - 644, comments - 2671, trackbacks - 146

My Links

News

Raffaele Rialdi website

Su questo sito si trovano i miei articoli, esempi, snippet, tools, etc.

Archives

Post Categories

Image Galleries

Blogs

Links

Memoria e GC parte 2: Task Manager, VM Size e altri preziosi valori

Nel primo post sulla memoria ho parlato di "Mem Usage" conosciuto anche come "Working Set".

Alcune definizioni con lo stesso disclaimer del precedente post.

  • Committed Page. Pagina di memoria allocate e presenti in RAM o su disco
  • Uncommitted Page. Pagine di memoria virtuale non ancora allocate, non usabili e non disponibili. In pratica i "buchi" nello spazio di indirizzamento virtuale. In pratica il tentativo di accedere in lettura o scrittura in una Uncommitted Page risulta nel classico e noto errore di "Access Violation"

Virtual Memory Size

Nel Task Manager di Windows è possibile aggiungere un'altra colonna e visualizzare il valore "VM Size" che corrisponde a "Private Bytes" di Process Explorer e "Commit Size" del Task Manager di Vista.

  • Cosa rappresenta questo valore?
    Questo valore rappresenta la somma delle pagine private in memoria e sul file di swap. Sono tutte pagine allocate e private dal processo, quindi non condivise.
    Questo valore riesce sicuramente a darci un'indicazione più precisa, ma ancora una volta, essendo una somma, non è sufficientemente esplicativo.
  • Cosa significa avere un valore alto di "VM Size"? È memoria allocata e privata, quindi è il valore che indica il consumo di memoria della nostra applicazione. Tante più allocazioni facciamo, tanto più alto è questo valore. Naturalmente questo valore include anche la memoria usata dal codice, quindi tutte le DLL non condivise con altri processi.
  • Cosa ci dice questo valore sul consumo di RAM? Poco, visto che è una somma di RAM e pagine su disco.

Nel sistema operativo sono presenti diverse primitive per allocare memoria. Per esempio C++ crea un apposito spazio di memoria chiamato Heap e l'allocatore new usa RtlCreateHeap per riservarne una parte. Il Garbage Collector invece per blocchi allocati nel "Large Object Heap" (LOH di cui parlerò in un altro post) usa VirtualAlloc.

Questa differenza è importante perché le allocazioni fatte con VirtualAlloc tipicamente riservano solo dello spazio nella memoria virtuale senza doverci fare un accesso fisico. Per esempio una allocazione di 1MB eseguita dal GC riserva lo spazio ma non incrementa l'uso di RAM fisica fino a che non vado a scriverci dentro.

Per questo motivo può essere utile conoscere quanto occupino le pagine private di un processo in RAM e non su disco. Il Task Manager espone questo numero solo a partire da Vista ed è chiamato "Memory (Private Working Set)" che corrisponde alla colonna "WS Private" di Process Explorer.

Di conseguenza la memoria condivisa con altri processi è pari a Working Set - WS Private che in Process Explorer compare alla colonna "WS Shareable".

E perciò la memoria privata ma riservata nel file di swap è pari a Private Bytes - WS Private, informazione non molto interessante in quanto le pagine possono essere anche solo riservate e non fisicamente scritte nel file di swap.

Questo discorso suggerisce una considerazione importante a proposito del file di swap. La memoria allocabile dai processi è ovviamente dipendente dalla RAM e dalla dimensione del file di swap. Disabilitando il file di swap (diatriba che ogni tanto si legge sui forum), potremmo non essere in grado di allocare sufficiente RAM per soddisfare l'allocazione. Allo stesso tempo però allocare non significa che quella memoria venga scritta subito. Questo significa che lo swap file non verrebbe neppure accesso e quindi non si avrebbe perdita di performance. Perciò io sconsiglio la disabilitazione del file di swap, operazione che in certi scenari, pur in abbondanza di RAM, non fornisce neppure una migliore performance del sistema.

Print | posted on lunedì 23 aprile 2007 16.33 |

Feedback

Gravatar

# Re: Memoria e GC parte 2: Task Manager, VM Size e altri preziosi valori

Bellissimo post.

Quindi se io avessi il totale della memoria occupata (disco+ram, private+shared) (esiste in procexp?) e volessi sapere la quantita' di pagine solo sul disco si potrebbe calcolare cosi:

disktot = Memoria Totale - Working Set

poi per sapere la quantita' su disco shared:

discoshared = disktot - (Private Bytes - WS Private)

Ma forse non ha molto senso...;-)

Esistono questi valori su procexp? solo per verificare...

Questi post mi piacciono tantissimo...continua cosi'!
25/04/2007 12.02 | Michele Bersani
Gravatar

# re: Memoria e GC parte 2: Task Manager, VM Size e altri preziosi valori

Grazie Michele, il feedback è importante per capire se andare avanti o slittare su altro.

Andando al pelo nell'uovo, la memoria totale in realtà comprende anche i memory mapped files e i moduli (exe e dll) che quando vengono scaricati dalla ram non vanno ovviamente nello swapfile visto che sono già su disco.
Process Explorer mostra le metriche globali (intendevi questo?) sulla memoria accedendo in "System Information".

In realtà questi numeri hanno relativamente poco senso e nei prossimi post questo sarà un po' più evidente :)
Per il singolo processo la quantità totale (pagine private, shared e su disco) la fai con process explorer sommando WS Shareable + Private Bytes. Non mi risulta ci sia una colonna con la somma già fatta e non ne vedo sinceramente l'utilità.
La parte nel file di swap è pari invece a Private Bytes - WS Private come dicevo in questo post e ancora una volta non ne vedo l'utilità.

Nel prossimo post parlerò di cosa succede quando, dopo aver allocato la memoria, si inizia ad usarla veramente e quindi del file di swap.
26/04/2007 9.58 | Raffaele Rialdi
Gravatar

# Re: Memoria e GC parte 2: Task Manager, VM Size e altri preziosi valori

Sinceramente... sono questi i post che vorrei vedere sempre su UGI! ;-)
Per la memoria, grazie per la spiegazione dettagliata...si, intendevo su process explorer come vedere la dimensione "totale" della memoria di un processo, ma come mi hai confermato non ha molto senso...
C'e' ancora un campo che non ho capito cosa misura..."Virtual Size"...non mi sembra sommare altri valori...
Grazie!
26/04/2007 10.22 | Michele Bersani
Gravatar

# re: Memoria e GC parte 2: Task Manager, VM Size e altri preziosi valori

:-))
Di Virtual Size ne parlavo al workshop e trovi anche una slide che lo cita.
Il suo valore rappresenta lo spazio di indirizzamento assegnato al processo, ed è dinamicamente riassegnato man mano che la memoria viene allocata e disallocata.
Per spazio di indirizzamento si intende la memoria che potenzialmente è allocabile dal processo e quindi comprende anche quella che non è usata affatto.
In pratica invece di assegnare una virtual size di 2^32 per tutti i processi (cosa che evidentemente non avrebbe senso nella maggior parte dei casi), viene assegnata una quantità inferiore.
Anche questo valore è poco significativo visto che non indica memoria necessariamente utilizzata ma un mix tra usata e utilizzabile e in più è anche dinamicamente riassegnato dall'OS.
26/04/2007 11.55 | Raffaele Rialdi
Gravatar

# Re: Memoria e GC parte 2: Task Manager, VM Size e altri preziosi valori

OK, ottimo
Grazie Raf!
26/04/2007 15.55 | Michele Bersani
Gravatar

# re: Memoria e GC parte 2: Task Manager, VM Size e altri preziosi valori

Non mi quadra!
Se tu dici che VM Size (in WINXP) rappresenta la somma delle pagine private in memoria e sul file di swap, come è possibile che io abbia un valore di MemUsage < VM Size?

Grazie. Paolo.
24/08/2007 14.15 | Paolo Cigno
Gravatar

# re: Memoria e GC parte 2: Task Manager, VM Size e altri preziosi valori

Non mi quadra!
Se tu dici che VM Size (in WINXP) rappresenta la somma delle pagine private in memoria e sul file di swap, come è possibile che io abbia un valore di MemUsage > VM Size? (avevo sbagliato il segno intendo MAGGIORE!)

Grazie. Paolo.
24/08/2007 14.17 | Paolo Cigno
Gravatar

# re: Memoria e GC parte 2: Task Manager, VM Size e altri preziosi valori

Ciao Paolo, significa che il tuo processo sta usando molte dll già in uso da altri processi. Questa è una condizione ideale perché molte dll non vengono caricate nuovamente in memoria in quanto altri processi le stanno già usando. E questo anche grazie al fatto che l'OS non ha dovuto farne il rebasing (quindi le DLL sono scritte bene).

È un semplice calcolo aritmetico:
MemUsage = Private + Shared
VMSize = Private

Per rendere tutto più chiaro ti consiglio di guardare Process Explorer ricordando che:
MemUsage ==> Working Set
VMSize ==> Private Bytes

Se ora aggiungi in process explorer le colonne "WS Private" e "WS Shareable" avrai che:
WorkingSet = WS Private + WS Shared
Mentre Private Bytes - WS Private sono le pagine allocate nel file di swap su disco (come scritto nel msg del blog).

Spero di aver fatto chiarezza ...
24/08/2007 15.09 | Raffaele Rialdi

Post Comment

Title  
Name  
Email
Url
Comment   
Please add 2 and 4 and type the answer here:

Powered by: