Поделиться через


Упражнение 3. Отслеживание следа и динамических выделений драйверов во время загрузки

Пул — это ресурс памяти для компонентов режима ядра, которые драйверы ОС и устройств используют для хранения своих структур данных. Пул имеет четыре основные области распределения:

  1. Нестраничный пул: Выделения гарантированно будут находиться в физической памяти.

  2. Выстраивный пул: Выделения, которые можно вывести из памяти в файл подкачки.

  3. Нестраничный пул NX: Нестраничные выделения, которые не являются исполняемыми.

  4. Пул сеансов: Выделения, сделанные за сеанс. Они доступны для страниц.

Использование пула — это значительный участник к общему использованию памяти на компьютере. Это самый большой потребитель памяти сразу после загрузки. Любое сокращение использования пула сокращает общее использование памяти системой в операционной системе, а нестраничная память является самой приоритетной категорией для сокращения дисков (для).

В этом упражнении вы изучите выделение драйверов Майкрософт для папки "Входящие" и их объем (во время инициализации) во время загрузки.

Шаг 1. Сбор трассировки памяти пула при переходе на загрузку

На этом шаге вы соберете трассировку загрузки с помощью средства записи производительности Windows (WPR), содержащего данные пула и резидентного набора.

  1. Открытие WPR из меню "Пуск"

  2. Выберите нужных поставщиков событий:

    1. Использование пула

    2. Набор резидентов

    3. Рассмотрение первого уровня

  3. Выберите загрузку в качестве сценария производительности.

  4. Выберите Файл в качестве режима ведения журнала.

  5. Задайте значение 1 в качестве числа итераций.

  6. Нажмите кнопку Пуск и выберите расположение для сохранения файла ETL.

Система автоматически перезагружается, собирает трассировку и останавливается после того, как рабочий стол станет видимым.

Снимок экрана: диалоговое окно параметров WPR.

Шаг 2. Проверка данных пула с помощью WPA

Данные пула предоставляются через сводную таблицу "Граф пула" в WPA. Ключевые столбцы, представляющие интерес, приведены в следующей таблице.

Вы можете добавить или удалить столбцы, щелкнув правой кнопкой мыши заголовки столбцов.

Терминология Описание
Тег пула Тег, связанный с выделением пула.
Модуль тегов пула Модуль (драйвер), связанный с тегом пула.
Стек Показывает путь к коду в потоке, который ведет к выделению памяти.
Вызвала Указывает, были ли выделения помещены в страничный или нестраничный пул.
Влияющий тип Показывает, влияет ли выделение на использование памяти в устойчивом состоянии или является временным выделением.
  1. Откройте трассировку, записанную на шаге 1, с помощью WPA.

  2. Откройте меню Трассировка и выберите Настроить путь к символам.

    • Укажите путь к кэшу символов. Дополнительные сведения о символах см. на странице Поддержка символов на сайте MSDN.
  3. Откройте меню Трассировка и выберите Загрузить символы.

  4. Найдите граф пула в категории ПамятьОбозреватель Graph

  5. Перетащите диаграмму Пул на вкладку Анализ .

  6. Упорядочение таблицы для отображения следующих столбцов:

    1. Модуль тегов пула

    2. Вызвала

    3. Влияющий тип

    4. Стек

    5. Тег пула

    6. Count

    7. Влияние на размер и размер

    **Примечание к тегам пула: **

    Если вы являетесь разработчиком драйверов, убедитесь, что теги пула, используемые драйвером, понятны и легко идентифицируются для упрощения анализа. Например, если ваша компания называется Fabrikam, можно добавить префикс "Fbk" ко всем тегам пула: FbkPool1, FbkPool2, FbkBuffer и т. д.

    Снимок экрана: как должна выглядеть реорганизованная таблица WPA.

  7. Отключить все ряды на графе (щелкните правой кнопкой мыши ->Отключить ->Во всем графе ->Все ряды)

    Снимок экрана: параметр меню

  8. Отсортируйте по размеру, щелкнув заголовок столбца "Влияющий размер ".

    Драйверы с самым высоким показателем использования памяти в стабильном состоянии отображаются в верхней части экрана.

Шаг 3. Перехват данных о выделении пула

  1. Увеличьте первые 30 секунд временная шкала.

  2. Выберите один драйвер (например, ACPI.sys, но любой из них будет делать).

    1. Просмотрите непагрегированную память и разверните строку.

      Непагрегированная память должна быть в центре внимания исследования, так как она не может быть перемещена в файл подкачки при нехватке памяти в системе.

    2. Включите условные обозначения для категорий "Влияние" и "Временные ".

      Снимок экрана: пример данных, показывающий использование памяти.

  3. Сортировать по влиянию на размер , щелкнув заголовок столбца.

  4. Влияние на память напрямую влияет на общий объем памяти драйвера. В предыдущем примере можно сказать, что ACPI.sys постоянно использует нестраничную память и что использование устойчивого состояния увеличивается в два раза (сначала при загрузке драйвера, а затем во второй раз примерно через 3 секунды).

    1. Разверните стек и перейдите по нему. В верхней части вы должны увидеть вызовы функций, которые приводят к наибольшему распределению пулов устойчивых состояний.

    2. В следующем примере видно, что ACPI.sys выполняет в общей сложности 255 выделений пулов, что составляет 1,2 МБ в рамках функции ACPIInitStartACPI . Именно на этом разработчику драйвера следует сосредоточиться, чтобы улучшить использование памяти в устойчивом состоянии драйвера, так как эта функция отвечает за большинство выделений драйверов.

      Снимок экрана: пример таблицы данных с использованием памяти ACPI.sys с расширяемыми узлами процессов

  5. Выполните сортировку по размеру , щелкнув заголовок столбца.

  6. Сделайте то же самое для категории Временные . Разверните стек и перейдите по нему. В верхней части вы должны увидеть вызовы функций, ведущие к наибольшему временному выделению пулов.

    • В следующем примере вы можете увидеть начальный пик использования временной памяти в основном из-за acPI, выполняющего DPC устройств (ACPI.sys! ACPIBuildDeviceDpc). Пиковая задержка, в которую появился код в вызове этой функции, составляет 455 КБ.

      Снимок экрана: пример графа данных, на котором показано использование памяти по ACPI.sys по пиковому объему выдающегося размера с использованием времени ресурса в виде AllocTime, FreeTime (агрегирование: Сумма)

Шаг 4. Измерение объема кода драйвера

  1. Найдите граф Резидентный набор в категории ПамятьОбозреватель Graph.

  2. Перетащите диаграмму Резидентный набор на вкладку Анализ.

  3. Обязательно распаковка графа (CTRL+SHIFT+"-").

  4. Выберите предустановку графа Страницы с резервной копией файла .

    Снимок экрана: параметр

  5. В столбце дерева пути перейдите к драйверу, выбранному на шаге 3 (например, ACPI.sys в разделе C:/Windows/drivers).

  6. Разверните категорию Драйвер и сосредоточьтесь на страницах Активные .

    Значение в столбце Размер представляет влияние кода драйвера на объем памяти. В следующем примере это 0,48 МБ. Снимок экрана: примеры данных, показывающие активные страницы.