다음을 통해 공유


연습 3 - 부팅 중 드라이버 공간 및 동적 할당 추적

은 OS 및 장치 드라이버가 데이터 구조를 저장하는 데 사용하는 커널 모드 구성 요소의 메모리 리소스입니다. 풀에는 다음과 같은 4가지 기본 할당 영역이 있습니다.

  1. 페이징이 아닌 풀: 할당은 실제 메모리에 상주하도록 보장됩니다.

  2. 페이징 풀: 메모리에서 페이지 파일로 페이징할 수 있는 할당입니다.

  3. NX 비페이징 가능 풀: 실행 가능하지 않은 페이징되지 않은 할당입니다.

  4. 세션 풀: 세션당 할당합니다. 이러한 항목은 페이징이 가능합니다.

풀 사용량은 컴퓨터의 전체 메모리 사용량에 중요한 영향을 미치며, 부팅 직후에 메모리를 가장 많이 사용합니다. 풀 사용량을 줄이면 OS 전체에서 시스템의 전체 메모리 사용량이 감소하며, 비페이징 가능 메모리는 감소를 유도하는 가장 높은 우선 순위 범주입니다.

이 연습에서는 부팅 중에 받은 편지함 Microsoft 드라이버 할당 및 해당 공간(초기화 시)을 검토합니다.

1단계: 부팅 전환에서 풀 메모리 추적 수집

이 단계에서는 풀 및 상주 집합 데이터를 포함하는 WPR(Windows Performance Recorder)을 사용하여 부팅 추적을 수집합니다.

  1. 시작 메뉴에서 WPR을 엽니다.

  2. 올바른 이벤트 공급자를 선택합니다.

    1. 풀 사용량

    2. 상주 집합

    3. 첫 번째 수준 심사

  3. 성능 시나리오부팅을 선택합니다.

  4. 로깅 모드파일을 선택합니다.

  5. 반복 횟수를 1로 설정합니다.

  6. 시작을 클릭한 후 위치를 선택하여 ETL 파일을 저장합니다.

시스템이 자동으로 다시 부팅되고 추적이 수집되며 바탕 화면이 표시되면 중지됩니다.

WPR 설정 대화 상자 스크린샷

2단계: WPA를 사용하여 풀 데이터 검토

데이터는 WPA풀 그래프 요약 테이블을 통해 노출됩니다. 관심 있는 주요 열은 다음 표에 있습니다.

열 머리글을 마우스 오른쪽 단추로 클릭하면 열을 추가하거나 제거할 수 있습니다.

용어 Description
풀 태그 풀 할당과 연결된 태그입니다.
풀 태그 모듈 풀 태그와 연결된 모듈(드라이버)입니다.
스택 메모리 할당으로 이어지는 스레드의 코드 경로를 표시합니다.
페이징 할당이 페이징 풀 또는 비페이징 풀에 배치되었는지 여부를 나타냅니다.
영향을 미치는 형식 할당이 안정적인 상태 메모리 사용량에 기여하는지 또는 일시적인 할당인지를 보여줍니다.
  1. WPA를 사용하여 1단계에서 캡처한 추적을 엽니다.

  2. 추적 메뉴를 열고 기호 경로 구성을 선택합니다.

    • 기호 캐시의 경로를 지정합니다. 기호에 대한 자세한 내용은 MSDN의 기호 지원 페이지를 참조하세요.
  3. 추적 메뉴를 열고 기호 로드를 선택합니다.

  4. Graph 탐색기메모리 범주에서 그래프를 찾습니다.

  5. 분석 탭에서 그래프를 끌어다 놓습니다.

  6. 다음 열을 표시하도록 테이블을 구성합니다.

    1. 풀 태그 모듈

    2. 페이징

    3. 영향을 미치는 형식

    4. 스택

    5. 풀 태그

    6. 개수

    7. 영향을 미치는 크기크기

    **풀 태그에 대한 참고 사항: **

    드라이버 개발자인 경우 드라이버에서 사용하는 풀 태그를 명확하고 쉽게 식별하여 분석을 용이하게 해야 합니다. 예를 들어 회사 이름이 Fabrikam인 경우 FbkPool1, FbkPool2, FbkBuffer 등 모든 풀 태그에 "Fbk" 접두사를 추가할 수 있습니다.

    재구성된 WPA 표의 모양을 보여주는 스크린샷

  7. 그래프에서 모든 계열 사용 안 함(>전체 그래프 ->모든 계열에서 ->사용 안함을 마우스 오른쪽 단추 로 클릭)

    WPA의 비활성화 메뉴 옵션 스크린샷

  8. 영향을 미치는 크기 열 머리글을 클릭하여 크기에 영향이 미치면 정렬합니다.

    안정적인 상태 메모리 사용량이 가장 높은 드라이버가 맨 위에 표시됩니다.

