Sei sulla pagina 1di 4

12/04/13

Il Desktop Heap. Perch pu essere un problema, e come risolverlo.. - Supporto Tecnico agli Sviluppatori - Site Home - MSDN Blogs

Il Desktop Heap. Perch pu essere un problema, e come risolverlo..


mariora 10 Feb 2010 5:13 PM

Salve a tutti e bentornati. Oggi parliamo di una cosa molto molto importante. Sconosciuta ai pi semplicemente perch stiamo parlando di una cosa che riguarda i limiti del sistema operativo stesso. Avere a che fare con un problema di Desktop Heap, significa essersi avvicinati ai limiti fisici del sistema operativo, e la cosa non dovrebbe mai accadere in circostanze normali. Innanzitutto due link fondamentali: Introduzione al Desktop Heap http://blogs.msdn.com/ntdebugging/archive/2007/01/04/desktop-heap-overview.aspx DHeapMon, tool per misurare lutilizzo dei vari heap http://www.microsoft.com/downloads/details.aspx?familyid=5CFC9B74-97AA-4510-B4B9B2DC98C8ED8B&displaylang=en

Il seguente articolo invece lunico articolo pubblico della Knowledge Base che spiega i misteriosi parametri del valore SharedSection: 184802 User32.dll or Kernel32.dll fails to initialize http://support.microsoft.com/default.aspx?scid=kb;EN-US;184802

Leggendo attentamente il primo articolo, scopriamo che le Sessioni possono contenere una o pi Window Station e che ogni Window Station pu contenere uno o pi Desktop. Solo una Windows Station per sessione pu interagire con lutente, e questa di solito quella di Default, chiamata Winsta0. La Window Station contiene una Clipboard, una serie di Global Atom e un gruppo di oggetti Desktop. Ogni Desktop ha un display logico e contiene Windows, Menu e Hooks. Ogni Desktop possiede un Desktop Heap. Lo spazio totale dedicato dal sistema operativo al Desktop Heap gestito attraverso il parametro SessionViewSize nella chiave di registry HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management Nei sistemi operativi recenti, questo valore ridimensionabile e di default gi abbastanza grande, rispetto al passato. Ad esempio, in Windows 2003 questo valore 30 esadecimale che significa 48 in decimale, quindi 48 MB, quando una volta su XP era 20MB. Nei sistemi operativi a 64 bit si parte da 100MB ormai.

Configurare la dimensione di ciascun Desktop Heap.


La dimensione di ciascun Desktop Heap configurabile attraverso il valore SharedSection della seguente chiave: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SubSystems\Windows Generalmente il valore di default per questa chiave qualcosa del genere: %SystemRoot%\system32\csrss.exe ObjectDirectory=\Windows SharedSection=1024,3072,512 Windows=On SubSystemType=Windows ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=winsrv:ConServerDllInitialization,2 ProfileControl=Off MaxRequestThreads=16 Come vedete la voce SharedSection contiene 3 valori espressi in KB di memoria: 1024 indica la dimensione di Shared Heap comune a tutti i desktop e che non deve mai essere modificato. 3072 indica la dimensione del Desktop Heap allocato per ogni desktop associato con la Window Station interattiva, con leccezione dei desktops Disconnect e Winlogon che hanno una dimensione fissa di 64K e di 128K. 512 indica la dimensione di ciascun Desktop Heap associato con una Window Station non interattiva, tipicamente quella di un servizio.

Ci possono essere solo due tipi di esaurimento del Desktop Heap: 1. Esaurimento del Session View space a causa della creazione di un numero elevato di desktops nella Sessione/WindowStation 2. Un singolo specifico desktop che si riempie fino allesaurimento; un desktop interattivo che si riempie completamente a causa di una singola applicazione (o un piccolo numero di applicazioni) che allocano un gran numero di oggetti GDI o User, o un desktop dei servizi che si riempie a causa dellelevato numero di servizi che viene avviato con quellaccount.

blogs.msdn.com/b/itasupport/archive/2010/02/11/mariora-draft-il-desktop-heap.aspx

