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 가 발생하였습니다.
일반적으로 /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