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

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

Windows Server 2003 운영체제에서는 시스템 시작 시 커널 리소스(paged pool, Nonpaged pool)서버의 환경(PAE, 3GB 옵션등)에 따라 135M~ 470M까지 할당 되었습니다.
http://ryuchan.kr/16


Nonpaged pool Paged pool 할당 값이 고정 됨으로써 유연하지 못하게 커널 리소스가 할당 되고 비 효율적으로 리소스가 운영 되어
Windows Server 2008 에서는 Limit을 제거하고 동적으로 메모리 공간을 조절할 수 있도록 하였습니다그래서 Windows server 2008 x86에서 최대 각 각 1.5G(Nonpaged pool) 2G(paged pool) 커널 리소스를 사용 할 수 있습니다.

해당 기능은 Default입니다. 즉 기본적으로 Windows server 2008 x86환경의 시스템은 dynamic kernel addressing을 사용 한 다는 것입니다.

그러나  큰 메모리를 사용하는 어플리케이션들이 실행되는 환경이라면 동적 메모리 할당 기능으로 인해 커널 메모리 단편화가 발생 되어 시스템에 hang 증상이나 메모리 부족 오류가 발생 할 수 있으므로 그럴 경우에는 아래와 같이 커널 메모리의 값을 변경 하시면 됩니다.
http://ryuchan.kr/226

Windows Server 2008 에서  기본적으로  로컬 커널 디버깅을 이용하여 커널 리소스를 확인 할 수 없습니다만 Livekd.exe를 이용하면 가능합니다.

서버에 Windows debugging 툴을 설치 한 후 Livekd.exe를 다운 받아 livekd.exe 파일을  c:\program files\Debugging Tools for Windows  폴더에 copy합니다.
그 후 명령프롬프트를 관리자 권한으로 실행 후 아래의 명령어를 실행 합니다.
livekd.exe -kl -y srv*symbols*http://msdl.microsoft.com/download/symbols
심볼이 로드 되고 kd> 화면이 보이면 !vm 1 입력하면 커널 리소스를 확인 할 수 있습니다.

Windows Vista 커널 속으로: 2

http://preview.library.microsoft.com/ko-KR/magazine/cc162480.aspx

동적 커널 주소 공간

Windows Windows용 응용 프로그램은 32비트 프로세서의 주소 공간 한계에 직면했습니다. , Windows 커널은 기본적으로 2GB 또는 전체 32비트 가상 주소 공간의 절반으로 제한되며 나머지 절반은 CPU에서 현재 실행되고 있는 스레드가 속한 프로세스에 사용하도록 예약됩니다.
커널은 이 절반의 주소 공간에서 자신을 매핑하고, 장치 드라이버, 파일 시스템 캐시, 커널 스택, 세션별 코드 데이터 구조 및 장치 드라이버가 할당하는 비페이징(잠긴 실제 메모리) 버퍼와 페이징 버퍼 모두를 매핑해야 합니다. Windows Vista 이전의 메모리 관리자는 부팅될 때 이러한 여러 용도로 할당할 주소 공간의 크기를 결정했습니다. , 이와 같이 유연하지 못하기 때문에 일부 영역에는 가용 공간이 많이 남고 일부 영역에는 가용 공간이 없는 상황이 발생하기도 합니다. 영역을 모두 사용하게 되면 응용 프로그램 오류가 발생하고 장치 드라이버는 I/O 작업을 마칠 수 없게 됩니다.

32비트 Windows Vista에서는 메모리 관리자가 커널의 주소 공간을 동적으로 관리하여 작업 부하 요구 사항에 따라 공간을 여러 용도에 할당 및 할당 취소합니다. , 장치 드라이버가 더 많은 주소 공간을 요구하면 페이징 버퍼 저장에 사용되는 가상 메모리의 양을 늘릴 수 있으며 드라이버의 요구가 사라지면 가상 메모리의 양을 줄일 수 있습니다. 따라서 Windows Vista는 더 다양한 작업 부하를 처리할 수 있으며, 마찬가지로 향후 발표될 Windows Server® 32비트 버전인 코드명 "Longhorn"에서는 더 많은 동시 터미널 서버 사용자를 처리할 수 있습니다.

물론 64비트 Windows Vista 시스템의 주소 공간에는 현재 실질적으로 아무런 제약이 없으므로 최대값으로 구성하기 위한 별다른 조치는 필요하지 않습니다

 

 

Memory Management, Dynamic Kernel Addressing, Memory Priorities and I/O Handling

http://blogs.technet.com/b/askperf/archive/2008/02/07/ws2008-memory-management-dynamic-kernel-addressing-memory-priorities-and-i-o-handling.aspx

The Memory Manager in Windows Server 2008 has been enhanced to provide better performance, scalability, security, and reliability in the following areas:

             Support for dynamic system address space, including on-demand allocation of system virtual address space and kernel page table pages, and support for very large registries.

             To address this, the Dynamic Kernel Address Space feature, in 32-bit versions of Windows Server 2008, the Memory Manager dynamically manages the kernel's address space, allocating and deallocating space to various uses to meet the needs of the system.  As a result, the amount of virtual memory being used for paged and nonpaged pool, system PTE's and session space will grow and shrink based on system activity.  Thus, the need for manual tuning is reduced given the scaling improvements built into the operating system.

 

 

감사합니다.

Comment 0

