류짱:Beyond MySelf

시스템 크래시 후 페이징 파일 사이즈가 갑자기 변경 되었어요?? 본문

Microsoft/Windows Platform

시스템 크래시 후 페이징 파일 사이즈가 갑자기 변경 되었어요??

リュちゃん 2011. 1. 21. 19:46

오늘 오전 동일 시스템이 두번 Crash 나는 대형 사고가 발생하였습니다. 다행히도 두번의 예기치 않은 종료 발생시 크래시 덤프는 정상적으로 수집이 되었습니다.

그런데 이상한 일이 생겼습니다. 분명 시스템의 페이징 파일(page.sys 파일)의 사이즈가 물리적 메모리 보다 큰 16.4 G 정도 였는데 덤프가 연속해서 두번(부팅 후 3분 정도 후발생하고 나서 페이징 파일의 크기가 8G로 줄어 들어 버렸네요... -________-;

분명 페이징 파일의 처음 크기와 최대 크기가 1640MB 로 되어 있습니다. 그런데 현재 크기는 8629MB입니다.

사실 해당 시스템의 덤프 생성 위치는 덤프 생성 기본 위치인  C:\Windows\ 가 아니고 다른 드라이브 입니다. 다른 로컬 드라이브로 지정이 되어 있습니다.

왜 그랬을 까요? 누가 그랬을 까요
? 아래 KB를 보시면  이유를 알 수 있습니다.

What to consider when you configure a new location for memory dump files in Windows Server 2003
http://support.microsoft.com/kb/886429/en-us

When Windows restarts after the fatal error, Windows requires a temporary file on the boot volume that is equal to the physical memory that is installed in the computer. If there is not enough hard disk space available to meet this requirement, the memory dump file is still generated. However, the pagefile size on this volume is reduced. 

아래 설명은 Windows Server 2003 에서 dump 생성 되는 과정입니다. Windows server 2008도 비슷한 과정이나 savedump.exe 프로세스는 없습니다.^^ 

·        메모리 덤프를 생성하는 첫 번째 단계에서 세션 메니저 서브시스템 프로세스(SMSS.exe) Savedump.exe 가 하던 작업 중 일부를 직접 수행합니다. SMSS 는 페이지 파일 헤더 블록을 검사하여 메모리 덤프 파일이 손상 되었는지 확인을 합니다. 파일이 손상되지 않았다면 SMSS 는 원본 페이지 파일을 덤프 파일 크기 만큼 잘라낸 후 Dumpxxx.tmp rename 합니다. SMSS Dumpxxx.tmp 파일을 부트 볼륨에 저장한 후 파일에서 히든과 시스템 속성을 제거 합니다. SMSS TempDestination 값을 설정하고 덤프 파일 값을 레지스트리에 저장 합니다. 이 키는 나중에 Savedump.exe Dumpxxx.tmp Memory.dmp 로 복사할 때 사용합니다.

·        메모리 덤프 생성의 두 번째 단계에서 Savedump.exe 는 아래 레지스트리 키를 확합니다. HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CrashControl\MachineCrash 이 키가 존재한다는 것은 정상적인 덤프 파일이 생성되었다는 것이고 savedump.exe 가 이 데이터를 읽어 덤프 파일을 올바른 위치로 복사 합니다.

·        SMSS 는 부트 볼륨에만 쓸 수 있으며 필터 드라이버들은 무시 됩니다. (필터 드라이버가 무시 되기 때문에 RAID 에는 저장할 수 없습니다.)

·        SMSS 는 페이지 파일을 임시 파일로 rename 하기 위해 NtSetFileInformation 을 사용 합니다. 이 함수는 동일 볼륨에 대해서만 rename 을 허용 합니다.

이제 이유를 아셨죠?

덤프가 저장 되는 위치가 C:\windows 폴더가 아니고 다른 로컬 드라이브로 지정이 되어 있을 경우에는크래시가 발생하여 덤프가 수집 될 때 페이징 파일에 저장 되어 있던 메모리 덤프 파일이 C:\windows 폴더에 dumpxxx.tmptruncated & Rename 되고 해당 파일이 지정 된 드라이브에 memory.dmp copy니다.

그리고 페이징 파일에 저장 되어 있던 메모리 덤프가
C:\windows
폴더에
tmp
로 만들어 지는 과정에서 만약
C
드라이브의 공간이
부족하면 OS는 자동으로 페이징 파일의 사이즈를 줄여서 C 드라이브에 공간을 확보 합니다
.

C 드라이브의 공간 부족 때문에 가끔 덤프 파일 생성 위치를 변경 하기도 하는데 이제 다시 고려를 해 봐야 할 것 습니다. 처음부터 C 드라이브의 공간을 넉넉히 가져 가야 겠네요..
만약 OS가 Windows Vista 이상이라면 Dedicateddumpfile을 설정 하는 것도 방법 일 수 있구요...
DedicatedDumpFile 사용 방법
http://ryuchan.kr/90

그리고 한가지 유의 해야 할 점은 만약 위와 같은 상황으로 페이징 파일이 줄어 든채 시스템이 부팅 되었다면 다음에 정상적으로 덤프를 받기 위해서는 C 드라이브의 공간을 확인하고 또한 페이징 파일이 다시 16G 이상 즉 물리적 메모리보다 큰 사이즈를 가질 수 있도록 시스템을 재 시작 해 주어야 한다는 것입니다.

 

[참고 사이트]

What to consider when you configure a new location for memory dump files in Windows Server 2003
http://support.microsoft.com/kb/886429/en-us

Savedump.exe 그리고 페이지 파일

http://blogs.msdn.com/b/kocoreinternals/archive/2009/02/24/cda-savedump-exe.aspx

감사합니다^^