류짱: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

C드라이브의 공간을 여유있게 할당 하지 않은 가상화로 운영 중인 Windows Server 2008R2 게임서버들의 디스크 공간확보를 위해서 아래 블로그를 이용해서 Windows update 관련 파일들을 삭제하곤 하였습니다만......
How to Clean up the WinSxS Directory and Free Up Disk Space on Windows Server 2008 R2 with New Update
https://blogs.technet.microsoft.com/askpfeplat/2014/05/13/how-to-clean-up-the-winsxs-directory-and-free-up-disk-space-on-windows-server-2008-r2-with-new-update/
위 방법은
Kb2852386 설치 후 Windows Feature에서 Desktop experience를 설치 해야했고시스템의 재 시작도 필요하여 많은 번거로움이 있었습니다.

이에 다른 방법을 찾아 보다가 최근에 아래와 같은 방법을 찾아서 실 서비스에 적용해 보았으며 문제 없이 동작 하였으니 참고 하시기 바랍니다.

아래 소개 해 드리는 방법은 동일하게 Cleanmgr을 사용하는 것입니다만 Kb2852386Desktop experience를 설치 하지 않은 상태에서 Cleanmgr를 실행하여 불필요 파일의 삭제가 가능 하므로 현재 실행 중인 서버에서 바로 적용이 가능하다는 장점이 있습니다.
물론 파일 삭제 후 재시작은 한번 필요 하지만요..
자세한 방법은 아래와 같습니다.

[Windows Server 디스크 용량 확보 방법]
- 대상 서버 : Windows Server 2008R2

- 상세 방법

먼저 용량이 부족한 서버에 로그온을 합니다.  아래 폴더 위치로 이동하여 cleanmgr.exe 파일을 해당 서버의 c:\windows\system32 폴더에 복사 합니다.

C:\Windows\winsxs\amd64_microsoft-windows-cleanmgr_31bf3856ad364e35_6.1.7600.16385_none_c9392808773cd7da\



다음으로 아래 폴더로 이동하여 cleanmgr.exe.mui 파일을 해당 OS의 설치 언어를 확인하고 c:\windows\system32\(en-us or ja-jp)  OS의 언어에 맞는 폴더에 cleanmgr.exe.mui를 복사합니다. 

C:\Windows\winsxs\amd64_microsoft-windows-cleanmgr.resources_31bf3856ad364e35_6.1.7600.16385_ja-jp_e89ba9cb6f9dcbc3\

ex) English

 

Ex) Japanese



위 두 파일의 복사가 완료 되면 관리자 권한으로 명령프롬프트를 실행 한 후 cleamgr.exe 명령어를 실행 한 후 삭제가 가능한 Windows update 관련 파일들을 삭제하고 시스템을 재 시작 합니다.



만약 작업을 하려는 서버에 위 두 폴더가 존재 하지 않는다면 아래 hotfix를 설치 후위 방법을 진행 하시면 됩니다. (핫픽스 설치 재 시작 필요..-__-)

Disk Cleanup Wizard addon lets users delete outdated Windows updates on Windows 7 SP1 or Windows Server 2008 R2 SP1
http://support.microsoft.com/kb/2852386

그리고 Windows Server
2012R2의 경우에는 기본적으로 드라이브 등록 정보에 Disk cleanup이 제공 되므로 해당 등록정보에서 Disk Cleanup 클릭 후 Windows update cleanup 체크 하시고 삭제 진행 후 시스템 재 시작하면 됩니다.


만약  Disk Cleanup 이 보이지 않는다면 아래 블로그를 통해서 확인 가능 합니다만 dism 명령어를 이용해서 용량 확보가 가능하니 참고 하시기 바랍니다.
How to: Disk Cleanup in Windows Server 2012 (R2) – DISM
https://www.saotn.org/windows-server-2012-r2-disk-cleanup-dism/

[참고 자료]
Disk Cleanup option on drive’s general properties and cleanmgr.exe is not present in Windows Server 2008 or Windows Server 2008 R2 by default
https://technet.microsoft.com/en-us/library/ff630161(WS.10).aspx


감사합니다.


Comment 0