1/4

12/04/13

Il Desktop Heap. Perch pu essere un problema, e come risolverlo.. - Supporto Tecnico agli Sviluppatori - Site Home - MSDN Blogs

La matematica intorno al Desktop Heap.


Gli unici valori interessanti sono quindi il secondo, 3072, e il terzo, 512. Il secondo valore indica che per ogni desktop creato nella Winsta0, le applicazioni eseguite, condivideranno questi 3Mb. Quindi se avete una applicazione che crea tanti window handle o thread handle, nonch oggetti GDI o User, e che quindi consuma tanta percentuale di questo spazio, potreste trovarvi al limite anche eseguendo solo poche applicazioni. Allo stesso modo, se avete applicazioni che durante lesecuzione, si creano dei desktop paralleli, risulter che verranno allocate tante sezioni da 3MB per ogni nuovo desktop creato. Tutti questi desktop, pi quelli creati dai servizi, non possono occupare pi di 48MB. Quindi, se vogliamo modificare questo valore, perch vogliamo poter eseguire pi applicazioni contemporanemante, possiamo aumentare questo numero da 3072 fino a 12288 (che il valore di default di Windows Vista ad esempio) senza troppi problemi. Se lo incrementiamo ancora di pi dobbiamo essere sicuri che non usiamo applicazioni che creano desktop alternativi (usando lAPI CreateDesktop), perch ogni nuovo desktop a quel punto rischier di esaurire la SessionViewSize. I servizi hanno regole tutte loro. Col fatto che non sono interattivi (e adesso sono anche isolati), 512KB bastano di solito per ogni account. Perch dico questo: perch lo SCM (il Service Control Manager) ha delle regole legate al token di sicurezza dellaccount usato per avviare il servizio. Quindi, per ogni account usato per avviare un servizio, viene creato un Desktop non interattivo. Tutti i servizi avviati come Local System condivideranno 512KB, tutti quelli avviati come Network Service altri 512KB, cos come altri 512KB verranno assegnati a Local Service e ad ogni altro servizio configurato per girare con un account specifico, locale o di dominio. Ecco che allora risulta chiara la correlazione tra la SessionViewSize e i parametri della SharedSection.

Facciamo un p di esempi.
Supponiamo di avere un servizio che viene avviato con un acount locale, due con un account di rete, un altro con un altro account di rete e i soliti dei servizi standard. Praticamente avremo 6 account diversi usati in totale, che quindi causeranno la creazione di 6 desktop diversi, per un totale di, 6 x 512Kb, 3MB. Se avessimo 100 servizi avviati tutti come Local System, questi 100 servizi condividerebbero gli stessi 512KB di memoria. Se questi servizi non usassero in alcun modo funzioni da user32.dll, non ci sarebbe problema, in caso contrario se questi usassero tutti 50K di spazio, 512KB sarebbero pochi, e la soluzione sarebbe quella di aumentare il secondo valore di SharedSection, cos da accomodare lesecuzione dei 100 servizi. Se avessimo 100 servizi ognuno avviato con un account diverso, avremmo la creazione di 100 desktop non interattivi diversi e quindi qualora avessimo aumentato il valore 512KB esauriremmo la SessionViewSize pi velocemente, quindi nel caso avessimo 100 servizi da avviare tutti con un account diverso, dovremmo ridurre il secondo parametro, altrimenti, 100 x 512Kb = 50 MB, che maggiore di 48MB. In questo caso, si procede per tentativi, diminuendo ogni volta di 64KB il parametro, fino a trovare la dimensione che soddisfa i nostri requisiti. Ovviamente, nel calcolo bisogna tenere presente anche la parte che riguarda la sessione interattiva, come abbiamo visto prima. Quindi, a grandi linee, una formula per calcolare le varie dimensioni potrebbe essere questa: SessionViewSize >= (Numero di Desktop interattivi in Winsta0 * secondo parametro) + (Numero di desktop non interattivi * terzo parametro) I valori di default sono abbastanza bassi da consentire la creazione di diversi desktop sia interattivi che non interattivi. Ma facciamo un paio di esempi pratici, riferiti a Vista, cos sappiamo che il valore SharedSection vale SharedSection=1024,12288,512 e SessionViewSize 48MB Supponiamo di avere 8 servizi che vengono avviati con 8 account diversi, pi i 3 account normali. Tra le applicazioni ne abbiamo 1 che crea un altro desktop. Per la formula sopra, avremo che 48 >= (2*12.288) + (11*0.512) Che vero, perch 24MB+5.6 minore di 48 e quindi non avremo problemi. Supponiamo per adesso di dover eseguire dei servizi aggiuntivi tale per cui avremo 50 servizi tutti eseguiti con un account diverso. A questo punto avremo che 48MB non pi maggiore di 24.4MB + 25.6MB e quindi saremo a corto di Desktop Heap. In questo caso,per risolvere il problema, visto che non abbiamo esigenze particolari per le applicazioni user mode, potremmo ridurre il secondo valore da 12288 a 8000 ad esempio, e il nostro problema sar risolto.

