Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
После создания запроса и добавления счетчиков вызовите функцию PdhCollectQueryData, чтобы получить текущие необработанные данные для всех счетчиков в запросе.
Многие счетчики, такие как счетчики скорости, требуют двух выборок данных для вычисления отформатированного значения данных. PDH сохраняет данные для текущего примера и ранее собранных примеров. В следующей процедуре описывается, как собирать значения счетчиков, для которых требуется два примера для вычисления отображаемого значения.
Сбор значений счетчиков, для которых требуется два образца для вычисления отображаемого значения
- Вызовите PdhCollectQueryData для сбора первого примера.
- Вызовите функцию Sleep, чтобы ожидать не менее одной секунды между коллекциями.
- Вызовите PdhCollectQueryData снова, чтобы собрать второй образец.
- Вызовите функцию PdhGetFormattedCounterValue, чтобы вычислить отображаемое значение.
- Повторите шаги 2–4.
В качестве альтернативы реализации периода ожидания самостоятельно, можно вызвать функцию PdhCollectQueryDataEx, которая создает поток таймера, который ожидает указанное время, собирает данные, а затем запускает событие, определяемое приложением.
Если вы хотите запросить данные о производительности из файла журнала, можно также определить диапазон времени. Диапазон времени ограничивает запрос теми образцами, которые были собраны в пределах диапазона времени (каждый пример содержит метку времени для момента сбора). Для получения дополнительной информации о том, как установить и извлечь диапазоны времени, см. Установка диапазона времени для запроса.
Если вы хотите собрать данные производительности и записать его в файл журнала, необходимо вызвать функцию PdhUpdateLog вместо вызова PdhCollectQueryData. Дополнительные сведения см. в работа с файлами логов и запись данных производительности в файл лога.
Дополнительные сведения о вычислении отображаемого значения выборки см. в разделе Отображение данных о производительности.
Общие сведения о счетчиках нескольких процессоров
Некоторые счетчики производительности предназначены для однопроцессорных систем и могут быть не точными для многопроцессорных компьютеров. Например, процесс ограничен 100 процентами одного процессора; однако его потоки могут использовать несколько процессоров, в общей сложности более 100 процентов.
Значение счетчика "\Processor(_Total)\% Время процессора" — среднее использование всех процессоров. Например, если у вас есть два процессора, один на 100 процентов и другой на 0 процентов, этот счетчик будет сообщать 50 процентов. Поэтому диапазон составляет от 0 до 100.
Значение счетчика "\Process(X)\% Время процессора" (где 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
.