Упражнение 3. Отслеживание следа и динамических выделений драйверов во время загрузки
Пул — это ресурс памяти для компонентов режима ядра, которые драйверы ОС и устройств используют для хранения своих структур данных. Пул имеет четыре основные области распределения:
Нестраничный пул: Выделения гарантированно будут находиться в физической памяти.
Выстраивный пул: Выделения, которые можно вывести из памяти в файл подкачки.
Нестраничный пул NX: Нестраничные выделения, которые не являются исполняемыми.
Пул сеансов: Выделения, сделанные за сеанс. Они доступны для страниц.
Использование пула — это значительный участник к общему использованию памяти на компьютере. Это самый большой потребитель памяти сразу после загрузки. Любое сокращение использования пула сокращает общее использование памяти системой в операционной системе, а нестраничная память является самой приоритетной категорией для сокращения дисков (для).
В этом упражнении вы изучите выделение драйверов Майкрософт для папки "Входящие" и их объем (во время инициализации) во время загрузки.
Шаг 1. Сбор трассировки памяти пула при переходе на загрузку
На этом шаге вы соберете трассировку загрузки с помощью средства записи производительности Windows (WPR), содержащего данные пула и резидентного набора.
Открытие WPR из меню "Пуск"
Выберите нужных поставщиков событий:
Использование пула
Набор резидентов
Рассмотрение первого уровня
Выберите загрузку в качестве сценария производительности.
Выберите Файл в качестве режима ведения журнала.
Задайте значение 1 в качестве числа итераций.
Нажмите кнопку Пуск и выберите расположение для сохранения файла ETL.
Система автоматически перезагружается, собирает трассировку и останавливается после того, как рабочий стол станет видимым.
Шаг 2. Проверка данных пула с помощью WPA
Данные пула предоставляются через сводную таблицу "Граф пула" в WPA. Ключевые столбцы, представляющие интерес, приведены в следующей таблице.
Вы можете добавить или удалить столбцы, щелкнув правой кнопкой мыши заголовки столбцов.
Терминология | Описание |
---|---|
Тег пула | Тег, связанный с выделением пула. |
Модуль тегов пула | Модуль (драйвер), связанный с тегом пула. |
Стек | Показывает путь к коду в потоке, который ведет к выделению памяти. |
Вызвала | Указывает, были ли выделения помещены в страничный или нестраничный пул. |
Влияющий тип | Показывает, влияет ли выделение на использование памяти в устойчивом состоянии или является временным выделением. |
Откройте трассировку, записанную на шаге 1, с помощью WPA.
Откройте меню Трассировка и выберите Настроить путь к символам.
- Укажите путь к кэшу символов. Дополнительные сведения о символах см. на странице Поддержка символов на сайте MSDN.
Откройте меню Трассировка и выберите Загрузить символы.
Найдите граф пула в категории ПамятьОбозреватель Graph
Перетащите диаграмму Пул на вкладку Анализ .
Упорядочение таблицы для отображения следующих столбцов:
Модуль тегов пула
Вызвала
Влияющий тип
Стек
Тег пула
Count
Влияние на размер и размер
**Примечание к тегам пула: **
Если вы являетесь разработчиком драйверов, убедитесь, что теги пула, используемые драйвером, понятны и легко идентифицируются для упрощения анализа. Например, если ваша компания называется Fabrikam, можно добавить префикс "Fbk" ко всем тегам пула: FbkPool1, FbkPool2, FbkBuffer и т. д.
Отключить все ряды на графе (щелкните правой кнопкой мыши ->Отключить ->Во всем графе ->Все ряды)
Отсортируйте по размеру, щелкнув заголовок столбца "Влияющий размер ".
Драйверы с самым высоким показателем использования памяти в стабильном состоянии отображаются в верхней части экрана.
Шаг 3. Перехват данных о выделении пула
Увеличьте первые 30 секунд временная шкала.
Выберите один драйвер (например, ACPI.sys, но любой из них будет делать).
Просмотрите непагрегированную память и разверните строку.
Непагрегированная память должна быть в центре внимания исследования, так как она не может быть перемещена в файл подкачки при нехватке памяти в системе.
Включите условные обозначения для категорий "Влияние" и "Временные ".
Сортировать по влиянию на размер , щелкнув заголовок столбца.
Влияние на память напрямую влияет на общий объем памяти драйвера. В предыдущем примере можно сказать, что ACPI.sys постоянно использует нестраничную память и что использование устойчивого состояния увеличивается в два раза (сначала при загрузке драйвера, а затем во второй раз примерно через 3 секунды).
Разверните стек и перейдите по нему. В верхней части вы должны увидеть вызовы функций, которые приводят к наибольшему распределению пулов устойчивых состояний.
В следующем примере видно, что ACPI.sys выполняет в общей сложности 255 выделений пулов, что составляет 1,2 МБ в рамках функции ACPIInitStartACPI . Именно на этом разработчику драйвера следует сосредоточиться, чтобы улучшить использование памяти в устойчивом состоянии драйвера, так как эта функция отвечает за большинство выделений драйверов.
Выполните сортировку по размеру , щелкнув заголовок столбца.
Сделайте то же самое для категории Временные . Разверните стек и перейдите по нему. В верхней части вы должны увидеть вызовы функций, ведущие к наибольшему временному выделению пулов.
В следующем примере вы можете увидеть начальный пик использования временной памяти в основном из-за acPI, выполняющего DPC устройств (ACPI.sys! ACPIBuildDeviceDpc). Пиковая задержка, в которую появился код в вызове этой функции, составляет 455 КБ.
Шаг 4. Измерение объема кода драйвера
Найдите граф Резидентный набор в категории ПамятьОбозреватель Graph.
Перетащите диаграмму Резидентный набор на вкладку Анализ.
Обязательно распаковка графа (CTRL+SHIFT+"-").
Выберите предустановку графа Страницы с резервной копией файла .
В столбце дерева пути перейдите к драйверу, выбранному на шаге 3 (например, ACPI.sys в разделе C:/Windows/drivers).
Разверните категорию Драйвер и сосредоточьтесь на страницах Активные .
Значение в столбце Размер представляет влияние кода драйвера на объем памяти. В следующем примере это 0,48 МБ.