연습 3 - 부팅 중 드라이버 공간 및 동적 할당 추적
풀은 OS 및 장치 드라이버가 데이터 구조를 저장하는 데 사용하는 커널 모드 구성 요소의 메모리 리소스입니다. 풀에는 다음과 같은 4가지 기본 할당 영역이 있습니다.
페이징이 아닌 풀: 할당은 실제 메모리에 상주하도록 보장됩니다.
페이징 풀: 메모리에서 페이지 파일로 페이징할 수 있는 할당입니다.
NX 비페이징 가능 풀: 실행 가능하지 않은 페이징되지 않은 할당입니다.
세션 풀: 세션당 할당합니다. 이러한 항목은 페이징이 가능합니다.
풀 사용량은 컴퓨터의 전체 메모리 사용량에 중요한 영향을 미치며, 부팅 직후에 메모리를 가장 많이 사용합니다. 풀 사용량을 줄이면 OS 전체에서 시스템의 전체 메모리 사용량이 감소하며, 비페이징 가능 메모리는 감소를 유도하는 가장 높은 우선 순위 범주입니다.
이 연습에서는 부팅 중에 받은 편지함 Microsoft 드라이버 할당 및 해당 공간(초기화 시)을 검토합니다.
1단계: 부팅 전환에서 풀 메모리 추적 수집
이 단계에서는 풀 및 상주 집합 데이터를 포함하는 WPR(Windows Performance Recorder)을 사용하여 부팅 추적을 수집합니다.
시작 메뉴에서 WPR을 엽니다.
올바른 이벤트 공급자를 선택합니다.
풀 사용량
상주 집합
첫 번째 수준 심사
성능 시나리오로 부팅을 선택합니다.
로깅 모드로 파일을 선택합니다.
반복 횟수를 1로 설정합니다.
시작을 클릭한 후 위치를 선택하여 ETL 파일을 저장합니다.
시스템이 자동으로 다시 부팅되고 추적이 수집되며 바탕 화면이 표시되면 중지됩니다.
2단계: WPA를 사용하여 풀 데이터 검토
풀 데이터는 WPA의 풀 그래프 요약 테이블을 통해 노출됩니다. 관심 있는 주요 열은 다음 표에 있습니다.
열 머리글을 마우스 오른쪽 단추로 클릭하면 열을 추가하거나 제거할 수 있습니다.
용어 | Description |
---|---|
풀 태그 | 풀 할당과 연결된 태그입니다. |
풀 태그 모듈 | 풀 태그와 연결된 모듈(드라이버)입니다. |
스택 | 메모리 할당으로 이어지는 스레드의 코드 경로를 표시합니다. |
페이징 | 할당이 페이징 풀 또는 비페이징 풀에 배치되었는지 여부를 나타냅니다. |
영향을 미치는 형식 | 할당이 안정적인 상태 메모리 사용량에 기여하는지 또는 일시적인 할당인지를 보여줍니다. |
WPA를 사용하여 1단계에서 캡처한 추적을 엽니다.
추적 메뉴를 열고 기호 경로 구성을 선택합니다.
- 기호 캐시의 경로를 지정합니다. 기호에 대한 자세한 내용은 MSDN의 기호 지원 페이지를 참조하세요.
추적 메뉴를 열고 기호 로드를 선택합니다.
Graph 탐색기의 메모리 범주에서 풀 그래프를 찾습니다.
분석 탭에서 풀 그래프를 끌어다 놓습니다.
다음 열을 표시하도록 테이블을 구성합니다.
풀 태그 모듈
페이징
영향을 미치는 형식
스택
풀 태그
개수
영향을 미치는 크기 및 크기
**풀 태그에 대한 참고 사항: **
드라이버 개발자인 경우 드라이버에서 사용하는 풀 태그를 명확하고 쉽게 식별하여 분석을 용이하게 해야 합니다. 예를 들어 회사 이름이 Fabrikam인 경우 FbkPool1, FbkPool2, FbkBuffer 등 모든 풀 태그에 "Fbk" 접두사를 추가할 수 있습니다.
그래프에서 모든 계열 사용 안 함(>전체 그래프 ->모든 계열에서 ->사용 안함을 마우스 오른쪽 단추 로 클릭)
영향을 미치는 크기 열 머리글을 클릭하여 크기에 영향이 미치면 정렬합니다.
안정적인 상태 메모리 사용량이 가장 높은 드라이버가 맨 위에 표시됩니다.
3단계: 풀 할당 데이터 가로채기
타임라인의 처음 30초로 확대합니다.
하나의 드라이버(예: ACPI.sys, 모두 가능)를 선택합니다.
비페이징 메모리를 검토하고 행을 확장합니다.
비페이징 메모리는 시스템에 메모리 압력이 있을 때 페이지 파일로 이동할 수 없으므로 조사의 초점이 되어야 합니다.
영향 및 일시적 범주에 대해 범례를 사용하도록 설정합니다.
열 머리글을 클릭하여 영향을 미치는 크기에 따라 정렬합니다.
메모리에 직접 영향을 주는 것은 드라이버 전체의 메모리 공간과 항상 관련이 있습니다. 앞의 예제에서는 ACPI.sys가 항상 비페이징 메모리를 사용하고, 이 안정적인 상태 사용량이 두 번 증가한다는 것을 알 수 있습니다(드라이버가 로드될 때 증가 후 약 3초 후에 증가).
스택을 확장하고 탐색합니다. 맨 위에는 가장 큰 안정적인 상태 풀 할당으로 이어지는 함수 호출이 표시됩니다.
다음 예제에서는 ACPI.sys가 ACPIInitStartACPI 함수에서 총 1.2MB에 달하는 총 255개의 풀 할당을 수행한다는 것을 알 수 있습니다. 이 함수는 대부분의 드라이버 할당을 고려하므로 드라이버 개발자가 드라이버의 안정적인 상태 메모리 사용량을 개선하기 위해 집중해야 하는 위치입니다.
열 머리글을 클릭하여 크기에 따라 정렬합니다.
일시적 범주에 대해 동일한 작업을 수행합니다. 스택을 확장하고 탐색합니다. 맨 위에는 가장 큰 일시적 풀 할당으로 이어지는 함수 호출이 표시됩니다.
다음 예제에서 일시적 메모리 사용량의 초기 급증은 주로 ACPI가 디바이스의 DPC를 실행하여 발생합니다(ACPI.sys!ACPIBuildDeviceDpc). 이 함수 호출에서 코드를 도입한 스파이크는 총 455KB입니다.
4단계: 드라이버 코드 공간 측정
Graph 탐색기의 메모리 범주에서 상주 집합 그래프를 찾습니다.
분석 탭에서 상주 집합 그래프를 끌어다 놓습니다.
그래프의 확대/축소를 해제해야 합니다(Ctrl+Shift+"-").
파일 지원 페이지 그래프 사전 설정을 선택합니다.
경로 트리 열을 통해 3단계에서 선택한 드라이버(예: C:/Windows/drivers 아래의 ACPI.sys)로 이동합니다.
드라이버 범주를 확장하고 활성 페이지에 집중합니다.
크 열의 값은 드라이버 코드가 메모리 공간에 미치는 영향을 나타냅니다. 다음 예에서는 0.48MB입니다.