3단계: 풀 할당 데이터 가로채기

  1. 타임라인의 처음 30초로 확대합니다.

  2. 하나의 드라이버(예: ACPI.sys, 모두 가능)를 선택합니다.

    1. 비페이징 메모리를 검토하고 행을 확장합니다.

      비페이징 메모리는 시스템에 메모리 압력이 있을 때 페이지 파일로 이동할 수 없으므로 조사의 초점이 되어야 합니다.

    2. 영향일시적 범주에 대해 범례를 사용하도록 설정합니다.

      메모리 사용량을 보여주는 샘플 데이터 스크린샷

  3. 열 머리글을 클릭하여 영향을 미치는 크기에 따라 정렬합니다.

  4. 메모리에 직접 영향을 주는 것은 드라이버 전체의 메모리 공간과 항상 관련이 있습니다. 앞의 예제에서는 ACPI.sys가 항상 비페이징 메모리를 사용하고, 이 안정적인 상태 사용량이 두 번 증가한다는 것을 알 수 있습니다(드라이버가 로드될 때 증가 후 약 3초 후에 증가).

    1. 스택을 확장하고 탐색합니다. 맨 위에는 가장 큰 안정적인 상태 풀 할당으로 이어지는 함수 호출이 표시됩니다.

    2. 다음 예제에서는 ACPI.sys가 ACPIInitStartACPI 함수에서 총 1.2MB에 달하는 총 255개의 풀 할당을 수행한다는 것을 알 수 있습니다. 이 함수는 대부분의 드라이버 할당을 고려하므로 드라이버 개발자가 드라이버의 안정적인 상태 메모리 사용량을 개선하기 위해 집중해야 하는 위치입니다.

      확장 가능한 프로세스 노드가 있는 ACPI.sys의 메모리 사용량을 보여주는 샘플 데이터 테이블의 스크린샷

  5. 열 머리글을 클릭하여 크기에 따라 정렬합니다.

  6. 일시적 범주에 대해 동일한 작업을 수행합니다. 스택을 확장하고 탐색합니다. 맨 위에는 가장 큰 일시적 풀 할당으로 이어지는 함수 호출이 표시됩니다.

    • 다음 예제에서 일시적 메모리 사용량의 초기 급증은 주로 ACPI가 디바이스의 DPC를 실행하여 발생합니다(ACPI.sys!ACPIBuildDeviceDpc). 이 함수 호출에서 코드를 도입한 스파이크는 총 455KB입니다.

      리소스 시간을 AllocTime, FreeTime(집계: 합계)으로 사용하여 최대 미결 크기별로 ACPI.sys의 메모리 사용량을 보여주는 샘플 데이터 그래프의 스크린샷

4단계: 드라이버 코드 공간 측정

  1. Graph 탐색기메모리 범주에서 상주 집합 그래프를 찾습니다.

  2. 분석 탭에서 상주 집합 그래프를 끌어다 놓습니다.

  3. 그래프의 확대/축소를 해제해야 합니다(Ctrl+Shift+"-").

  4. 파일 지원 페이지 그래프 사전 설정을 선택합니다.

    파일 지원 페이지 옵션 스크린샷

  5. 경로 트리 열을 통해 3단계에서 선택한 드라이버(예: C:/Windows/drivers 아래의 ACPI.sys)로 이동합니다.

  6. 드라이버 범주를 확장하고 활성 페이지에 집중합니다.

    열의 값은 드라이버 코드가 메모리 공간에 미치는 영향을 나타냅니다. 다음 예에서는 0.48MB입니다.활성 페이지를 보여주는 샘플 데이터 스크린샷