C purtroppo un altro fattore che entra in gioco spesso: i Terminal Services. SessionViewSize abbiamo detto che sui sistemi operativi moderni di default 48MB. Quando per abilitiamo i Terminal Services (che ricordo sono presenti anche in XP quando abilitato il FUS, Fast User Switching), la SessionViewSize viene ridotta a 20MB, quindi capite che a questo punto il Desktop Heap diventa una risorsa importante e pu essere fondamentale capire come viene utilizzata.

blogs.msdn.com/b/itasupport/archive/2010/02/11/mariora-draft-il-desktop-heap.aspx

2/4

12/04/13

Il Desktop Heap. Perch pu essere un problema, e come risolverlo.. - Supporto Tecnico agli Sviluppatori - Site Home - MSDN Blogs

Come misurare lutilizzo del Desktop Heap.


Con DheapMon. Scaricate il Desktop Hea Monitor da qui: http://www.microsoft.com/downloads/details.aspx?familyid=5CFC9B7497AA-4510-B4B9-B2DC98C8ED8B&displaylang=en Seguite le istruzioni per linstallazione contenute nel Readme.htm e in Dheapmon.chm. Funziona anche su Vista e 2008. Le istruzioni per il setup su questa piattaforma sono queste:
C : \ k k t o o l s \ d h e a p m o n 8 . 1 \ x 8 6 > d h e a p i n s t . e x eys r v * h t t p : / / m s d l . m i c r o s o f t . c o m / d o w n l o a d / s y m b o l s C : \ k k t o o l s \ d h e a p m o n 8 . 1 \ x 8 6 > d h e a p m o nl C : \ k k t o o l s \ d h e a p m o n 8 . 1 \ x 8 6 > d h e a p m o npafd h e a p . t x t C : \ k k t o o l s \ d h e a p m o n 8 . 1 \ x 8 6 > d h e a p m o nu C : \ k k t o o l s \ d h e a p m o n 8 . 1 \ x 8 6 > d h e a p i n s tr

