류짱:Beyond MySelf

Windows Server 2012R2 로 구성 된 클러스터 된 파일 서버에서 Nonpaged Pool 사용률이 비 정상적으로 높아
어떤 녀석이 많은 메모리를 사용 중인지 확인 하기 위해서 Livekd를 이용해서 라이브 디버깅을 해 보았습니다. 

[환 경]
 OS : Fail Over Cluster File Server on Windows Server 2012R2

[증 상]
 Nonpaged Paginng Pool의 메모리 사용률이 비 정상적으로 높앞으며 시스템 프로세스가 사용하는 핸들 수 도 2만이 
 넘었음.


[확인 사항]

  • 파일 서버 이기 때문에 오픈 된 파일이나 연결 된 사용자 사세션이 많은 지 확인 해 보았으나 연결 된 세션이 많지 않았음
  • 각 노드의 TCP 커넥션 수 확인

  

원인 분석을 위해서
Windows debugging tool 설치 후 해당 설치 디렉터리에 Livekd 를 복사한다.

  

디버깅을 위한 심볼 Fix를 위해서

파일 서버에서 MS 심볼 서버로 접근 할 수 없기 때문에 로컬 컴퓨터(Windows 8.1)에서 widbg를 실행 후 덤프를 하나 열고
심볼을 받아서 해당 심볼 중 아래 두 폴더를 라이브 디브깅을 할 폴더로 복사한다.
 



분석을 진행 할 서버에서 명령 프롬프트를 이용해서 Windows debugging 폴더로 이동하여
Livekd -y c:\symbols 

명령어 입력 후
정상적으로 로컬 디비깅이 실행 되면 리소스 확인에 필요한 커멘드를 이용해서 리소스 사용률 확인
   

0: kd> !vm 4

*** Virtual Memory Usage ***

Physical Memory: 6288149 ( 25152596 Kb)
Page File: \??\C:\pagefile.sys
Current: 26214400 Kb Free Space: 25872832 Kb
Minimum: 26214400 Kb Maximum: 75497472 Kb
unable to get nt!MmSystemLockPagesCount
Error reading free nonpaged PTEs 0000000000000004
Available Pages: 1703176 ( 6812704 Kb)
ResAvail Pages: 2875193 ( 11500772 Kb)
Locked IO Pages: 0 ( 0 Kb)
Free System PTEs: 59377 ( 237508 Kb)
Free NP PTEs: 0 ( 0 Kb)
Modified Pages: 8080 ( 32320 Kb)
Modified PF Pages: 8089 ( 32356 Kb)
NonPagedPool 0 Used: 1455190 ( 5820760 Kb)
NonPagedPool 1 Used: 1651617 ( 6606468 Kb)
NonPagedPool Usage: 3250905 ( 13003620 Kb)
NonPagedPool Max: 4294967296 (17179869184 Kb)
PagedPool 0 Usage: 147291 ( 589164 Kb)
PagedPool 1 Usage: 42232 ( 168928 Kb)
PagedPool 2 Usage: 35308 ( 141232 Kb)
PagedPool Usage: 224831 ( 899324 Kb)
PagedPool Maximum: 4160749568 (16642998272 Kb)
Shared Commit: 348374 ( 1393496 Kb)
Special Pool: 0 ( 0 Kb)
Shared Process: 11828 ( 47312 Kb)
PagedPool Commit: 224941 ( 899764 Kb)
Driver Commit: 55834583195 (223338332780 Kb)
Committed pages: 4696802 ( 18787208 Kb)
Commit limit: 12841749 ( 51366996 Kb)

Nopaged Pool을 가장 많이 사용하는 top5 Pool tag 확인 

0: kd> !poolused /t5 2

Sorting by NonPaged Pool Consumed
Pool Used:
NonPaged Paged

Tag Allocs Used Allocs Used

MPP. 49781288 10354777664 0 0 UNKNOWN pooltag ' MPP', please update pooltag.txt
VoSm 3689 240181440 0 0 Bitmap allocations , Binary: volsnap.sys
Mdl 81341 170719024 0 0 Io, Mdls
ConT 387 140668928 0 0 UNKNOWN pooltag 'ConT', please update pooltag.txt
Cont 1112 106383968 0 0 Contiguous physical memory allocations for device dr
TOTAL 51007260 11496509728 604302 758159552


MPP 풀태그를 사용하는 시스템 드라이버 확인
   

C:\Windows\System32\drivers>findstr /l /m MPP *.sys

afd.sys
ClusDisk.sys
CsvFlt.sys
CsvFs.sys
ds4dsm.sys
ds4utm.sys
dxgkrnl.sys
FWPKCLNT.SYS
http.sys
mup.sys
ndis.sys
ndiswan.sys
pacer.sys
rassstp.sys
sdstor.sys
SerCx.sys... 등등


대부 분 MS에서 제공하는 드라이브 이나 Ds4dsm.sys와 Ds4utm.sys만 IBM 에서 제공한 모듈로 해당 모듈의 최신 버전 확인 필요
추가로 서치를 좀 해보니 해당 모듈에서 메모리 릭이 발생 한 사례가 있네요.

http://www-01.ibm.com/support/docview.wss?uid=ssg1S1005069


[참고자료]

http://ryuchan.kr/145

http://ryuchan.kr/344

http://blogs.technet.com/b/askperf/archive/2011/09/23/getting-to-know-the-mmst-pool-tag.aspx

https://windowsarchitecture.wordpress.com/2015/01/12/windows-2012-r2-poolmon/

   

   

   

  

Comment 0

NotMyFault를 이용한 풀 메모리 Leak 발생 테스트와 windbg를 이용해서 Local kernel debugging 으로 pool memory를 사용하는 tag 들을 확인 해 보도록 하겠습니다.

