원문 : http://blogs.msdn.com/ntdebugging/archive/2009/12/11/pool-fragmentation.aspx 안녕하세요. 제 이름은 스태판입니다. 저는 Microsoft의 Global Escalation Service Team에서 Escalation engineer로 근무하고 있습니다. 오늘은 제가 최근에 경험했던 풀 메모리의 단편화에 대해서 이야기 하겠습니다. 자 덤프파일을 보도록 하겠습니다. !poolused /t5 2 명령어를 통해 nonpaged pool 사용량이 많은 유저들을 확인해 보았습니다. !vm 의 결과는 101MB 의 사용을 표기 하고 있으나 !poolused 는 65MB 의 사용이 확인 됩니다. 이는 바로 풀 메모리 단편화를 의미합니다. 조사 결과 저는 많은 풀 페이지들이 아래와 같은 패턴으로 구성되어 있음을 확인하였습니다. 페이지 fa808000 은 0x18 = 24 byte 크기 입니다. fa808000 과 fa808a38의 모든 페이지들은 freed 되어 이고, 다른 목적을 위하여 재사용 될 것입니다. 위의 페이지에서는 4096 Bytes 중 24 Bytes 만 사용 중입니다. 이런 상황은 fa550000 과 f8feb000 에서도 동일하게 나타나고 있습니다. 자 우리의 질문은 왜 이런 일들이 일어나고 어떻게 하면 이런 상황을 미연에 방지 할 수 있는가? 입니다. 이 덤프에서 저는 많은 MmCm 의 Pool 메모리 사용 현황을 확인 하였습니다. 다음은 일반적으로 단편화가 발생 하기 위한 상황 입니다. 1) 드라이버가 0xF18 크기의 풀 블럭을 요구합니다. 위의 3개의 풀 모두 Free 된 공간의 총합은 충분히 0xF18 크기 이상이 됩니다. 하지만 전체 페이지 4K는 3개로 분활 되어 있고, 이중 이 Free 된 공간은 꼭대기와 밑쪽에 위치하고 있습니다. 그리고 둘 모두 0xF18 크기를 할당 할 만큼 크지 못합니다. 이와 같은 이슈를 피하기 위해서는 0xF18 사이즈의 요청 대신에 전체 풀을 커버할 수 있는 4K 사이즈의 메모리를 요청하는 것이 좋습니다. 물론 할당된 페이지의 약간의 잔여 공간을 활용하지 못하긴 합니다. 하지만 그 대신에 위와 같은 단편화 현상은 방지 할 수 있습니다. 참고로 MSDN에서는 드라이버의 MmCm ( MmAllocateContiguousMemory ) 이용은 충분히 길게 사용하도록 권고 하고 있습니다. 라이브 디버깅을 할 때, 여러분은 연속적으로 할당 되고 해제 된 MmCm을 볼 것 입니다. 참고 링크 |