LiveKD.exe를 이용하여 운영중인 시스템에서 Full Memory Dump 수집하는 방법

참고
아래 방법은 현재 운영중인 시스템에 Crash 등 어떠한 영향도 주지 않습니다. 단지 File I/O 가 많이 발생하여, Dump를 수집하는 동안 성능에 약간의 문제가 있을 수 있습니다. 참조하십시오.

준비사항
1. 아래 링크에서 Debugging 툴인 windbg (Debugging Tools for Windows)를 다운로드하여 설치를 합니다.
http://www.microsoft.com/whdc/devtools/debugging/installx86.mspx

C:\Program Files\Debugging Tools for Windows (x86) 폴더가 생성 됩니다.


참고
위 링크는 32Bit 용 windbg를 다운로드할 수 있습니다. 만약 문제의 시스템이 64Bit 시스템이라면, 아래 링크를 이용하십시오.

http://www.microsoft.com/whdc/devtools/debugging/install64bit.mspx

2. 아래 링크에서 LiveKD.exe를 다운로드하신 후 C:\Program Files\Debugging Tools for Windows (x86)폴더에 복사해 넣습니다.
http://technet.microsoft.com/en-us/sysinternals/bb897415.aspx

3. 명령 프롬프트(cmd.exe)를 수행합니다. C:\ 루트로 이동합니다.

4. LivdKD 를 통해 특정 시스템의 Memory dump를 수집하기 위해서는 Public symbol을 캐쉬로 가져야 합니다. 따라서 아래와 같이 특정 폴더를 생성해 줍니다.
MD C:\Symbols

5. 아래 명령을 통해 위에서 생성한 폴더에 Symbol 이 캐쉬될 수 있도록 설정합니다.
CD C:\Program Files\Debugging Tools for Windows (x86)
Livekd -y SRV*c:\websymbols*http://msdl.microsoft.com/download/symbols
참고 : 위 명령을 처음 수행할 때, 웹에서 해당 시스템의 Symbol 테이블을 확인하고, 다운로드하기 때문에 조금 반응이 늦어질 수 있습니다.
수행 화면은 아래와 같습니다.
C:\Program Files\Debugging Tools for Windows (x86)
livekd -y SRV*c:\symbols*http://msdl.microsoft.com/download/symbols


 

  C:\Program Files\Debugging Tools for Windows (x86)>livekd.exe -y srv*c:\symbols*
http://msdl.microsoft.com/download/symbols\
LiveKd v5.0 - Execute kd/windbg on a live system
Sysinternals - www.sysinternals.com
Copyright (C) 2000-2010 Mark Russinovich and Ken Johnson
Launching C:\Program Files\Debugging Tools for Windows (x86)\kd.exe:
Microsoft (R) Windows Debugger Version 6.12.0002.633 X86
Copyright (c) Microsoft Corporation. All rights reserved.
Loading Dump File [C:\WINDOWS\livekd.dmp]
Kernel Complete Dump File: Full address space is available
Comment: 'LiveKD live system view'
Symbol search path is: srv*c:\symbols*http://msdl.microsoft.com/download/symbols
\
Executable search path is:
Windows Server 2003 Kernel Version 3790 (Service Pack 2) UP Free x86 compatible
Product: LanManNt, suite: Enterprise TerminalServer
Built by: 3790.srv03_sp2_gdr.100216-1301
Machine Name:
Kernel base = 0x80800000 PsLoadedModuleList = 0x808a8e48
Debug session time: Sun Feb 13 11:34:57.897 17420 (UTC + 9:00)
System Uptime: 5 days 17:52:55.604
WARNING: Process directory table base 0280C000 doesn't match CR3 0F8F4000
WARNING: Process directory table base 0280C000 doesn't match CR3 0F8F4000
Loading Kernel Symbols
...............................................................
...............................................
Loading User Symbols
...........
Loading unloaded module list
...............
kd>


[전체 메모리 덤프 수집 방법]

1. LiveKD를 수행합니다. 만약 LiveKD가 수행 중일 때, "Execute KD again? (y/n)" 메시지에서 Y 를 선택하셔도 됩니다. 새로 LivdKD를 수행하려면 아래와 같이 수행합니다.

CD C:\Program Files\Debugging Tools for Windows (x86)
Livekd -y SRV*c:\websymbols*http://msdl.microsoft.com/download/symbols

참고
LivdKD.exe 파일이 C:\Debuggers 폴더에 있기 때문에 위와 같이 명령 프롬프트 창에서 C:\Debuggers 폴더 아래에서 명령을 수행해야 합니다.

2. 시스템에 Crash 나 서비스 프로그램 등에 영향을 주지 않고 Full Memory Dump를 수집하기 위해 LiveKD세션에서 아래와 같이 명령을 수행합니다.
.dump /f /o X:\fulldump.dmp

참고
위 명령에서의 X: 드라이브는 현재 시스템의 Physical 메모리보다 큰 가용공간을 가져야 합니다.
즉, 실제 메모리가 8GB 라면, X: 드라이브의 여유 공간이 최소 8GB 이상이어야 합니다. 물론 fulldump.dmp 파일명과 X: 드라이브는 다른 것으로 변경이 가능합니다.

3. Dump 저장 프로세스가 모두 끝나면, Q 명령을 수행하여 LiveKD를 종료합니다.

감사합니다.

Comment 0