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

Event 2019, 2020 Nonpaged pool이나 Paged pool이 부족 할 경우 발생한다고 여러차례 설명을 하였습니다. Nonpaged pool pagde pool를 합쳐서 pool memory(풀 메모리)라고 합니다.

http://ryuchan.kr/entry/Nonpaged-pool비페이징--Paged-pool페이징-
이 풀 메모리에는 시스템 관련 드라이버나 커널 객체들이 로드 되는데 풀 메모리 부족 현상이 발생하는 주요 이유는 풀 메모리에 로드 되는 드라이버들의 메모리 누수(Leak) 때문입니다.
풀 메모리의 부족으로 Event 2019혹은 2020이 발생 한다면 아래와 같은 4가지 방법으로 시스템의 풀 메모리를 가장 많이 사용하는 Pool tag를 확인 할 수 있습니다. 문제의 pool tag가 확인이 되면 맨 아래 설명 된 findstr 명령어로 해당 Pool tag를 사용하는 시스템 드라이브를 찾을 수 있습니다
.
풀 태그가 무엇인지에 대해서는 이전에 포스팅한 아래 블로그를 참고 하시기 바랍니다
.
http://ryuchan.kr/entry/Pool-Tag-태그란-무엇인가

[커널 리소스 사용량 확인 방법]
1. Poolmon.exe
메모리 풀 모니터(Poolmon.exe)를 사용하여 커널 모드 메모리 누수 문제를 해결하는 방법
http://support.microsoft.com/kb/177415

2. Windbg or Livekd.exe

명령프롬프트 실행 후 debugging tool이 설치 된 directory로 이동 후 아래 명령어 실행
Nonpaged Pool
Kd.exe -kl -y "srv*c:\symbols*http://msdl.microsoft.com/download/symbols" -c "!poolused /t5 2";;q

Paged Pool
Kd.exe -kl -y "srv*c:\symbols*http://msdl.microsoft.com/download/symbols" -c "!poolused /t5 4";;q

3. Pooltag.exe
PoolTag.exe 이용하여 Nonpaged pool Paged Pool 많이 사용하는 Tag 알아보기

4. Poolsnap
   A. Poolsnap 이용한 Event id 2019, 2020 발생 원인 분석 #1
   B. Pool Log Analyzer Tool

위의 방법들을 이용해서 어떤 Pool tag가 많은 커널 메모리를 사용하는지 확인이 되었다면 이제는 해당 Pool tag는 어떤 드라이브들이 사용을 하는지에 대한 확인이 필요 합니다.
문제가 발생 했던 서버로 로그온 후 명령 프롬프트 실행 후 C:\windows\system32\drivers 폴더로 이동합니다.

findstr /M /L 풀태그 * .sys (풀 태그의 문자는 반드시 대소문자를 구분 하셔야 합니다.)

만약 위와 같은 툴 들이 준비 되어 있지 않다면 bange.exe나 키보드 덤프 혹은 NMI를 통해서 메모리 덤프를 수집 후에도 확인이 가능 합니다.

감사합니다.

 

Comment 0

생각보다 user dump를 수집 할 수 있는 방법이 많네요....
userdump.exe / adplus / debug diag / process explorer /
작업 관리자 / procdum.exe ...등 등
..

정리 해 봅니다
.

1. Userdump.exe
도구를 사용하여 덤프 파일을 만드는 방법

http://support.microsoft.com/kb/241215/ko

1. 아래 링크를 통하여 user dump tool을 다운로드 받아 설치합니다.

http://www.microsoft.com/downloads/en/details.aspx?FamilyID=e089ca41-6a87-40c8-bf69-28ac08570b7e

2. 더블 클릭하여 실행하면 실행 파일이 C:\kktools\userdump81\ folder에 저장됩니다.

3. C:\kktools\userdump81\x86\setup.exe를 실행하여 setup process실행합니다.

4. 설치 과정에서 “Dump on process termination” 기능을 enable합니다.

5. 설치가 끝나면, 제어판에서 Process dumper 를 실행합니다

6. New 를 클릭하시고, dump를 수집할 process를 입력합니다.

=> 여기에 수집 하고자 하는 process 이름, 예를 들면, explorer.exe 를 입력합니다.

7. 해당 아이템을 Double click 하여 process monitor rule 대화상자를 실행합니다.

8. Use custom rules 을 실행합니다

9. Dump file folder text 상자에 덤프 파일이 저장될 경로를 입력합니다.

10. All Exceptions 를 선택합니다.

11. Minidump type Complete, Save mode Cyclic Saving(5 times) 를 선택합니다.

12. Monitor process exit 을 선택하고 Minidump type Complete 를 선택합니다.

13. 문제 증상을 재현하면, 9번에 설정한 경로에 process덤프가 생성될 것입니다.

** 자료 수집 이후, 덤프 설정을 제거하기 위해서는 제어판/Process dumper/Process Monitoring에서 explorer.exe 를 선택 후, Remove 버튼을 클릭하시면 됩니다.


2. Adplus.vbs 이용한 덤프 수집

ADPlus를 사용하여 "중지" "충돌" 문제를 해결하는 방법
http://support.microsoft.com/kb/286350

adplus를 이용한 process dump 생성

A. cmd 창을 설치하고, windbg가 설치된 폴더(C:\program files\Debugging Tools for Windows )
이동합니다.
B.
작업 관리자에서 덤프를 생성하고자 하는 프로세스의 ID를 확인 합니다
.
cf)
명령 프롬프트를 실행하여 tasklist 명령어를 실행하여 PID Process Name을 확인 하셔도 됩니다
.
C.
아래 명령으로dump 수집을 위한 명령어를 실행합니다
.

1. Crash Dump
수집

adplus
crash p[덤프 수집하고자 하는 프로세스 PID] –o c:\(덤프저장위치)

