류짱:Beyond MySelf

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

운영 중인 시스템에서 event 2019나 2020 이 발생하면 NonPaged pool과 Page pool 등의 커널 리소스의 사용량 확인이 반드시 필요합니다.
Nonpaged pool과 Paged pool이 무엇인지는 아래 포스팅 내용을 참고 하시기 바랍니다.
Nonpaged pool(비페이징 풀) & Paged pool(페이징 풀)

아래 사례는 실제 운영 시스템에서 Nonpaged pool이 거의 소진 되어 Event 2019 메세지가 지속적으로 발생하여 어떤 시스템 드라이버가 많은 메모리를 사용하는지 확인 하기 pool tag의 메모리 사용량을 모니터링 하는 방법을 설명 한 것입니다.

아래와 같은 상황에서 Poolmon을 이용하여 Tag를 확인 할 수도 있지만 poolsnap을 이용해서도 가능 합니다. Poolmon 사용 법에 대한 자세한 내용은 다음에…… 그리고 Pooltag.exe 라는 프로그램도 있습니다만 오늘은 PoolSnap 을 이용해서 한번 확인 해 보도록 하겠습니다.

[환 경]
Windows server 2003 Ent + SP2

[증 상]
Event ID 2019 발생과 함께 시스템 반응이 느려짐

Event ID 2019
Description:
The server was unable to allocate from the system nonpaged pool because the pool was empty.


[분석 결과]
페이지 안됨(Non paged pool의 메모리가 거의 다 소진 되었음
현재 시스템의 boot.ini 확인 결과 3GB 옵션이 없기 때문에 해당 시스템이 사용 할 수 있는 최대 NP 메모리는 약 260M 이므로 거의 다 소진 된 상태임.
서버 별 사용 가능한 커널 메모리 Table은 아래의 주소를 참조^^
http://ryuchan.kr/16

 

[Action Plan]
현재 어떤 드라이브가 Kernel 메모리를 많이 사용하고 있는지 확인 하기 위해서는 아래와 같이 Poolsnap을 이용하여 로그를 수집 한 후 분석을 합니다.

1. Poolsnap Log 수집 방법

 1. 아래의 파일을 다운 받아 압축을 해제합니다. 
   


2. 압축 해제된 파일 중 gflags.exe를 실행하신 후 "Enable Pool Tagging" 옵션을 체크하고, [Apply]를 누르고 [OK]를 누릅니다.

3. 도스 창을 실행하신 후 압축 해제된 디렉토리로 이동하신 후 아래 명령을 실행합니다.
poolsnapsvc -install
아래 명령은 PoolSnapSvc 서비스를 설치 후 poolsnap 로그를 C:\ 에 생성합니다.
위 명령을 수행하면 아래와 같은 메시지가 나타납니다.
Pool Snap Service installed.
Pool Tagging not enabled, Reset GlobalFlag to 0x400 and please reboot your machne to take effect now

4. 서비스에서 "Pool Snap Service" 서비스를 시작합니다.

5. 문제 재현 후, 생성된 c:\poolsnap.log 파일을 확인합니다..
(해당 서비스 시작 후에 재 부팅 없이도 해당 경로에 파일이 정상적으로 수집되는지 확인 후 로그가 제대로 생성 되지 않을 경우에는 시스템의 재 부팅이 필요합니다.)

6. PoolSnap Log가 기록 되는 시간은 아래 레지스트리 키를 이용해서 변경이 가능 합니다.
   기본 값은 5분 입니다. Log가 생성 되는 위치도 변경이 가능 하겠네요^^

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PoolSnap\Parameters\Sample Interval




2. 성능 모니터 설정]

   추가 적으로 서버의 상태 체크를 위해서는 성능 로그를 수집 하는 것이 좋습니다.

[Performance Log]
        다음의 objects에 대해서 모든 counters, instances를 수집합니다.

        Process
        Processor
        Memory
        Server Work Queues
        Thread
        System 
        Network Interface

수집 간격은 10분 정도로 하시고 수집해 주십시오.데이터 샘플 간격은 4시간 이상 모니터링 하는 경우 15초마다 업데이트하는 것이 적당합니다.
8시간이상 수집하는 경우 300초(5분)보다 짧게 설정하지 마십시오

다음에는 수집 된 위 로그를 분석하는 방법을 설명 하도록 하겠습니다.

감사합니다^^

Comment 0