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


Сбор данных о производительности

После создания запроса и добавления счетчиков вызовите функцию PdhCollectQueryData , чтобы получить текущие необработанные данные для всех счетчиков в запросе.

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

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

  1. Вызов PdhCollectQueryData для сбора первого примера.
  2. Вызовите функцию спящего режима, чтобы ждать не менее одной секунды между коллекциями.
  3. Снова вызовите PdhCollectQueryData , чтобы собрать второй пример.
  4. Вызовите функцию PdhGetFormattedCounterValue , чтобы вычислить отображаемое значение.
  5. Повторите шаги 2–4.

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

Если вы хотите запросить данные о производительности из файла журнала, можно также определить диапазон времени. Диапазон времени ограничивает запрос теми образцами, которые были собраны в пределах диапазона времени (каждый пример содержит метку времени для момента сбора). Дополнительные сведения о настройке и извлечении диапазонов времени см. в разделе "Настройка диапазона времени для запроса".

Если вы хотите собрать данные о производительности и записать его в файл журнала, вы вызовите функцию PdhUpdateLog вместо вызова PdhCollectQueryData. Дополнительные сведения см. в статье "Работа с файлами журналов" и запись данных производительности в файл журнала.

Дополнительные сведения о вычислении отображаемого значения см. в разделе "Отображение данных о производительности".

Общие сведения о счетчиках нескольких процессоров

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

Значение счетчика "\Processor(_Total)\% Processor Time" — среднее использование всех процессоров. Например, если у вас есть два процессора, один на 100 процентов и другой на 0 процентов, этот счетчик будет сообщать 50 процентов. Поэтому диапазон составляет от 0 до 100.

Значение счетчика "\Process(X)\% Processor Time" (где X — имя процесса), значение счетчика — это сумма использования процессора всеми потоками процесса X. Например, на компьютере с двумя процессорами, если процесс имеет два потока, один занимает 75 процентов ЦП, а другой занимает 80 процентов другого ЦП, этот счетчик сообщает 155 процентов. Диапазон для этого счетчика составляет от 0 до 100 * ProcessorCount.

При использовании Process набора счетчиков можно получать значения за пределами ожидаемого диапазона значений для использования ЦП. Чтобы вычислить процент использования ЦП, PDH требует двух примеров (каждый из которых имеет необработанное значение и метку времени). Так как PDH использует только имя экземпляра для сопоставления процессов, иногда он может смешивать образцы из разных процессов. Например, если выполняется выборка трех процессов с одинаковым именем экземпляра, а один из процессов завершается после третьего примера, другой процесс перейдет в слот, освобожденный этим завершенным процессом. В результате счетчик форматирования будет предоставлять неверное значение при форматировании четвертого примера, так как он использует третий образец из завершенного процесса и четвертый пример из процесса, который перемещен в слот завершенного процесса.

В следующей таблице показано, как это может произойти, если процесс завершается во время сбора данных. В таблице показаны пять примеров значений счетчика для трех экземпляров процесса X. Примеры собираются в один второй интервал. После сбора третьего примера процесс X в слоте 1 завершается. При завершении процесса X в слоте 1 процесс X в слоте 2 переходит к слоту 1. При сборе четвертого примера для процесса X в слоте 2 первое значение теперь равно 20 вместо 1000, а второй — 1500. При форматировании значения счетчика вы получаете 1480 миллисекунда вместо ожидаемых 500 миллисекунда. При форматировании пятого примера значения необходимо получить ожидаемое значение.

Пример Слот 0 для процесса X Слот 1 для процесса X Слот 2 для процесса X
Пример 1 0 0 0
Пример 2 20 10 500
Пример 3 40 20 1,000
Пример 4 60 1500 (из бывшего слота 2) Неприменимо. Теперь собирается в слоте 1.
Пример 5 80 2 000 Неприменимо. Теперь собирается в слоте 1.

Совет

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