2.
프로세스 hang 덤프 수집
adplus -hang -pn [
덤프 수집하고자 하는 프로세스 이름] –o c:\(덤프 저장위치)

> adplus crash p 2784
o c:\  // 프로세스 ID 2784의 프로세스에 crash가 발생 할 경우 C:\ 저장




3. Debug diag1.2을 이용한 덤프 수집

Debug Diagnostic Tool v1.2
http://www.microsoft.com/download/en/details.aspx?id=26798

Debug Diagnostics Tool v1.2 is now available

http://support.microsoft.com/kb/2580960

4. Process Explorer를 이용한 덤프 수집
Sysinternals
사이트에서 Process Explorer를 다운 로드 후 설치

http://technet.microsoft.com/en-us/sysinternals

A.
프로세스 익스플로러를 실행 후 덤프를 수집 하고자 하는 프로세스를 오른쪽 마우스로 선택 후 create dump => Full dump


5. 작업 관리자를 이용한 덤프 수집(Windows Vista 이상)
How to create a user-mode process dump file in Windows Vista and in Windows 7
http://support.microsoft.com/kb/931673

How to create a user-mode process dump file in Windows Server 2008
http://support.microsoft.com/kb/949180

작업 관리자를 실행 후 덤프를 생성 하고자 하는 프로세스를 오른쪽 마우스로 선택 후 덤프를 생성 합니다.






덤프가 생성 되는 위치를 쉽게 찾아가는 방법은 작업 표시줄 => 시작 => 열기에 [%appdata%]를 입력 후 해당 폴더로 이동 하는 것입니다.

6. Windows debugging tool을 이용한 덤프 수집


7. procdump.exe를 이용한 덤프 수집

http://technet.microsoft.com/en-us/sysinternals/dd996900

덤프 수집 예)

Procdump -64 c 50 ma s 2 n 2 2252 c:\temp
프로세스 id 2252 cpu의 사용률이 2초간 50% 이상 될 경우 c:\temp에 프로세스 full 덤프 수집

옵션 설명
-64: OS
x64버전 일 경우
- c: CPU
의 사용률
- ma: process full dump
- S: C
옵션을 이용해서 지정한 CPU usage의 지속 시간()
- n:
덤프 수집 횟 수

- 2252 : cpu
를 많이 사용한w3wp프로세스 ID
- c:\temp :
덤프 생성 위치



감사합니다^^

Comment 0

Windows server의 Nonpaged pool과 Paged pool의 사용량과 최대 값을 확인 하는 방법을 정리 합니다.
작업 관리자나 성능 모니터를  통해서는 단순히 현재 사용 중인 커널 리소스의 사용량만 확인 할 수 있기 때문에 어느 시점에 해당 시스템에 문제가 발생 할 여지가 있을 지 이벤트 로그에 2019나 2020이 생성 되기 전에는 알 수가 없습니다. .. 혹은 시스템에 crash가 발생 하거나.........터미널 접속이 안된 다거나.. Hang 증상을 보인다거나 결국 어떻게든 문제가 발생해야 확인이 가능 하다는 것이죠..

사전에 미리 예방 할 수 있는 방법은 없는 걸까요?

아래 방법을 이용하여 시스템의 사용 가능 한 최대 값을 확인 한 후 성능 모니터나 작업 관리자를 통해 지속적인 사용량을 확인 후 약 70% 넘으면 경고 메시지를 보낼 수 있게 하면 좋을 듯 한데요…….

우선은 어떻게 시스템의 커널 리소스의 최대 값을 확인 할 수 있는지.. 그 방법부터 한번 확인 해 보도록 하겠습니다.

1. Debugging tools for Windows를 이용한 시스템 리소스 확인 방법

Install Debugging Tools for Windows 32-bit Version
http://www.microsoft.com/whdc/devtools/debugging/installx86.mspx

Install Debugging Tools for Windows 64-bit Version
http://www.microsoft.com/whdc/devtools/debugging/install64bit.mspx

* 설치 받은 파일을 실행하여 설치 하시면 됩니다. 설치 과정은 어렵지 않으므로 생략 합니다.

다운 받은 windows debugging tool을 설치 후 실행합니다.

 

심볼 Path를 아래와 같이 입력한 후 OK를 누릅니다.
srv*c:\symbols*http://msdl.microsoft.com/download/symbols

메뉴에서 File => Kernel debugging을 선택 합니다.

Kernel debugging 화면에서 Local을 선택 후 OK를 누릅니다.

No를 클릭합니다.

 symbol을 Fix하고 reload 하셔야 합니다.
.symfix c:\symbols
.reload

위 두 명령어를 먼저 실행 합니다.^^ 심볼이 맞지 않으면 엉뚱한 정보가 나올 수 있습니다.^&^

그리고 "!vm 1" 을 입력합니다.




현재 사용 중인 Nonpaged pool usage와 Max 그리고 Paged pool의 usage와 max를 확인 할 수 있습니다.

2. Process Explorer 를 이용한 시스템 리소스 확인 방법

먼저 아래 사이트에서 Process Explorer를 다운 받아서 설치합니다.
Process Explorer v12.03
http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx



메뉴 => option => configure symbol를 선택합니다.



Dbghelp.dll과 symbols path에 아래와 같이 주소를 입력 합니다

* Dbghelp.dll의 경우 먼저 windows debugging tool 이 설치 되어 있어야만 경로를 설정 할 수 있습니다.


프로세스 익스플로러 화면에서 시스템 정보를 확인 하기 위해 아래의 아이콘을 선택 합니다.


아래와 같이 현재 시스템에서 사용 중인 커널 리소스 사용량 최대 값과 Max를 확인 할 수 있습니다.

 

 감사합니다.

Comment 0