Desktop heap je vyhrazená pamět sloužící pro ukládání objektů session souvisejících s GUI (okna, menu atd..). Více např. zde nebo UTFG. Velikost desktop heapu je uměle omezena (bez ohledu na velikost RAM) a to následovně (platí pro Windows Server 2008 R2 64bit):
Interaktivních úloh obvykle na produkčním serveru moc neběží, důležité jsou ty neinteraktivní - tedy služby běžící pod nějakým uživatelem. Taková služba může pod sebou spouštět stovky procesů a každý z nich si z desktop heapu o velikosti 768kB kousek uzme. Pod velkou záteží tak může dojít k situaci, kdy pamět pro desktop dojde. Důsledkem jsou pády nově spouštěných procesů a celkově podivnému chování.
Postup popsán zde. Ve zkratce:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\SubSystems
je položka Windows
a v ní sekce SharedSection=xxxx,yyyy,zzzz
.
Bohužel ve Windows není jednoduchý nástroj na zjištění velikosti alokované paměti desktop heapu. Takže je nutné provést následující postup. Na serveru je potřeba mít přístup na weby do Internetu (80 a 443) - při instalaci se budou stahovat debug symboly. Poté je možné přístup zaříznout.
c:\dskheapmon\
c:\dskheapmon\livekd.cmd
- při prvním spuštění se zeptá na adresář se symboly (std. C:\Symbols
- potvrdit jen Enterem) a na automatické stažení ladicích symbolů (opět jen Enter). Chvíli to bude stahovat.
!dskheap
. Stáhnou se při něm další symboly.
c:\dskheapmon\dskheap_snapshot.cmd
), případně i včetně seznamu procesů s podrobnostmi (c:\dskheapmon\dskheap_snapshot_with_pslist.cmd
). Po spuštění dávky se musí počkat cca. 10 sekund a pak potvrzením "n" + Enter dávku ukončit (nepodařilo se totiž zatím nijak potlačit dotaz z LiveKD na znovuspuštění Kernel Debuggeru). Snímky se ukládají do podsložky c:\dskheapmon\Snapshots
(vytvoří se automaticky) do jednotlivých časově pojmenovaných podadresářů.
V souboru dskheap.txt (v podadresáři se snapshotem) je pak procentuální využití desktop heapu pro jednotlivé sessions.
0: kd> !dskheap *** ERROR: Module load completed but symbols could not be loaded for LiveKdD.SYS Winstation\Desktop Heap Size(KB) Used Rate(%) ------------------------------------------------------------ WinSta0\Default 20480 0% WinSta0\Disconnect 96 6% WinSta0\Winlogon 192 3% Service-0x0-3e7$\Default 3072 0% Service-0x0-3e4$\Default 3072 0% Service-0x0-3e5$\Default 3072 0% Service-0x0-2cfce$\Default 3072 10% Service-0x0-13ac4f$\Default 3072 5% ------------------------------------------------------ Total Desktop: ( 36128 KB - 8 desktops) Session ID: 0 ============================================================v detailu:
Winstation @fffffa82d3a83420: (Service-0x0-2cfce$) SessionID: 0 Desktop @fffffa82d3a832b0: (Default) Desktop Heap Size: 3145728 (0x 300000) Bytes Committed: 344064 (0x 54000) Bytes UnCommitted: 2801664 (0x 2ac000) Bytes Allocated: 324576 (0x 4f3e0) Bytes Total Freed 19488 (0x 4c20) Bytes Unused: 2821152 (0x 2b0c20) Bytes Used Rate: ( 10)%