Сведения о счетчиках производительности

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

Важно!

Счетчики производительности Windows оптимизированы для обнаружения и сбора административных и диагностических данных. Они не подходят для сбора данных высокой частоты или для профилирования приложений, так как они не предназначены для сбора более одного раза в секунду. Для доступа к системным сведениям с более низкими затратами можно использовать более прямые API, такие как вспомогательный интерфейс состояния процесса, GlobalMemoryStatusEx, GetSystemTimes или GetProcessTimes. Для профилирования можно собирать журналы ETW с данными профилирования системы с помощью tracelog.exe с -critsecпомощью , , -eflag-dpcisrили параметров, или -ProfileSource использовать профилирование счетчиков оборудования.

Примечание.

Не путайте счетчики производительности Windows с API QueryPerformanceCounter. Счетчики производительности Windows предоставляют высокоуровневую абстракцию для многих видов системных сведений. Функция QueryPerformanceCounter обеспечивает оптимизированный доступ к метке времени высокой точности.

Приступая к работе

  • Используйте средства счетчика производительности, если вы хотите собирать или просматривать данные о производительности из системы.
  • Используйте API сбора счетчиков производительности, если требуется написать скрипт или программу, которая собирает данные о производительности из локальной системы.
  • Используйте классы счетчиков производительности WMI, если требуется собирать данные о производительности из локальной или удаленной системы с помощью WMI.
  • Используйте API поставщика счетчиков производительности, если требуется опубликовать данные о производительности из программного компонента.

Основные понятия

Система счетчиков производительности Windows организована в потребители, поставщики, наборы счетчиков, счетчики, экземпляры и значения счетчиков.

Потребитель — это программный компонент, который использует данные о производительности. Windows включает в себя несколько встроенных средств , использующих данные о производительности. К ним относятся диспетчер задач, монитор ресурсов, Монитор производительности, typeperf.exe, logman.exe и relog.exe. Разработчики могут создавать скрипты и приложения, которые обращаются к счетчикам производительности с помощью API счетчиков производительности.

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

  • Поставщик версии 1 — это программный компонент, который публикует данные о производительности с помощью библиотеки DLL производительности, которая выполняется в процессе потребителя. Поставщик версии 1 устанавливается в систему через .ini файл. Архитектура поставщика версии 1 устарела. Новые поставщики должны использовать архитектуру поставщика версии 2.
  • Поставщик версии 2 — это программный компонент, который публикует данные о производительности с помощью API-интерфейсов поставщика счетчиков производительности. Поставщик версии 2 устанавливается в систему через .man файл (XML-манифест).

Набор счетчиков — это группировка данных о производительности в поставщике. Набор счетчиков имеет имя и один или несколько счетчиков. Сбор данных из набора счетчиков возвращает несколько экземпляров. В некоторых API Windows наборы счетчиков называются объектами производительности. Например, поставщик данных производительности для системы базы данных может предоставить набор счетчиков для статистики для каждой базы данных.

Счетчик — это определение одного фрагмента данных производительности. Счетчик имеет имя и тип. Например, набор счетчиков "статистика по базам данных" может содержать счетчик с именем "транзакции в секунду" с типом PERF_COUNTER_COUNTER.

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

Значение счетчика — это значение одного фрагмента данных счетчика производительности. Значение счетчика — это целое число без знака, 32-разрядное или 64-разрядное в зависимости от типа соответствующего счетчика. При разговоре об экземпляре значение счетчика иногда может вызываться счетчиком или значением.

Совет

Возможно, полезно связать термины счетчика производительности с более знакомыми терминами электронной таблицы. Набор счетчиков похож на таблицу. Счетчик похож на столбец. Экземпляр похож на строку. Значение счетчика похоже на ячейку в таблице.

Наборы счетчиков с одним экземпляром всегда содержат данные для одного экземпляра. Это обычно для наборов счетчиков, которые сообщают о глобальной статистике системы. Например, Windows имеет встроенный набор счетчиков с одним экземпляром с именем Memory, который сообщает об использовании глобальной памяти.

