Как определить время простоя (и время сетевого ввода-вывода и т. Д.) В XPerf? - PullRequest
3 голосов
/ 13 ноября 2010

Допустим, у меня есть надуманная программа:

#include <Windows.h>

void useless_function()
{
    Sleep(5000);
}

void useful_function()
{
    // ... do some work
    useless_function();
    // ... do some more work
}

int main()
{
    useful_function();
    return 0;
}

Цель : Я хочу, чтобы профилировщик сказал мне, что useful_function() без необходимости звонит useless_function(), который не ждет очевидных причин. Под XPerf это не отображается ни на одном из моих графиков, потому что вызов WaitForMultipleObjects(), похоже, учитывается Idle.exe вместо моей собственной программы.

А вот командная строка xperf, которую я сейчас запускаю:

xperf -on Latency -stackwalk Profile

Есть идеи?

(Это не ограничивается функциями ожидания. Вышесказанное можно было бы решить, установив точки останова на NtWaitForMultipleObjects. В идеале мог бы быть способ увидеть образец стека, который занимает много времени настенных часов в отличие только от времени процессора)

Ответы [ 3 ]

2 голосов
/ 15 июня 2012

Я думаю, вам нужен анализ Wait с функцией Ready Thread в Xperf. Он захватывает каждое переключение контекста и дает вам стек вызовов потока, как только он выходит из спящего режима (или иным образом заблокированной операции). В вашем случае вы увидите стек сразу после вызова sleep (5000), а также время, проведенное в спящем режиме.

Функциональность немного неясна для использования. Но, к счастью, это хорошо описано здесь:

Использование анализа ожидания Xperf для устранения проблем производительности приложений

1 голос
/ 22 февраля 2015

Подождите, анализ это способ сделать это.Вам необходимо:

  • Записать поставщика CSWITCH, чтобы получить все переключатели контекста
  • Записать стеки вызовов на переключателях контекста, добавив + CSWITCH к аргументу -stackwalk
  • Вероятно, запишите стеки вызовов в готовом потоке, чтобы получить больше информации о том, кто вас подготовил (т. Е. Кто выпустил Mutex или CS или семафор и где), добавив + READYTHREAD к вашему -stackwalk

Затем выиспользуйте CPU Usage (Precise) в WPA (или xperfview, но это уже давно), чтобы посмотреть на переключатели контекста и определить, где ваш TimeSinceLast находится высоко в потоке, который не должен бездействовать.Обычно вам нужны столбцы в разделе «Использование ЦП (точные)» в следующем порядке:

  • NewProcess (процесс включен)
  • NewThreadId
  • NewThreadStack
  • ReadyingProcess (кто сделал ваш поток готовым к запуску)
  • ReadyingThreadId (необязательно)
  • ReadyThreadStack (необязательно, требует + ReadyThread при -stackwalk)
  • Оранжевыйbar
  • Count
  • TimeSinceLast (us) - сортировка по этому столбцу, обычно
  • Все остальные столбцы, которые вы хотите

Подробнее см. в этих конкретныхстатьи из моего блога: - https://randomascii.wordpress.com/2014/08/19/etw-training-videos-available-now/ - https://randomascii.wordpress.com/2012/06/19/wpaxperf-trace-analysis-reimagined/

0 голосов
/ 13 ноября 2010

Этот «профилировщик» скажет вам - просто случайно остановите его несколько раз и посмотрите на стек.Если do some work занимает 5 секунд, а do some more work - 5 секунд, то в 33% случаев стек будет выглядеть следующим образом

main: calling useful_function
useful_function: calling useless_function
useless_function: calling Sleep

Таким образом, примерно 33% образцов стека будут показывать именно это.Любая строка кода, которая стоит некоторую долю времени настенных часов, будет отображаться примерно на той части выборок.

В остальных примерах вы увидите, что она делает другие вещи.

Тамэто автоматические профилировщики, которые делают то же самое более привлекательным способом, например Zoom и LTProf , хотя на самом деле они не показывают образцы.

Iпосмотрел на документ xperf , пытаясь выяснить, можно ли получить образцы стека по времени настенных часов и получить проценты при разрешении на уровне линии.Кажется, вы должны быть на Windows 7 или Vista.Они беспокоятся только о функциях, а не о линиях, что важно, если у вас есть реально большие функции.Я не мог понять, как получить доступ к отдельным образцам, что я считаю важным для понимания , почему программа тратит свое время.

...