2012.08.24 18:22
Pool 이란?
드라이버가 사용하는 가상 메모리
드라이버는 메모리 블락을 얻기 위해서 ExAllocatePoolWithTag를 호출
메모리관리자(Memory Manager)는 4K로 이루어진 가상메모리 페이지를 관리
메모리관리자는 블락단위로 Pool을 할당
Pool은 PagedPool과 NonPagedPool이 있음
- PagedPool : PageOut될 수 있음, 일반적으로 할당
- NonPagedPool : Paged 될 수 없음, DISPATCH_Level이나 그 이상의 IROL에서 읽거나 쓰여질 때 사용됨
Pool Leak 발생
드라이버가 ExAllocatePoolWithTag를 호출 할 때 ExFreePool 또는 ExFreePoolTag를 호출하지 못하는 증상
Leak는 메모리 사용률이 높다는 의미는 아님
Leak는 절대 감소, 반환되지 않지만 일반적인 메모리 사용은 증,감이 됨
증상
시스템 성능감소
64bit 시스템에서는 가용메모리가 크게 감소하기 시작함
성능 로그 수집 방법
Logman.exe create counter PerfLog-Long -o "c:\perflogs\\%computername%_PerfLog-Long.blg" -f bincirc -v mmddhhmm -max 300 -c "\LogicalDisk(*)\*" "\Memory\*" "\Cache\*" "\Network Interface(*)\*" "\Paging File(*)\*" "\PhysicalDisk(*)\*" "\Processor(*)\*" "\Processor Information(*)\*" "\Process(*)\*" "\Redirector\*" "\Server\*" "\System\*" "\Server Work Queues(*)\*" "\Terminal Services\*" -si 00:05:00
성능수집 시작
Logman.exe start PerfLog-Long
성능수집 중지
Logman.exe stop PerfLog-Long
분석방법
수집된 로그를 Perfmon을 통해서 불러옴
PoolNonpagedBytes 그레프의 증가 추이를 봄(꾸준히 증가하면 Memory Leak을 의심, 실제 물리적인 메모리 사용량을 나타냄)