Модернизация приложений

Часть 11. Подсистема Event Tracing For Windows

Алексей Федоров

Провайдеры

Сессии

Контроллеры

Потребители

Заключение

 

В предыдущей части статьи мы ознакомились с утилитой XBootMgr, которая позволяет собирать информацию в процессе загрузки компьютера, его выключения, перехода в режим Standby и выхода из него. Настоящая публикация посвящена подсистеме Event Tracing For Windows.

Как мы отметили в одной из предыдущих чсатей статьи, Windows Performance Toolkit базируется на использовании подсистемы Event Tracing For Windows, которая впервые появилась в Windows 2000 и развивалась от версии к версии. В Windows Vista и Windows 7 все ключевые компоненты операционной системы имеют соответствующие манифесты для взаимодействия с подсистемой ETW.

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

  • провайдеры — компоненты, которые генерируют события, используя функцию EventWrite();
  • сессии — объекты уровня Kernel, которые собирают события в буферы и посылают их в файл или непосредственно в приложение;
  • контроллеры — программы, которые создают сессии и управляют ими и соответствующими провайдерами; управление провайдерами состоит в разрешении/запрете событий или групп событий;
  • потребители – программы, которые потребляют данные из сессий ETW. Данные могут быть получены из файлов или в реальном времени.

Далее мы рассмотрим провайдеров и управление сессиями, а также потребление данных из файлов. Если вы собираетесь создавать собственные события на уровне приложений, обратитесь к документации на сайте MSDN по адресу: http://msdn.microsoft.com/en-us/library/aa363795(VS.85).aspx.

Подсистема Event Tracing For Windows имеет ряд преимуществ, которые делают ее практически идеальным решением для анализа производительности как системных компонентов, так и приложений. Отметим только некоторые из них:

  • события могут быть разрешены и запрещены динамически, без необходимости в перезапуске процесса или самой операционной системы;
  • по умолчанию все события запрещены и вызов функции EventWrite() никак не влияет на производительность системы. Это позволяет поставлять приложения со встроенными механизмами управления, которые могут быть активированы в случае необходимости;
  • при разрешении какого-либо события производительность системы не снижается даже в тех случаях, когда генерируются сотни и тысячи событий в секунду;
  • сессия сбора данных имеет ограничения по объему используемой памяти и дискового пространства. Загрузка процессора прямо пропорциональна числу событий и при необходимости масштабируется;
  • события от различных провайдеров могут быть объединены в один результирующий протокол, что существенно упрощает процесс обработки и анализа данных;
  • большинство компонентов операционной системы применяют механизмы ETW.

 

Рисунок

Архитектура ETW

Давайте рассмотрим, как различные компоненты ETW взаимодействуют друг с другом. Архитектура ETW показана на диаграмме.

Провайдеры

Провайдеры — это любой компонент, который использует Event Tracing API. Это могут быть как классические провайдеры (созданные до Windows Vista и применяющие MOF-классы), так и провайдеры на основе манифестов (использующие новые интерфейсы, появившиеся в Windows Vista). Windows Performance Toolkit может обрабатывать события от обоих типов провайдеров, но при создании собственных событий всегда применяйте модель на основе манифестов, появившуюся в Windows Vista.

Независимо от типа провайдеры выполняют две важные операции:

  • они регистрируются в подсистеме ETW в качестве провайдеров — это делает их видимыми на уровне системы и позволяет контроллерам включать/отключать события или группы событий;
  • они являются поставщиками событий. После включения они передают информацию в одну или более сессий для ее последующего сохранения в ETL-файлах или потребления в режиме реального времени.

Любой компонент системы: ядро операционной системы, приложения, DLL-библиотеки, сервисы, драйверы и даже код, написанный на управляемых языках, — может быть провайдером;  все эти компоненты могут быть источниками событий.

Каждое событие, в свою очередь, состоит из двух основных компонентов — заголовка и данных, предоставляемых провайдером. Заголовок события включает информацию о событии: идентификатор провайдера и идентификатор события, временную метку, идентификатор процесса, идентификатор потока, номер процессора и информацию об использовании процессора для данного потока. Остальные данные определяются конкретным провайдером: ETW принимает любые данные и записывает их в буфер, а их интерпретация возлагается на потребителей информации. Обычно создатели провайдеров предоставляют MOF- или TMF-файлы, используемые для декодирования информации от конкретного провайдера.

Сессии

