Microsoft 장애조치 클러스터 환경 머신에서 /3GB 옵션을 추가한 후 재부팅 하였을 때 부팅이 되지 않고 블루스크린이 발생하는 장애가 발생하였습니다. 일반적인 상식으론 커널 메모리 리소스 부족을 의심할 수 있겠습니다만 어떤 개체인지 정확한 근거를 찾아 봐야 합니다...


[환경]
Windows Server 2003 SP2 (MSCS 구성)
Physical Memory : 16GB 


[현상]
BOOT.INI 를 편집하여 /3GB 옵션을 추가한 뒤 시스템을 재시작 하였는데 부팅 과정에서 BSoD 가 발생하며 시스템이 Crash 되었습니다. 그리고 아래 메시지와 함께 커널 메모리 덤프가 생성 되었습니다.

STOP: c0000218 {Registry File Failure}
The registry cannot load the hive (file):
\SystemRoot\System32\Config\SYSTEM
or its log or alternate.
It is corrupt, absent, or not writable. 


[원인]
일반적으로 /3GB 옵션을 사용할 경우 Paged Pool, Non Paged Pool, System PTEs  리소스가 줄어들게 됩니다. 부팅 과정에서 System PTEs 의 가용 영역이 부족하여 커널 모듈을 로드하지 못하고 Crash 가 발생하였습니다.


[해결방안]
1. /3GB 옵션이 반드시 필요한지 검토해 봅니다. 커널 메모리 리소스가 줄어들기 때문에 가급적 사용하지 않는 것이 좋을 듯 합니다만 반드시 사용해야 하는 환경이라면 /userva 옵션을 사용하여 사용 공간을 튜닝할 수 있습니다. 
2. 64BIT 환경을 검토해 봅니다. ^^; 
3. Video Display, Storage Driver 를 업데이트 합니다. 
4. 디버깅 환경을 설정하여 System PTEs 를 소모하는 개체를 찾습니다. 아래 Action Plan 을 참조해 주시기 바랍니다. 


[Action Plan]
1. /3GB 스위치와 함께 표준 VGA 모드의 Normal boot 를 시도합니다. 비디오 드라이버의 이상을 확인하기 위함입니다.
2. /3GB 스위치와 함께 System PTEs 의 Stack Trace 를 설정하여 시스템을 재시작한 뒤 추가 원인 분석을 진행합니다. 

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management
값 이름: TrackPtes 
값 형식: REG_DWORD
값 데이터: 1



[분석결과]
커널 메모리 덤프 분석을 진행합니다.

3: kd> !analyze -v
*******************************************************************************
*                                                                             *
*                        Bugcheck Analysis                                    *
*                                                                             *
*******************************************************************************

Unknown bugcheck code (c0000218)
Unknown bugcheck description
Arguments:
Arg1: e205c100
Arg2: 00000000
Arg3: 00000000
Arg4: 00000000

Debugging Details:
------------------

BUGCHECK_STR:  0xc0000218

ERROR_CODE: (NTSTATUS) 0xc0000218 - {

ADDITIONAL_DEBUG_TEXT:  \SystemRoot\System32\Config\SYSTEM - hive could not be loaded.

DEFAULT_BUCKET_ID:  DRIVER_FAULT

PROCESS_NAME:  System

CURRENT_IRQL:  0

LAST_CONTROL_TRANSFER:  from e07b44c7 to e0627c83

STACK_TEXT:  
ee2dc848 e07b44c7 0000004c c0000218 ee2dc880 nt!KeBugCheckEx+0x1b
ee2dc9fc e079134e c0000218 00000001 00000001 nt!ExpSystemErrorHandler+0x535
ee2dcba8 e07915ef c0000218 00000001 00000001 nt!ExpRaiseHardError+0xac
ee2dcc34 e06ca066 c0000218 00000001 00000001 nt!ExRaiseHardError+0x145
ee2dcdac e0749b7c 00000003 00000000 00000000 nt!CmpLoadHiveThread+0x322
ee2dcddc e068e092 e06c9d44 00000003 00000000 nt!PspSystemThreadStartup+0x2e
00000000 00000000 00000000 00000000 00000000 nt!KiThreadStartup+0x16



3: kd> !vm

*** Virtual Memory Usage ***
Physical Memory:     3996825 (  15987300 Kb)
Page File: \??\C:\pagefile.sys
 Current:   4177920 Kb  Free Space:   4176060 Kb
 Minimum:   4177920 Kb  Maximum:      4194304 Kb
Available Pages:     3921880 (  15687520 Kb)
ResAvail Pages:      3923353 (  15693412 Kb)
Locked IO Pages:          54 (       216 Kb)
Free System PTEs:        391 (      1564 Kb)

********** Running out of system PTEs **************



3: kd> !sysptes 3

System PTE Information
  Total System Ptes 4294967296
     SysPtes list of size 1 has 0 free
     SysPtes list of size 2 has 47 free
     SysPtes list of size 4 has 21 free
     SysPtes list of size 8 has 23 free
     SysPtes list of size 16 has 16 free
 
    starting PTE: c0758000
    ending PTE:   c0784ff0

      free ptes: c0770f18   number free: 5.
      free ptes: c0770f58   number free: 2.
      free ptes: c07710a8   number free: 11.
      free ptes: c0773510   number free: 6.
      free ptes: c0773548   number free: 226.
      free ptes: c0775410   number free: 2.
      free ptes: c0775430   number free: 2.
      free ptes: c0775760   number free: 8.
      free ptes: c0779800   number free: 1.
      free ptes: c0779810   number free: 15.
      free ptes: c0779890   number free: 6.
      free ptes: c07798c8   number free: 10.
      free ptes: c0779920   number free: 12.
      free ptes: c0779988   number free: 24.
      free ptes: c0779a60   number free: 1.
      free ptes: c0779a70   number free: 27.
      free ptes: c0779b50   number free: 1.
      free ptes: c077d500   number free: 16.
      free ptes: c0782538   number free: 16.

  free blocks: 19   total free: 391    largest free block: 226



3: kd> !sysptes 4 // 할당된 개체와 PageCount 확인을 위해서는 stack trace 를 활성화 해야 합니다. 

0x0 System PTEs allocated to mapping locked pages

VA       MDL     PageCount  Caller/CallersCaller


[참고자료]
/userva 스위치를 /3GB 스위치와 함께 사용해서 사용자 모드 공간을 2GB에서 3GB 사이의 값으로 조정하는 방법

본 자료는 한국 마이크로소프트 기술지원부 자료를 참조하여 일부 재구성 하였습니다.


작성자 : Lai Go / 작성일자 : 2009.05.06

Posted by Lai Go