2007~2011/Windows Platform2011. 4. 25. 23:18
Windows Server 2008, Windows VISTA 32bit 운영체제의 Paged Pool, NonPaged Pool 리소스 사용을 제한하기 위해서 Registry 키 값을 통해 설정할 수 있습니다. 물론 이전 버전에서도 가능했습니다만 약간의 차이가 있습니다.

커널 어드레싱 동적 관리(Dynamic kernel addressing)를 지원함으로써 주소 공간 사이즈를 고정하지 않고 주소 공간에 여유가 있을 때, 동적으로 Paged Pool, NonPaged Pool 사이즈를 확장할 수 있다는 것이 이전 Windows Server 2003 에서 정해진 커널 메모리 영역에 따른 시스템 리소스 부족 현상에 대해서 조금 더 유연하게 대처할 수 있는 기능입니다.



[환경]
Windows Server 2008 SP1
Physical Memory : 2GB (Hyper-V, Guest OS)


[시나리오]
Memory Management 설정을 변경하는 아래 레지스트리 경로에서 PagedPoolLimit, NonPagedPoolLimit 설정 후 시스템을 재시작 합니다.

HKEY_LOCAL_MACHINE\SYSTEM\Current Control Set\Control\Session Manager\Memory Management

1. REG_DWORD - NonPagedPoolLimit : 360 (Decimal) 
2. REG_DWORD - PagedPoolLimit : 900 (Decimal) 


(단위 : MB)





[확인방법] 
1. Process Explorer 를 사용하여 Paged Pool, NonPaged, Pool Limit 을 확인합니다. Limit 을 적용했던 값은 나타나지 않고 각각 2GB, 1.5GB 값이 나타납니다. 실제 사용 가능한 최대 값이 아니라는 것입니다. 



2. NotMyFault 툴을 사용하여 NonPaged Pool Leak 을 일부러 일으켜 360MB 부근에 도달하면 Pool allocation failed 가 발생하며 결국 system hang 이 발생하는 것을 확인할 수 있었습니다. 


3. Debug Mode 로 부팅하여 Windbg 로 로컬 커널 디버그를 연결하여 현재 문제 발생 시점의 가상 메모리 값을 확인합니다.

lkd> vertarget
Windows Server 2008/Windows Vista Kernel Version 6001 (Service Pack 1) MP (1 procs) Free x86 compatible
Product: Server, suite: Enterprise TerminalServer SingleUserTS
Built by: 6001.18000.x86fre.longhorn_rtm.080118-1840
Machine Name:
Kernel base = 0x8161a000 PsLoadedModuleList = 0x81731c70
Debug session time: Mon Apr 25 22:33:17.123 2011 (GMT+9)
System Uptime: 0 days 0:25:45.031

 
lkd> !vm 21

*** Virtual Memory Usage ***
Physical Memory:      523988 (   2095952 Kb)
Page File: \??\C:\pagefile.sys
 Current:   2403152 Kb  Free Space:   2403148 Kb
 Minimum:   2403152 Kb  Maximum:      6287856 Kb
Available Pages:      364889 (   1459556 Kb)
ResAvail Pages:       415301 (   1661204 Kb)
Locked IO Pages:           0 (         0 Kb)
Free System PTEs:     381636 (   1526544 Kb)
Modified Pages:         3411 (     13644 Kb)
Modified PF Pages:      3411 (     13644 Kb)
NonPagedPool Usage:    92117 (    368468 Kb)
NonPagedPool Max:     389108 (   1556432 Kb) // MmMaximumNonPagedPoolInBytes
PagedPool 0 Usage:      3928 (     15712 Kb)
PagedPool 1 Usage:      2375 (      9500 Kb)
PagedPool 2 Usage:       152 (       608 Kb)
PagedPool 3 Usage:       214 (       856 Kb)
PagedPool 4 Usage:       192 (       768 Kb)
PagedPool Usage:        6861 (     27444 Kb)
PagedPool Maximum:    523264 (   2093056 Kb) // MmMaximumPagedPoolInBytes

********** 4236 pool allocations have failed ********** // Paged Pool Limit 에 도달한 이후 추가 요청에 대한 실패

Session Commit:         4416 (     17664 Kb)
Shared Commit:          7283 (     29132 Kb)
Special Pool:              0 (         0 Kb)
Shared Process:         1596 (      6384 Kb)
PagedPool Commit:       6877 (     27508 Kb)
Driver Commit:          1883 (      7532 Kb)
Committed pages:      150894 (    603576 Kb)
Commit limit:        1108659 (   4434636 Kb)


VA Type     CurrentUse    Peak      Limit          Failures
Unused         1484 Mb       0 Mb   OPEN              0
SessionSpace     28 Mb      32 Mb   OPEN              0
ProcessSpace     16 Mb       0 Mb   OPEN              0
BootLoaded       28 Mb       0 Mb   OPEN              0
PfnDatabase      14 Mb      76 Mb   OPEN              0
NonPagedPool    360 Mb  360 Mb     360 Mb         18804 // MmNonPagedPoolLimit
PagedPool        32 Mb   44 Mb     900 Mb             0 // MmPagedPoolLimit
SpecialPool       0 Mb       0 Mb   OPEN              0
SystemCache      28 Mb     150 Mb   OPEN              0
SystemPtes       24 Mb      28 Mb   OPEN              0
Hal               4 Mb       0 Mb   OPEN              0
SessionGlobal    12 Mb      12 Mb   OPEN              0
NonPagedSpecialPool    18 Mb       0 Mb   OPEN              0
Driver Images     0 Mb       0 Mb   OPEN              0

Maximum contiguous unused VA:  972 Mb


Max 값과 Limit 의 차이를 혼동하지 말고 Windows Server 2008 에서는 디버그 모드로 부팅하지 않는 한 커널 디버깅을 할 수 없으니 커널 메모리 이슈 발생 시, Registry 값도 같이 확인해야 할 것 같습니다.


[참고자료]
Memory Management Registry Keys


작성자 : Lai Go / 작성일자 : 2011.04.25
Posted by Lai Go