Сессия — это коллекция буферов в памяти (как правило, обычной, не страничной), в которые собирается информация, поступающая через программные интерфейсы ETW Provider API. При каждом вызове функции EventWrite() резервируется блок памяти, куда затем заносится информация от провайдера. Когда буфер заполняется, его содержимое сбрасывается в файл или передается потребителю в реальном времени. Если скорость записи диска ниже, чем скорость заполнения буферов, могут закончиться все свободные буферы — тогда подсистема возвращает ошибку ERROR_NOT_ENOUGH_MEMORY и данные от провайдеров, не сохраненные в памяти, могут быть утеряны. В этих случаях увеличивается значение переменной EventLost для данной сессии, что указывает на факт потери данных.

Ряд опций — Buffer Type, Number of Buffers, Buffer Size, Clock Type и ряд других — позволяет сконфигурировать сессии и таким образом предотвратить потерю данных.

Контроллеры

Контроллеры — это программы, которые создают сессии и управляют ими и соответствующими провайдерами. Управление провайдерами заключается в разрешении/запрете событий или групп событий. Приложения могут использовать собственные контроллеры и управлять другими сессиями.

Учетная запись, под которой запускаются контроллеры, должна принадлежать к группе Performance Log Users либо Administrators. В операционных системах Windows Vista и Windows 7 приложение должно запускаться с повышенными привилегиями — исключением является принадлежность пользователя к группе локальных администраторов или отключение User Account Control. Консольные приложения следует запускать из консоли с повышенными привилегиями или из приложений, также запущенных с повышенными привилегиями.

Утилита xperf.exe, которой мы пользовались в данном разделе, является полноценным контроллером. Она поддерживает аргументы командной строки, позволяющие управлять ETW-провайдерами и сессиями. Контроллеры могут запрашивать состояние активных в данный момент сессий и получать списки всех зарегистрированных в системе провайдеров. Например, для получения всех активных сессий следует использовать следующую команду:

C:\>xperf -loggers

а для получения списка всех зарегистрированных в системе провайдеров — команду

C:\>xperf -providers

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

C:\>xperf –flush applogger

Отметим, что ETW — это полностью динамичная система, которая может быть сконфигурирована на лету. Например, используя утилиту xperf.exe, можно обновлять параметры сессии для того, чтобы подключить других провайдеров, или для увеличения максимального числа буферов для сессии.

Потребители

Потребители — это приложения, которые извлекают данные из сессий ETW, используя соответствующие программные интерфейсы. Данные могут быть получены из файлов или в режиме реального времени. Файлы протоколов сессий ETW представляют собой наборы содержимого буферов, сохраненных по мере их заполнения. Потребители считывают содержимое протоколов, сортируют его и отображают для пользователей. События сортируются по времени их появления, что особенно полезно в случае обработки протоколов, полученных в разное время. Желательно получать такие протоколы с одинаковым типом отсчета времени — см. опцию Clock Type для сессий.

Заключение

В данной части статьи мы рассмотрели использование Windows Performance Toolkit для сбора информации о системе и процессах и ее последующего анализа, а также познакомились с подсистемой Event Tracing For Windows, которая лежит в основе механизма сбора данных. В завершение обсуждения этой темы приведем несколько рекомендаций:

  • применяйте Windows Performance Toolkit для измерения производительности системы со всеми возможными сценариями как самого приложения, так и состояния системы — переход из состояния в состояние, начало и завершение работы;
  • оптимизируйте потребление ресурсов, в первую очередь процессора и диска, на уровне приложения как в активном режиме, так и в режиме простоя;
  • при тестировании сначала создайте эталонное измерение — для этого следует использовать систему с минимальным числом запущенных сервисов и процессов. Затем по очереди добавляйте устройства, приложения и сервисы для определения возможного снижения производительности.

На этом мы завершаем обсуждение средств изменения производительности системы и приложений. Следующие статьи данного цикла будут посвящены платформе Windows Troubleshooting Platform.

 

В начало В начало

КомпьютерПресс 09'2012

Наш канал на Youtube

1999 1 2 3 4 5 6 7 8 9 10 11 12
2000 1 2 3 4 5 6 7 8 9 10 11 12
2001 1 2 3 4 5 6 7 8 9 10 11 12
2002 1 2 3 4 5 6 7 8 9 10 11 12
2003 1 2 3 4 5 6 7 8 9 10 11 12
2004 1 2 3 4 5 6 7 8 9 10 11 12
2005 1 2 3 4 5 6 7 8 9 10 11 12
2006 1 2 3 4 5 6 7 8 9 10 11 12
2007 1 2 3 4 5 6 7 8 9 10 11 12
2008 1 2 3 4 5 6 7 8 9 10 11 12
2009 1 2 3 4 5 6 7 8 9 10 11 12
2010 1 2 3 4 5 6 7 8 9 10 11 12
2011 1 2 3 4 5 6 7 8 9 10 11 12
2012 1 2 3 4 5 6 7 8 9 10 11 12
2013 1 2 3 4 5 6 7 8 9 10 11 12
Популярные статьи
КомпьютерПресс использует