[준비 사항]
Windows debugging 툴과 Notmyfault를 다운로드 후 설치 합니다.

가. Debugging Tools for Windows
http://msdn.microsoft.com/en-us/windows/hardware/gg463009
Windbg 설치 방법은 생략 합니다. 서버 버전에 맞는 파일을 다운로드 후 설치 하시기 바랍니다.

나. NotMyFault
http://download.sysinternals.com/Files/Notmyfault.zip
저는 편의상 해당 파일 다운 로드 후 바탕 화면에 압축을 풀었습니다.

다. nonpaged pool 메모리 릭 발생 전 작업 관리자에서 확인한 커널 리소스
paged pool: 18M
Nonpaged pool: 12M

[NotMyFault를 이용한 풀 메모리 Leak 발생 테스트 및 Windbg를 통한 확인]
1. 준비 사항 '가'에서 다운 받은 Debugging Tool을 설치 합니다. => 설치 방법은 생략...
2. 바탕 화면\sysinternals\Notmyfault\exe\Release폴더로 이동하여 NotMyfault.exe 실행 합니다.
3. Nonpaged Pool Memory Leak을 발생 시키기 위해 Leak Nonpaged 를 클릭 합니다.  



* 1M 단위로 Nonpaged pool의 Leak이 발생합니다. 작업 관리자에서 Nonpaged pool의 사용량이 증가 하는 것을 확인 할 수 있습니다.


Nonpaged pool의 크기가 120M 정도까지 증가 하면 Stop nonpaged 를 클릭하여 Leak 발생을 중지 합니다.




4. 이제 windbg를 이용해서 Local kernel debugging을 시작 합니다. Windbg 실행과 심볼 fix 방법은 아래 포스팅을 참고 하시시기 바랍니다..
Windows server 2003 커널 리소스(Nonpaged pool, Paged pool) 최대 값 확인
http://ryuchan.kr/87

5. Windbg 화면에서 아래의 명령어를 실행 합니다

lkd> .symfix c:\symbols //C:\symbols 폴더로 심볼 경로를 지정합니다.
lkd> .reload    // 심볼을 리로드 합니다.
Connected to Windows Server 2003 3790 x86 compatible target at (Fri Feb 17 22:00:28.240 2012 (GMT+9)), ptr64 FALSE
Loading Kernel Symbols
...............................................................
...................................
Loading User Symbols
..........................................................
Loading unloaded module list


lkd> !vm 1                                                                 // 시스템의 Virtual Memory 상태를 확인 합니다.

*** Virtual Memory Usage ***
 Physical Memory:      262004 (   1048016 Kb)
 Page File: \??\C:\pagefile.sys
   Current:   1572864 Kb  Free Space:   1557856 Kb
   Minimum:   1572864 Kb  Maximum:      3145728 Kb
 Available Pages:      191765 (    767060 Kb)
 ResAvail Pages:       199425 (    797700 Kb)
 Locked IO Pages:         359 (      1436 Kb)
 Free System PTEs:      76854 (    307416 Kb)
 Free NP PTEs:          20766 (     83064 Kb)
 Free Special NP:           0 (         0 Kb)
 Modified Pages:          152 (       608 Kb)
 Modified PF Pages:       157 (       628 Kb)
 NonPagedPool Usage:    30894 (    123576 Kb)                     // Nonpaged pool이 약 123 사용중임을 확인
 NonPagedPool Max:      51960 (    207840 Kb)                     // Nonpaged pool 최대 값
 PagedPool 0 Usage:      2953 (     11812 Kb)
 PagedPool 1 Usage:       770 (      3080 Kb)
 PagedPool 2 Usage:       760 (      3040 Kb)
 PagedPool Usage:        4483 (     17932 Kb)
 PagedPool Maximum:     43008 (    172032 Kb)
 Session Commit:          211 (       844 Kb)
 Shared Commit:          2761 (     11044 Kb)
 Special Pool:              0 (         0 Kb)
 Shared Process:         2690 (     10760 Kb)
 PagedPool Commit:       4491 (     17964 Kb)
 Driver Commit:          1221 (      4884 Kb)
 Committed pages:       52346 (    209384 Kb)
 Commit limit:         632268 (   2529072 Kb)


lkd> !poolused /t5 2                                    //nonpaged pool을 가장 많이 사용하는 top5 를 리스트
   Sorting by  NonPaged Pool Consumed

  Pool Used:
            NonPaged            Paged
 Tag    Allocs     Used    Allocs     Used
 Leak      111 113664000         0        0 UNKNOWN pooltag 'Leak', please update pooltag.txt
 LSwi        1  2576384         0        0 initial work context
 nVsC        7  1445440         0        0 UNKNOWN pooltag 'nVsC', please update pooltag.txt
 TCPt       27  1422016         0        0 TCP/IP network protocol , Binary: TCP
 RaRS     1000   720000         0        0 RaidUnitAllocateResources , Binary: storport.sys
 TOTAL       29794 126262872     36446 17757664

6. Leak 이라는 pool tag가 약 110 M 이상의 Nonpaged pool을 사용하고 있음을 확인 할 수 있습니다.

7. 실제 그럼 Leak이라는 Pooltag를 어떤 드라이버가 사용을 하는지 확인을 하기 위해 명령프롬프틍서  아래와 같은 명령어를 입력 합니다. 

 C:\WINDOWS\system32\drivers>findstr /m /l Leak *.sys
myfault.sys

8. Memory Leak 테스트를 위해 실행 한  NotMyFault 프로그램의 시스템 드라이버인  myfault.sys 라는 시스템 드라이버가 많은 메모리를 사용 함을 확인 할 수 있습니다.

감사합니다.

Comment 0