류짱:Beyond MySelf

최근 oo 게임 서버들의 물리 메모리 부족으로 게임 프로세스가 얘기치 않게 종료 되어 해당  서버의 리소스 사용량을 확인해보니 Mapped file과 paged Pool의 사용량이 약 6G 이상으로 비정상적으로 높아 Poolmon을 통해서 paged pool 사용률이 가장 높은 녀석의  Pool tag를 확인하고 해당 pool tag를 사용하는 드라이버를 찾아서 삭제 한 후 시스템을 재 시작 한 적이 있습니다.

그런데 해당 서버들을 재 시작 후 모든 서버가 정상인데 아래 서버만 특이하게 재 시작 후 바로 paged pool의 사용량이 높아져 서버를 다시 확인 해 보았습니다.

이번에는 poolmon이 아닌 Windows Debugging tool과 Sysinternals에서 제공하는  livekd를 이용해서 MS Public symbol을 fix한 후 리소스 사용률을 좀 더 정확하게 확인 해 보았습니다.
확인 결과 아래와 같이 "CM31"이라는 Pool tag가 약 1.95G 정도의 Paged pool을 사용하고 있고 "CM31" pool tag는 Windows registry에서 사용하는 것임을 알게 되었습니다. 

이에 해당 서버의 Windows\system32\config 폴더에서 레지스트리 파일을 확인 해보니 software 파일이 1.9G 이상이었습니다. ㅎ

Paged pool 메모리에는 레지스트리 파일이 로드 되기 때문에... 해당 서버의 paged pool의 사용량은 높을 수 밖에 없었네요..
왜 그럼 해당 서버의 software 레지스트리 파일만 비정상적으로 사이즈가 커졌을까요? 구글링을 해보니 유사 이슈가 있었고. 공교롭게도 이 서버에도 SQL이 설치 되었던 것인지 아직 SQL 관련 업데이트 파일들이 설치 된 채로 있네요 --_-;

How SQL Server 2012 Service Pack 1 destroyed my life
https://lokna.no/?p=1251

여튼 해당 이슈를 확인하고 원인을 분석한 방법을 공유하니 참고 하시기 바랍니다.

[환 경]
OS : Windows Server 2008R2 SE on VMWare
Memory : 12G

[증 상]

Paged pool의 사용량이 동일 환경의 다른 서버들보다 매우 높음

[원 인]

"CM31"이라는 Pool tag가 약 1.95G 정도의 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.9G가 이상입니다.


그리고 추가로 왜 해당 서버만 레지스트리 파일이 비정상적으로 커졌는지 궁금해서 구글링을 하다 아래 블로그를 확인 하고 해당 서버도 확인을 해보니 이전에 SQL 서버가 설치 되었었고 현재 SQL 관련 업데이트 파일이 그대로 있었으며 심지어 Windows update가 계속 실패 되고 있는 것이 확인 되었습니다.

How SQL Server 2012 Service Pack 1 destroyed my life
https://lokna.no/?p=1251

이에 우선 Windows update가 정상적으로 실행 될 필요가 있어서 아래 업데이트들을 먼저 설치하고 최신 업데이트 까지 모두설치 해 줄것을 가이드 하였습니다.

kb3020369 - April 2015 servicing stack update for Windows 7 and Windows Server 2008 R2
kb 3125574 - Convenience rollup update for Windows 7 SP1 and Windows Server 2008 R2 SP1

[참고 자료]
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


감사합니다.

Comment 0

인터넷이 안되는 환경의 서버에서 Livekd를 이용한 Full dump 수집 방법

인터넷이 안되는 환경의 서버에서 간혹 LiveKD를 이용해서 메모리 덤프 수집을 해야 하는 경우가 간혹 있는데 예전에는 해당 머신과
동일 빌드 버전의 OS를 인터넷  환경에 설치하거나 인터넷이 연결 된 동일 환경 OS에서 Windbg 설치 후 LiveKD를 이용하여 심볼을
다운 받고 그 심볼을 인터넷이 안되는 환경에 복사 후 Livekd를 이용하여 Full dump를 수집 하였습니다.
그런데 인터넷이 안되는 환경과 인터넷이 되는 환경의 같은 OS도 빌드 버전이 보안 업데이트 설치 여부에 따라 달라지는 경우가 많아
같은 OS의 심볼을 받아도 LiveKD가 실행 되지 않는 경우가 다반사 였습니다.

최근 서버에서 online 중에 덤프 수집이 필요하여 여러번 삽집을 하면서 keyboard 나 NMI 혹은 notmyfault로 덤프 수집을 해야 하나
고민하다가 우연찮게...블로그를 발견해서.. 얼마나 고맙든지.. (오래 됬는데 왜 이제서야 알게 되었을까요? ㅎㅎ)

Livekd를 이용한 덤프 수집 방법은 http://ryuchan.kr/145 에 오래 전에 정리 해 두었었는데... windbg 파일 다운로드 링크는 업데이트가
좀 필요 하네요^^

여튼 방법은 이렇습니다.

먼저 LiveKD를 이용해서 덤프를 수집 할 인터넷이 안되는 환경의 서버에서 Kernel32.dll, Ntdll.dll, ntoskrnl.exe 파일을 복사하여
인터넷이 되는 PC에 복사를 합니다.
아래 예에서는 인터넷이 되는 제 PC에 D:\Testsymbols\system32 폴더를 만들고 온라인 덤프 수집이 필요한 서버의 해당 파일을 복사
하였습니다.


제 PC에는 Windows debugging tool이 설치 되어 있고 Livekd 또한 미리 복사 되어 있기 때문에 명령 프롬프트를 실행 후 해당 폴더로
이동을 합니다. 그리고 아래와 같은 명령어를 입력 합니다.

symchk /if d:\testsymbols\system32\*.* /s srv*d:\testsymbols*http://msdl.microsoft.com/download/symbols

명령어를 실행 하면 아래와 같이 tessymbols 폴더에 3개의 .pdb 폴더가 다운로드 됩니다.

제 PC에 다운로드 된 3개의 *.pdb 폴더를 인터넷이 안되는 덤프 수집이 필요한 서버에 복사합니다.
해당 서버에도 미리 Windows debugging tool설치하고 Livekd를 복사 해 놓았기 때문에 c:\testsysmbols라는 폴더에 해당 파일을 복사 하였습니다.

해당 서버에서 명령프롬프트를 실행하여 Windows debugging tool이 설치 된 , Livekd가 복사 된 폴더로 이동하여 Livekd.exe를 실행합니다.

정상적으로 라이브 커널 디버깅이 연결 된 것이 확인 됩니다. 이제 full dump 수집을 위해서 아래 명령어를 실행하고 덤프가 수집 되는 것을 확인 합니다. 

덤프 수집이 완료되면 q 명령어로 kernel debugging 연결을 끊고 수집 된 덤프를 분석 합니다.

[참고 자료]
Online Kernel Memory Dump using LiveKd.exe
https://blogs.technet.microsoft.com/carlh/2009/11/30/online-kernel-memory-dump-using-livekd-exe/


Comment 0