Dheap.txt conterr loutput del tool. Quello che segue un log di un Windows Server 2003 Sp2. Potete notare i tre desktop in Winsta0, chiamati Default, Disconnect e Winlogon, le tre Windowstation dei tre account Local System, Network Service e Local Service, e due Windowstation aggiuntive per servizi avviati con altri account.
D e s k t o pH e a pI n f o r m a t i o nM o n i t o rT o o l( V e r s i o n8 . 1 . 2 9 2 5 . 0 ) C o p y r i g h t( c )M i c r o s o f tC o r p o r a t i o n . A l lr i g h t sr e s e r v e d . W i n d o w s t a t i o n :( W i n S t a 0 )S e s s i o n I D :0 D e s k t o p :( D e f a u l t )A d d r :b c 6 3 0 0 0 0 D e s k t o pH e a p 3 1 4 5 7 2 8( 0 x 3 0 0 0 0 0 )B y t e s C o m m i t t e d 2 1 1 3 5 3 6( 0 x 2 0 4 0 0 0 )B y t e s U n c o m m i t t e d 1 0 3 2 1 9 2( 0 x f c 0 0 0 )B y t e s A l l o c a t e d 2 0 3 2 8 1 6( 0 x 1 f 0 4 b 0 )B y t e s T o t a lF r e e d 8 0 7 2 0( 0 x 1 3 b 5 0 )B y t e s U n u s e d 1 1 1 2 9 1 2( 0 x 1 0 f b 5 0 )B y t e s U s e dR a t e ( 6 4 . 6 )% W i n d o w s t a t i o n :( W i n S t a 0 )S e s s i o n I D :0 D e s k t o p :( D i s c o n n e c t )A d d r :b c 6 2 0 0 0 0 D e s k t o pH e a p 6 5 5 3 6( 0 x 1 0 0 0 0 )B y t e s C o m m i t t e d 4 0 9 6( 0 x 1 0 0 0 )B y t e s U n c o m m i t t e d 6 1 4 4 0( 0 x f 0 0 0 )B y t e s A l l o c a t e d 2 6 4 8( 0 x a 5 8 )B y t e s T o t a lF r e e d 1 4 4 8( 0 x 5 a 8 )B y t e s U n u s e d 6 2 8 8 8( 0 x f 5 a 8 )B y t e s U s e dR a t e ( 4 . 0 )% W i n d o w s t a t i o n :( W i n S t a 0 )S e s s i o n I D :0 D e s k t o p :( W i n l o g o n )A d d r :b c 6 0 0 0 0 0 D e s k t o pH e a p 1 3 1 0 7 2( 0 x 2 0 0 0 0 )B y t e s C o m m i t t e d 2 0 4 8 0( 0 x 5 0 0 0 )B y t e s U n c o m m i t t e d 1 1 0 5 9 2( 0 x 1 b 0 0 0 )B y t e s A l l o c a t e d 8 5 6 0( 0 x 2 1 7 0 )B y t e s T o t a lF r e e d 1 1 9 2 0( 0 x 2 e 9 0 )B y t e s U n u s e d 1 2 2 5 1 2( 0 x 1 d e 9 0 )B y t e s U s e dR a t e ( 6 . 5 )% W i n d o w s t a t i o n :( S e r v i c e 0 x 0 3 e 7 $ )S e s s i o n I D :0 D e s k t o p :( D e f a u l t )A d d r :b c 9 3 0 0 0 0 D e s k t o pH e a p 5 2 4 2 8 8( 0 x 8 0 0 0 0 )B y t e s C o m m i t t e d 6 5 5 3 6( 0 x 1 0 0 0 0 )B y t e s U n c o m m i t t e d 4 5 8 7 5 2( 0 x 7 0 0 0 0 )B y t e s A l l o c a t e d 4 9 7 1 2( 0 x c 2 3 0 )B y t e s T o t a lF r e e d 1 5 8 2 4( 0 x 3 d d 0 )B y t e s U n u s e d 4 7 4 5 7 6( 0 x 7 3 d d 0 )B y t e s U s e dR a t e ( 9 . 5 )% W i n d o w s t a t i o n :( S e r v i c e 0 x 0 3 e 4 $ )S e s s i o n I D :0 D e s k t o p :( D e f a u l t )A d d r :b c 9 b 0 0 0 0 D e s k t o pH e a p 5 2 4 2 8 8( 0 x 8 0 0 0 0 )B y t e s C o m m i t t e d 1 6 3 8 4( 0 x 4 0 0 0 )B y t e s U n c o m m i t t e d 5 0 7 9 0 4( 0 x 7 c 0 0 0 )B y t e s A l l o c a t e d 1 5 3 4 4( 0 x 3 b f 0 )B y t e s T o t a lF r e e d 1 0 4 0( 0 x 4 1 0 )B y t e s U n u s e d 5 0 8 9 4 4( 0 x 7 c 4 1 0 )B y t e s U s e dR a t e ( 2 . 9 )% -

