Xperfview: в чем разница между выборкой ЦП и использованием ЦП?

Этот вопрос относится к xperf и xperfview, утилитам, входящим в состав Windows Performance Toolkit (в свою очередь, в состав Windows SDK 7.1).

Сравнивая две диаграммы, «Выборка ЦП по потокам» и «Использование ЦП по потокам», я обнаружил несколько различий, которые я не понимаю. Я буду использовать audiodg.exe в качестве примера.

  1. В раскрывающемся списке Threads есть только один поток для audiodg на диаграмме CPU Sampling; диаграмма использования ЦП показывает несколько потоков audiodg.

  2. На обоих графиках ось Y отмечена как «% использования», но измерения различаются. Обычно процент использования для данного потока ниже на диаграмме выборки ЦП, чем на диаграмме использования ЦП.

  3. Сводная таблица CPU Sampling показывает Weight и % веса для каждого модуля/процесса. Если я загружаю символы, я могу довольно глубоко погрузиться в процесс audiodg. Сводная таблица планирования ЦП (запускается из графика использования ЦП) показывает использование ЦП и % использования ЦП — вес недоступен. (И наоборот, загрузка ЦП недоступна в сводной таблице выборки ЦП.) Я не могу копаться так глубоко в audiodg — я вижу только основной поток и несколько потоков ntdll.dll.

  4. Цифры для любого процесса в столбцах % использования ЦП и % веса всегда разные. Иногда они отличаются более чем на 75%.

Итак, мои вопросы ... какова надежная мера использования ЦП здесь? Разве цифры использования ЦП не получены из образцов ЦП? Разве числа не должны быть как-то связаны?


person Phill    schedule 25.08.2010    source источник


Ответы (1)


Xperf делает это немного запутанным, это мое понимание того, что происходит:

  • Демонстрационные данные ЦП, включенные с флагом ядра PROFILE. Данные выборки ЦП собираются с некоторым регулярным интервалом и записывают информацию о том, что ЦП делал в это время (например, процесс, идентификатор потока и стек вызовов во время выборки).
  • Данные переключения контекста, включенные флагом ядра CSWITCH. Это записывает данные о каждом переключении контекста, которое происходит (например, кто был включен/выключен и стеки вызовов).

Выборка ЦП по потокам показывает количество событий профиля, которые были записаны для каждого потока, агрегированные за некоторый интервал времени для продолжительности трассировки. Например, если audiodg выполнялся 10 % времени в течение 2 секунд, мы ожидаем увидеть около 10 % использования за это время. Однако, поскольку это основано на выборке, возможно, что в каждом событии выборки выполнялись потоки из другого процесса — другими словами, 10% были «пропущены» событиями выборки.

Использование ЦП потоком рассчитывается с использованием данных переключения контекста. «Использование» — это время между включением и отключением контекста (и, конечно, эти данные агрегируются в течение некоторого небольшого интервала).

Каждая информация имеет свои преимущества:

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

Итак, чтобы ответить на ваш вопрос, диаграмма использования ЦП является «более точной» для понимания того, сколько времени выполнялся каждый поток. Тем не менее, не исключайте использование данных выборки, потому что это может быть гораздо полезнее для понимания того, где ваши потоки на самом деле тратят свое время! Для данных выборки ЦП сводная таблица более ценна, поскольку она покажет вам стеки. Для данных об использовании ЦП диаграмма, вероятно, более полезна, чем сводная таблица.

Надеюсь, это поможет!

person Matt    schedule 06.02.2011
comment
Отличный ответ! Солидно и основательно. У меня есть еще один побочный вопрос: xperf сэмплирует с частотой 1 кГц по умолчанию, и я узнал, что он не сэмплирует через потоки паузы/возобновления, тогда как он может точно зафиксировать текущий стек вызовов в точках сэмплирования? не через системные точки вызова API, верно? потому что обращение к системному API не может гарантировать равномерное распределение. - person Weipeng L; 29.09.2018