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

시스템이 초기화 될 때, 메모리 관리자는 커널모드 구성 요소들이 시스템 메모리를 할당하기 위해 사용하는 두 가지 종류의 동적으로 크기가 변화는 메모리 풀 공간 즉 Paged pool NonPaged pool을 생성한다.


Nonpaged Pool (비페이징 풀)
언제나  실제 메모리에 상주하여 언제든지 어느 수준 IRQL 수준에서나 어느 프로세스 컨텍스트에서나 페이지 폴트를 내지 않고 엑세스 할 수 있다고 보장된 시스템 가상 주소 영역이다.

The kernel and device drivers use nonpaged pool to store data that might be accessed when the system can’t handle page faults. The kernel enters such a state when it executes interrupt service routines (ISRs) and deferred procedure calls (DPCs), which are functions related to hardware interrupts. Page faults are also illegal when the kernel or a device driver acquires a spin lock, which, because they are the only type of lock that can be used within ISRs and DPCs, must be used to protect data structures that are accessed from within ISRs or DPCs and either other ISRs or DPCs or code executing on kernel threads. Failure by a driver to honor these rules results in the most common crash code, IRQL_NOT_LESS_OR_EQUAL.

 

Nonpaged pool is therefore always kept present in physical memory and nonpaged pool virtual memory is assigned physical memory. Common system data structures stored in nonpaged pool include the kernel and objects that represent processes and threads, synchronization objects like mutexes, semaphores and events, references to files, which are represented as file objects, and I/O request packets (IRPs), which represent I/O operations.


 

Paged pool(페이징 풀)
실제 메모리에서 제거 되어 페이징 파일에 기록 될(page out) 수도 있고 반대로 페이징 파일에서 실제 메모리로 올라올(Paged in)  수 있는 시스템 공간의 가상 메모리 영역이다.

Paged pool, on the other hand, gets its name from the fact that Windows can write the data it stores to the paging file, allowing the physical memory it occupies to be repurposed. Just as for user-mode virtual memory, when a driver or the system references paged pool memory that’s in the paging file, an operation called a page fault occurs, and the memory manager reads the data back into physical memory. The largest consumer of paged pool, at least on Windows Vista and later, is typically the Registry, since references to registry keys and other registry data structures are stored in paged pool. The data structures that represent memory mapped files, called sections internally, are also stored in paged pool.

 

Device drivers use the ExAllocatePoolWithTag API to allocate nonpaged and paged pool, specifying the type of pool desired as one of the parameters. Another parameter is a 4-byte Tag, which drivers are supposed to use to uniquely identify the memory they allocate, and that can be a useful key for tracking down drivers that leak pool,


위 두 가지 메모리 풀들이 주소 공간의 시스템 부분에 위치해 있고 모든 프로세스의 가상주소 공간에서 매핑된다.


Nonaged pool과 Paged pool은 시스템에서 실제 메모리 양을 기반으로 최기 크기로 시작하여 필요 한 경우 시스템 부팅 시에 계산 된 최대 크기 까지 점점 증가 한다. 


시스템 별 최대 풀 크기 사이즈는 아래 링크에서도 확인 가능 하지만 가장 정확한 값을 측정 하기 위해서는 Windows debugging tool을 이용해야 한다. 확인 방법은 아래 포스팅을 통해서 ^^

* Windows server 커널 메모리 값 => http://ryuchan.kr/16

* 시스템 커널 리소스(Nonpaged pool, Paged pool) 모니터링 방법 #1 =>http://ryuchan.kr/87

nonpaged pool limits across different version of Windows:

 

32-bit

64-bit

XP, Server 2003

up to 1.2GB RAM: 32-256 MB  
> 1.2GB RAM: 256MB

min( ~400K/MB of RAM, 128GB)

Vista, Server 2008, 
Windows 7, Server 2008 R2

min( ~75% of RAM, 2GB)

min(~75% of RAM, 128GB)

 

summary of paged pool limits across operating systems:

 

32-bit

64-bit

XP, Server 2003

XP: up to 491MB 
Server 2003: up to 650MB

min( 4 * nonpaged pool limit, 128GB)

Vista, Server 2008, 
Windows 7, Server 2008 R2

min( system commit limit, 2GB)

min( system commit 

 HKLM\System\CurrentControlSet\Control\SessionManager\Memory Management


 

그리고.......  각 각의 Pool에 어떤 것들이 존재 할까?

 

Nonpaged pool 에는  Kernel-mode drivers(.sys), User mode 공간에서 실행 중인 어플리케이션의 handles 등이 존재 하며Paged pool에는 Token Objects, Kernel-mode drivers 그리고 Registry 등이 존재 한다.


[참고 사이트]


Understanding Pool Consumption and Event ID: 2020 or 2019

http://blogs.msdn.com/b/kocoreinternals/archive/2008/09/04/pool-event-id-2020-2019.aspx


Pushing the Limits of Windows: Paged and Nonpaged Pool
http://blogs.technet.com/b/markrussinovich/archive/2009/03/26/3211216.aspx

 


감사합니다^^

 

 


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