Наборы счетчиков с несколькими экземплярами содержат данные для переменного числа экземпляров. Это обычно для наборов счетчиков, сообщающих о сущностях в системе. Например, Windows имеет встроенный набор счетчиков с несколькими экземплярами с именем "Сведения о процессоре", который сообщает один экземпляр для каждого установленного ЦП.

Потребители периодически собирают и записывают данные из набора счетчиков поставщика. Например, потребитель может собирать данные один раз в секунду или один раз в минуту. Собранные данные называются примером. Пример состоит из меток времени вместе с данными для экземпляров набора счетчиков. Данные для каждого экземпляра включают имя экземпляра (строку) и набор значений счетчика (целые числа, одно значение для каждого счетчика в наборе счетчиков).

Имена экземпляров обычно должны быть уникальными в примере, т. е. поставщик не должен возвращать два экземпляра с таким же именем, как часть одного примера. Некоторые старые поставщики не следуют этому правилу, поэтому потребители должны иметь возможность терпеть не уникальные имена экземпляров. Имена экземпляров не учитывает регистр, поэтому экземпляры не должны иметь имена, которые отличаются только в случае.

Примечание.

По соображениям обратной совместимости счетчик "Process" возвращает не уникальные имена экземпляров на основе имени EXE-файла. Это может привести к запутанным результатам, особенно если процесс с не уникальным именем запускается или завершает работу, так как обычно это приведет к сбою данных из-за неправильного сопоставления имен экземпляров между примерами. Потребители счетчика Process должны иметь возможность терпеть эти не уникальные имена экземпляров и результирующий сбой данных. В Windows 11 и более поздних версиях можно использовать набор счетчиков Process V2 , чтобы избежать этой проблемы.

Имена экземпляров должны быть стабильными в примерах, т. е. поставщик должен использовать одно и то же имя экземпляра для одной сущности при каждом сборе набора счетчиков.

Каждый счетчик имеет тип. Тип счетчика указывает тип необработанного значения счетчика (целое число без знака 32-разрядного или без знака 64-разрядного целого числа). Тип счетчика также указывает, что представляет необработанное значение счетчика, которое определяет способ обработки необработанного значения для создания полезной статистики.

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

  • PERF_COUNTER_LARGE_RAWCOUNT — это 64-разрядное необработанное значение, которое не требует использования обработки. Оно подходит для значений на определенный момент времени, таких как "Байты используемой памяти".
  • PERF_COUNTER_RAWCOUNT_HEX — это 32-разрядное необработанное значение, которое требует использования только простого шестнадцатеричного форматирования. Он подходит для сведений о точках во времени или идентификации таких сведений, как "Флаги" или "Базовый адрес".
  • PERF_COUNTER_BULK_COUNT — это 64-разрядное необработанное значение, указывающее количество событий и используемое для вычисления скорости, с которой происходят события. Чтобы быть полезным, этот тип счетчика требует двух примеров, разделенных по времени. Форматированное значение — это частота событий, т. е. количество случаев, когда событие произошло в секунду в течение интервала между двумя выборками. Учитывая два примера s0 и s1форматированное значение (скорость событий), вычисляется как (s1.EventCount - s0.EventCount)/(s1.TimestampInSeconds - s0.TimestampInSeconds).

Как ожидается, поставщики будут вести себя так, как будто они без отслеживания состояния, т. е. сбор данных из набора счетчиков не должны заметно влиять на состояние поставщика. Например, поставщик не должен сбрасывать значения счетчиков до 0 при сборе набора счетчиков и не следует использовать метку времени предыдущей коллекции для настройки значений в текущей коллекции. Вместо этого он должен предоставлять простые значения необработанных счетчиков с точными типами, чтобы потребитель может вычислить полезную статистику на основе необработанных значений и их меток времени.

Архитектура API производительности

Performance counter applications invoke Windows APIs which call into providers to obtain performance data.

Потребители счетчиков производительности включают:

  • Предоставляемые Корпорацией Майкрософт приложения, такие как Диспетчер задач, Монитор ресурсов, Монитор производительности и typeperf.exe.
  • Предоставляемые корпорацией Майкрософт высокоуровневые поверхности API, предоставляющие данные счетчика производительности, такие как классы производительности WMI.
  • Собственные приложения или скрипты, использующие API-интерфейсы потребителей счетчика производительности.

