Desktop Heap 문제

오늘은 듣기에 조금 생소하실 Desktop Heap에 대해서 말씀드리도록 하겠습니다.

여러분들이 실행하는 응용프로그램이 띄우는 Window 하나 하나가 모두 Desktop Heap이라는 메모리 공간을 가지게 됩니다 이를 Desktop Heap Allocation이라고 하며 사용자가 새로운 Windows, Menus, toolbars등을 생성할때마다 user32.dll과 gdi32.dll에 의해 이루어지게 됩니다.

Desktop Heap에 의해서 나타나는 문제 현상은 아래와 같습니다.

1. 응용프로그램을 실행시키면 한 참 뒤에서야 해당 프로그램의 Window가 나타난다. (2~30초 에서 늦으면 3분)
2. 시스템 응답 속도가 느려지거나 메모리와 관련된 문제라고 의심이 드는 현상이 발생한다.
3. 작업 관리자(Taskmgr.exe)를 실행하면 탭(응용프로그램, 프로세서, 서비스, 성능 등..)들 중에 나타나지 않는 텝이 있거나 혹은 메뉴 일부가 나타나지 않는다.

대부분 잘못된 프로세스에 의해서 Desktop Heap이 고갈되면서 나타나며 특히 3번 현상이 나타나면 백발 백중 Desktop Heap 문제라고 보시면 됩니다.

image

Desktop Heap 문제 발생 에러

Desktop Heap 문제를 프로세스를 찾아 내는 방법이 있기는 하지만 조금(?) 복잡하고 아주 길어지는 이야기라 블로그에서는 Skip하기로 하고 Workaround로 Desktop Heap 크기를 조절해서 문제를 최대로 피하는 방법을 설명 드리겠습니다.  Desktop Heap은 아래와 같은 구성 영역들로 이뤄집니다.

Total Desktop Heap size (48MB) =
win32k.sys (8MB)
+ Session Working Set (4MB)
+ Mapped views for the session (20MB)
+ Paged Pool for this session (16MB)

*그러나 Terminal Service가 enable되어 있을 경우, desktop heap allocation 가능크기는 20MB(default)으로 변경됩니다, 그래서 Terminal Service 환경에서 Desktop Heap 이슈가 발생할 확률이 높습니다.

Desktop Heap 문제가 있을 경우아래 두 가지 Registry key를 이용해 Desktop Heap 크기를 증가시킬 수 있습니다, 증가는 16MB씩 증가시켜야 합니다.

- SessionViewSize (default: 20MB)를 증가시키면 "Mapped views for the session" Size가 증가
- SessionPoolSize (default: 16MB)를 증가시키면 "Paged pool for this session" size가 증가

* Windows 2000 SP4 이하 버전에서는 kb318942 fix를 설치한 후에 위 설정을 적용합니다, 단 Windows 2000 SP4 Update RollUp 1이나, 그 이후의 Windows버전에서는 이미 적용되어 있어 별도 Hotfix를 적용할 필요가 없습니다.

그러나 여기에는 상충관계가 존재합니다. 즉, SessionViewSize를 많이 증가시키게 되면, System Cache and/or System PTE for threads 공간을 그만큼 사용하게 만들어 그 영역의 문제를 유발할 수 있습니다. 즉 하나의 파이를  어떻게 나누느냐에 따라 누구는 큰 파이를 먹게 되고 누구는 남이가져간 양 만큼 파이의 크기가 적어지듯이 한정된 리소스에서 기본적으로 하나를 증가시키면 다른 하나의 영역이 감소하게 됩니다, 그러면 줄어든 영역에서 또 다른 문제가 발생할 수 있습니다. 그러므로 너무 지나치게 증가시키지 않도록 조심 하십시오.

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management 에서 Registry Key]

SessionViewSize - the desktop heap when Terminal Services enabled. (Default 20MB on NT/2K.  Default 48MB on XP/2003)

SessionPoolSize - the session pool space when Terminal Services enabled. (Default 16MB)

SystemViewSize - the desktop heap when Terminal Services disabled. (Default 48MB)

SessionImageSize - the address space where the Win32k.sys file and the NT4 print drivers are loaded. (Default 8 MB)

* 이론적으로 32bit 환경에서 이 값의 합은 512MB를 초과할 수 없으며, 대부분의 설정에서는, 450MB정도를 기록합니다.

p.s. 바쁘다 보니 이제 알았네요.. 요즘 따뜻한 봄 바람이 분다는 걸..