Трассировка событий Windows (ETW) — это встроенный высокоскоростной механизм регистрации событий в рамках работы приложений в режиме пользователя и драйверов устройств ядра. В системном журнале или в журнале событий приложений данная информация отсутствует. Упомянутые события относятся к деятельности компонентов и позволяют администраторам и разработчикам учитывать конкретные состояния в процессе выполнения, что помогает диагностировать проблемы рабочей нагрузки, сбои в программном обеспечении и ошибки в настройке. Трассировка быстро включается и выключается и обеспечивает удобный способ получения данных о деятельности в рабочей среде. Кроме того, ETW можно включать и выключать без перезапуска системы или процесса. Рассмотрим утилиту xperf.exe (Xperf), которая является частью ETW и позволяет больше узнать о том, как работает система или приложение. Но прежде чем углубиться в детали, необходимо вкратце ознакомиться с архитектурой ETW.

ETW и Xperf

ETW включает четыре основных компонента:

  • поставщики или провайдеры событий — компоненты, генерирующие события, относящиеся к конкретной деятельности. Операционная система имеет много встроенных провайдеров событий;
  • контроллеры событий — программы или утилиты, способные включать или выключать отслеживание одного или нескольких событий;
  • объекты — получатели событий, которые могут предусматривать обработку в реальном времени или последующую обработку. Объекты-получатели, предусматривающие последующую обработку, считывают информацию из файла .etl;
  • сеансы отслеживания событий, в ходе которых выполняется буферизация и регистрация. События буферизуются и записываются в файл трассировки .etl либо фиксируются объектом — получателем событий в реальном времени.