blogs.msdn.com/b/itasupport/archive/2010/02/11/mariora-draft-il-desktop-heap.aspx

3/4

12/04/13

Il Desktop Heap. Perch pu essere un problema, e come risolverlo.. - Supporto Tecnico agli Sviluppatori - Site Home - MSDN Blogs

W i n d o w s t a t i o n :( S e r v i c e 0 x 0 3 e 5 $ )S e s s i o n I D :0 D e s k t o p :( D e f a u l t )A d d r :b c a 3 0 0 0 0 D e s k t o pH e a p 5 2 4 2 8 8( 0 x 8 0 0 0 0 )B y t e s C o m m i t t e d 8 1 9 2( 0 x 2 0 0 0 )B y t e s U n c o m m i t t e d 5 1 6 0 9 6( 0 x 7 e 0 0 0 )B y t e s A l l o c a t e d 7 5 6 8( 0 x 1 d 9 0 )B y t e s T o t a lF r e e d 6 2 4( 0 x 2 7 0 )B y t e s U n u s e d 5 1 6 7 2 0( 0 x 7 e 2 7 0 )B y t e s U s e dR a t e ( 1 . 4 )% W i n d o w s t a t i o n :( S A W i n S t a )S e s s i o n I D :0 D e s k t o p :( S A D e s k t o p )A d d r :b c a b 0 0 0 0 D e s k t o pH e a p 5 2 4 2 8 8( 0 x 8 0 0 0 0 )B y t e s C o m m i t t e d 4 0 9 6( 0 x 1 0 0 0 )B y t e s U n c o m m i t t e d 5 2 0 1 9 2( 0 x 7 f 0 0 0 )B y t e s A l l o c a t e d 2 3 2 0( 0 x 9 1 0 )B y t e s T o t a lF r e e d 1 7 7 6( 0 x 6 f 0 )B y t e s U n u s e d 5 2 1 9 6 8( 0 x 7 f 6 f 0 )B y t e s U s e dR a t e ( 0 . 4 )% W i n d o w s t a t i o n :( _ _ X 7 8 B 9 5 _ 8 9 _ I W )S e s s i o n I D :0 D e s k t o p :( _ _ A 8 D 9 S 1 _ 4 2 _ I D )A d d r :b c b 3 0 0 0 0 D e s k t o pH e a p 5 2 4 2 8 8( 0 x 8 0 0 0 0 )B y t e s C o m m i t t e d 4 0 9 6( 0 x 1 0 0 0 )B y t e s U n c o m m i t t e d 5 2 0 1 9 2( 0 x 7 f 0 0 0 )B y t e s A l l o c a t e d 2 3 2 0( 0 x 9 1 0 )B y t e s T o t a lF r e e d 1 7 7 6( 0 x 6 f 0 )B y t e s U n u s e d 5 2 1 9 6 8( 0 x 7 f 6 f 0 )B y t e s U s e dR a t e ( 0 . 4 )% -

Alla prossima! Mario Raccagni Senior Support Engineer Platform Development Support Team

Comments
aniello 16 Nov 2010 6:37 AM #

ho da porle una domanda... ho da poco comprato un pc architettura I5 con WinXp , dopo i primi 3 mesi in cui la macchina non ha fatto nessuna grinza mi ritrovo da una settimana a qusta parte con il seguente problema dopo circa 3/4 ore in cui la macchina resta accesa, iniziano man mano a cancellarsi le icone , poi mi da errori vari di Programmi non correttamente inizializati, fino ad arrivare al punto che devo riavviare la macchina una volta riavviata, il pc non presenta problemi se non dopo 3/4/8/12 ore volevo sapere se lei ha un idea dal cosa possa dipendere questo problema premetto che la macchina stata formattata e non girano programmi di natura sconosciuta o incontrollata spero che almeno lei possa darmi delucdazioni a riguardo la ringrazio preventivamente per il supporto datomi e in attesa di sua risposta le lascio i miei pi distinti saluti.

blogs.msdn.com/b/itasupport/archive/2010/02/11/mariora-draft-il-desktop-heap.aspx

4/4