Большинство потребителей счетчиков производительности используют API из PDH.dll для сбора данных о производительности. PDH управляет множеством сложных аспектов сбора счетчиков производительности, таких как анализ запросов, сопоставление экземпляров в нескольких примерах и вычисления отформатированных значений из необработанных данных счетчика. Реализация PDH использует API реестра при использовании данных от поставщика версии 1 и использует API-интерфейсы потребителей версии 2 при использовании данных у поставщика версии 2.

Некоторые старые потребители счетчиков производительности используют API реестра для сбора данных о производительности из специального HKEY_PERFORMANCE_DATA раздела реестра. Это не рекомендуется для нового кода, так как обработка данных из реестра является сложной и подверженной ошибкам. Реализация API реестра напрямую поддерживает сбор данных от поставщиков версии 1. Он косвенно поддерживает сбор данных от поставщиков версии 2 через уровень перевода, использующий API-интерфейсы потребителей версии 2.

Некоторые потребители счетчиков производительности используют функции потребителя PerfLib версии 2 для прямого доступа к данным от поставщиков версии 2. Это сложнее, чем использование данных с помощью API PDH, но этот подход может быть полезным, если API PDH нельзя использовать из-за проблем производительности или зависимостей. Реализация PerfLib V2 напрямую поддерживает сбор данных от поставщиков версии 2. Он не поддерживает сбор данных от поставщиков версии 1.

Примечание.

Windows OneCore не включает PDH.dll и не поддерживает использование данных счетчика производительности через API реестра. Потребители, работающие на OneCore, должны использовать функции потребителей PerfLib версии 2.

Поставщики версии 1 реализуются в виде библиотеки DLL поставщика, загруженной в процесс потребителя. Реализация API реестра управляет загрузкой библиотеки DLL поставщика, вызовом в библиотеку DLL для сбора данных о производительности и выгрузки библиотеки DLL соответствующим образом. Библиотека DLL поставщика отвечает за сбор данных о производительности, например с помощью обычных API Windows, RPC, именованных каналов, общей памяти или других механизмов взаимодействия между процессами.

Поставщики версии 2 реализуются как программа пользовательского режима (часто служба Windows) или драйвер режима ядра. Обычно код поставщика данных производительности интегрируется непосредственно в существующий компонент (т. е. драйвер или служба сообщает статистику о себе). Реализация PerfLib версии 2 управляет запросами и ответами с помощью расширения ядра PCW.sys, поэтому поставщик обычно не должен реализовать взаимодействие между процессами для предоставления данных о производительности.

Примечание.

API и средства счетчика производительности Windows включают ограниченную поддержку доступа к счетчикам производительности с других компьютеров через удаленный реестр (для поставщиков версии 1) и RPC (для поставщиков версии 2). Эта поддержка часто трудно использовать с точки зрения элементов управления проверкой подлинности (средства и API могут проходить проверку подлинности только в качестве текущего пользователя), а также с точки зрения конфигурации системы (необходимые конечные точки и службы отключены по умолчанию). Во многих случаях лучше получить доступ к счетчикам производительности удаленных систем через WMI , а не через встроенную поддержку удаленного доступа.

Аудитория разработчика

Счетчики производительности часто используются администраторами для выявления проблем с производительностью или ненормального поведения систем, разработчиками для изучения использования ресурсов компонентов программного обеспечения и отдельными пользователями, чтобы понять, как работают программы в своей системе. Использование может происходить с помощью таких средств графического интерфейса, как диспетчер задач или Монитор производительности, средства командной строки, такие как typeperf.exe или logman.exe, с помощью скриптов с помощью WMI и PowerShell или через API C/C++ и .NET.

Поставщики счетчиков производительности обычно реализуются как драйверы режима ядра или службы пользовательского режима. Поставщики счетчиков производительности обычно записываются в C или C++.

Требования во время выполнения

Сведения о требованиях во время выполнения для определенного элемента программирования см. в разделе "Требования" эталонной страницы этого элемента.

Сведения о новых версиях см. в статье "Новые возможности".

См. также

Использование счетчиков производительности

Справочник по счетчикам производительности