Утилита Xperf создана группой Windows Fundamentals как контроллер и объект-потребитель ETW, входящий в состав набора Windows Performance Toolkit (http://msdn.microsoft.com/en-us/performance/cc752957.aspx), который можно загрузить по данной ссылке. Утилита Xperf построена поверх инфраструктуры ETW в Windows; она позволяет получить ценные данные, помогающие администраторам и разработчикам понять характер деятельности приложений и систем в рабочей среде. Познакомимся с основами применения Xperf на примерах общих сценариев, где эта утилита может потребоваться для выявления скрытых особенностей работы системы или приложения.

Утилита Xperf в основном предназначена для работы с Windows Server 2008 и Windows Vista; однако некоторые функции Xperf работают и с Windows Server 2003, и с Windows XP. Для установки Xperf в Windows 2003 или XP необходимо сначала установить эту утилиту в Vista или Server 2008, после чего вручную скопировать все файлы из каталога установки в систему Windows 2003 или XP. Например, в случае установки Xperf в каталог c:xperf в Vista или Server 2008 следует скопировать папку c:xperf в систему Windows 2003 или XP.

Сценарий 1. Проблема высокой загрузки процессора

Предположим, нам нужно найти процесс, который является основным потребителем ресурсов процессора в системе. Для выявления потребителя ресурсов процессора при пиковой загрузке широко используется системный монитор. Однако при этом не удается соотнести высокую загрузку процессора с одним процессом. Счетчик процента общего времени DPC (Processor:\%DPC Time) системного монитора позволяет определить, является ли пиковая загрузка процессора результатом большого числа отложенных вызовов процедур (системных прерываний, выполняемых в ядре).

DPC выдаются драйверами ядра, и в таких случаях проблема состоит в том, чтобы определить, какой именно драйвер вызывает большую нагрузку системы за счет деятельности DPC. Как показано ниже, Xperf может значительно облегчить выявление такого драйвера.

  1. Установите Xperf. Предлагаю выполнить установку в удобный для перехода каталог, например c:xperf.
  2. Добавьте указанную ниже переменную среды:
              NT_SYMBOL_PATH = srv*
              c:symbols*http://msdl.
              microsoft.com/
              download/symbols
  3. Из командной строки перейдите в каталог Xperf и введите
              C:xperf>xperf -on latency
    Признак задержки (latency) предписывает Xperf задействовать группу объектов-получателей в запуске регистрации событий. Эти события помогут установить, какой из драйверов является основным потребителем ресурсов процессора.
  4. Ожидайте высокой активности DPC, отслеживая ее с помощью системного монитора или диспетчера задач.
  5. Выполните команду:
              c:xperf -Ikernel.etl -a dpcisr

Эта команда предписывает Xperf выполнить обработку файла ETL по умолчанию (kernel.etl) и указывает действие (-a). Здесь показано действие dpcisr, что предполагает создание отчета, содержащего статистику DPC и процедуры службы прерываний (ISR) (см. экран 1).

Экран 1. Выходные данные Xperf по DPC по драйверам

На экране 1 обратите внимание на столбец Usage («Использование»), где выражена в процентах деятельность процессора, относящаяся к DPC, по каждому драйверу. Отчет позволяет быстро определить, какой из драйверов является основным потребителем ресурсов процессора. Ценно то, что нет необходимости в установке других отладчиков, а специалисту по технической поддержке не нужно анализировать другие файлы данных. Таким образом, использование Xperf обеспечивает простой метод диагностики распространенной проблемы рабочей среды.

Утилита Xperf обладает гораздо более широкими возможностями, чем простая отчетность по данным DPC.

Рассмотрим другой сценарий применения.

Сценарий 2. Получение информации о вводе/выводе диска

Приходилось ли вам наблюдать непрерывное мигание диода жесткого диска и задаваться вопросом, к каким файлам осуществляется доступ и какая деятельность генерирует такую активность операций ввода/вывода? С помощью Xperf можно выявить пиковую активность операций ввода/вывода и определить, какие процессы обращались к диску и к каким файлам осуществлялся доступ. Это делается следующим образом:

  1. Введите ту же команду, что и на шаге 3 в предыдущем примере. Если файл трассировки не указан, Xperf по умолчанию использует kernel.etl.
  2. Ждите наступления пиковой активности операций ввода/вывода.
  3. Остановите трассировку и выполните слияние данных kernel.etl с помощью команды
              c:>xperf -d itpro.etl
  4. Откройте данные трассировки в окне просмотра Xperf с помощью команды
              c:>xperf itpro.etl

Откроется окно анализа производительности Windows.

Xperf помогает увидеть пики активности операций ввода/вывода; однако необходимо также определить, какая именно деятельность системы вызвала их возникновение. Для этого просто выделите столбец диаграммы в указанном окне, щелкните на нем правой кнопкой мыши и выберите Summary Table (сводная таблица). Откроется список процессов, генерировавших активность операций ввода/вывода за выделенный период времени. Щелкните знак «плюс» рядом с каждым процессом для просмотра файлов, к которым этот процесс осуществлял доступ, с указанием размера запроса на ввод/вывод, как показано на экране 2.

На экране 2 четко видны процессы, генерировавшие активность операций ввода/вывода, и файлы, к которым осуществлялся доступ. В нашем примере процесс MsMpEng.exe, относящийся к приложению Microsoft Forefront Client Security, выполнял обращение к файлу edb.log и процессу svchost.exe для Windows Update, после чего осуществлялся доступ к файлам DataStore.edb и edb.log.

Путем быстрого поиска в Internet по ‘edb.log’ и ‘DataStore.edb’ я установил, что это файлы, связанные с Windows Update. Таким образом, в рассматриваемый промежуток времени использовалась служба Windows Update, и ее работа требовала доступа к указанным файлам. С помощью Xperf удалось определить, какие процессы отвечают за высокую активность ввода/вывода, и к каким файлам осуществлялся доступ. Это был всего лишь тест, но вы можете выполнять аналогичные шаги, чтобы выявить процессы и файлы, генерирующие интенсивную работу дисков в своих системах.

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

Майкл Моралес (morales@microsoft.com) — старший инженер службы поддержки Microsoft Global Escalation Services. Специализируется на проблемах отладки и производительности Windows


Экран 2. Окно детализации сводных данных Xperf