류짱:Beyond MySelf

Livekd와 Windows Debugging tool을 이용한 Page pool 확인 방법 본문

Microsoft/Windows Platform

Livekd와 Windows Debugging tool을 이용한 Page pool 확인 방법

リュちゃん 2017. 12. 28. 17:52

최근 C게임의 게임 서버에서 게임 서버 프로세스가 얘기치 않게 종료되는 장애가 발생하여  담당자의 요청으로 해당 서버를 살펴 보니 시스템이 시작 된지 얼마 되지 않았음에도 paged pool의 사용률이 매우 높았습니다.
담당자에게 물어보니 게임서버 프로세스가 종료 된 시점이 주말, 사용자가 그나마 가장 많은 시점이었고 물리 메모리가 90%이상 사용중이었으며 리소스 부족으로 게임 프로세스가 얘기치 않게 종료 되었다고 하여 아무래도 Paged pool이 2G이상의 물리 메모리를 사용하고 있어서 게임프로세스에 추가로 할당 할 메모리기 부족했었던 것 같아서 먼저 paged pool의 사이즈가 2G이상인  원인을 찾아보기로 했습니다.

인터넷이 안되는 서버라 Windows Debugging tool과 Sysinternals에서 제공하는 livekd를 설치 후 해당 서버에 필요한 MS Public symbol을 복사 한 후 Livekd를 이용해서 paged pool의 사용률 및 pool tag를 확인 해보니  "CM31"이라는 Pool tag가 약 1.95G 정도의 Paged pool을 사용하고 있었고 해당  "CM31" pool tag는 Windows registry에서 사용하는 것임을 알게 되었습니다.

이에 해당 서버의 Windows\system32\config 폴더에서 레지스트리 파일을 확인 해보니 software 파일의 사이즈가 1.95G
Paged pool 메모리에는 레지스트리 파일이 로드 되기 때문에... 해당 서버의 paged pool의 사용량은 높을 수 밖에 없었던... ㅎㅎ

Pushing the Limits of Windows: Paged and Nonpaged Pool
https://blogs.technet.microsoft.com/markrussinovich/2009/03/10/pushing-the-limits-of-windows-paged-and-nonpaged-pool/
The largest consumer of paged pool, at least on Windows Vista and later, is typically the Registry, since references to registry keys and other registry data structures are stored in paged pool. The data structures that represent memory mapped files, called sections internally, are also stored in paged pool.

서버를 좀더 살펴 보니 Windows update 또한 2014년 이후 계속 실패되고 있어서.. 큰맘 먹고 해당 서버를 살려 보기로 하였습니다. ㅎ
이번 포스트팅에서는 우선 paged pool의 사용률이 tag를 확인 하는 방법을 설명하고 레지스트리 압축 후 paged pool 사이즈의 변경과 Windows update까지 되게끔 하여 해당 서버를 살려 낸 방법은 다음 포스팅에 소개 하겠습니다.

Livekd와 Windbg을 이용한 Page pool 확인 방법
[환 경]
OS : Windows Server 2008R2 SE on VMWare
Physical Memory : 12G

[증 상]1
1. 게임 프로세스의 얘기치 않은 종료 발생
2. Paged pool의 사용량이 동일 환경의 다른 서버들보다 매우 높음

3. Windows update 실패

[Livekd와 Windbg를 이용한 Paged pool 상세 확인 방법]
우선 paged pool의 사용률이 높은 서버에 Windows debugging tool을 설치하고 liveked를 복사합니다. 그리고  p 해당 서버는 인터넷이 안되는 환경이기 때문에 이전에 포스팅한 적이 있는"인터넷이 안되는 환경의 서버에서 Livekd를 이용한 Full dump 수집 방법"(http://ryuchan.kr/510)에 소개 한 것처럼  paged pool의 사용률이 높은 서버의 system32폴더에서 Kernel32.dll, Ntdll.dll, ntoskrnl.exe 3개의 파일을 복사하여 인터넷이 되는 Windows debugging tool이 설치 된 PC로 옮긴 후 해당 pc에서 아래와 같이 symchk 명령어를 실행해서 public symbol을 다운로드 받은 후 해당 파일들을 livekd를 실행 서버로 다시 옮깁니다.

명령 프롬프트를 관리자 권한으로 실행하고 Windows debugging tool이 설치 된 폴더로 이동하여 미리 복사 해 놓은 livked 커멘드를 심볼을 fix하는 명령어와 함께 실행 합니다.
livekd -y D:\sytem_sys32

위 명령어 실행 후 정상적으로 로컬 심볼이 로드 되면 아래와 같이 !poolused /t10 4 명령어를 실행합니다.해당 명령어를 실행하면 아래와같이 paged pool의 사용률이 가장 높은 10개의 pool tag와 함께 사용량을 확인 할 수 있습니다.
아래 그림에서 학인 되는 것처럼 CM31이라는 pool tag가 약 1.95G의 메모리를 사용하고 있습니다.

CM31 tag는 레지스트리가 사용하는 tag임을 확인하고 실제 해당 서버의 레지스트리 파일을 확인 해보니 아래와 같이 software 레지스트리 파일의 사이즈가 1.95G가 이상입니다.

추가로 Windows update도 2014년 이후에 계속 설치가 실패되고 있어서 해당 서버의  CBS를 로그를 살펴 보았습니다.  CBS 로그를 보니 아래와 같이 시스템 리소스  오류 메시지가 발생하고 있네요. 흐흐흐.

[조치 방법]
아무래도 손상된 소프트웨어 레지스트리와도 관련이 있는 듯해서 해당 레지스트리를 Fix 가 필요 해 보여서 아래 KB를 참고하여 레지스트리 파일을 압축 하려고 하였지만 실패 하였습니다.
How to Compress "Bloated" Registry Hives
https://support.microsoft.com/en-us/help/2498915/how-to-compress-bloated-registry-hives
그러나  다행히도 다른 방법을 이용해서 겨우 레지스트리를 압축을 성공하여 Paged pool 메모리도 정상사이즈로 변경 되었고 추가로 업데이트도 성공적으로 진행하였습니다. 

레지스트리의 Fix 에 관한 자세한 내용은 다음 포스팅(http://ryuchan.kr/533)을 참고 하십시오^^

[참고 자료]
Debugging Tools for Windows (WinDbg, KD, CDB, NTSD)
https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/
인터넷이 안되는 환경의 서버에서 Livekd를 이용한 Full dump 수집 방법
http://ryuchan.kr/510
LiveKd v5.62
https://docs.microsoft.com/en-us/sysinternals/downloads/livekd

고맙습니다