Представление "Потоки" в визуализаторе параллелизма

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

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

  • поток заблокирован примитивом синхронизации;
  • истек квант времени потока;
  • поток совершает блокирующий запрос ввода-вывода.

Визуализатор параллелизма распределяет потоки и события переключения контекста по категориям и выполняет поиск известных блокировок API в стеке вызовов потока. Он отображает категории потоков в активной легенде в нижней левой части представления Потоки. В большинстве случаев вы можете определить истинную причину блокировки, проанализировав стеки вызовов, относящиеся к событиям переключения контекста.

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

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

Представление Потоки можно использовать для следующих целей.

  • Определение причин, по которым пользовательский интерфейс не отвечает на определенных этапах выполнения.
  • Определение количества времени, затраченного на блокировку при синхронизации, вводе-выводе, ошибках страниц и при других событиях.
  • Определение степени влияния других процессов, выполняемых в системе.
  • Определение проблем балансировки нагрузки для параллельного выполнения.
  • Определение причин неоптимальной масштабируемости или ее полного отсутствия. Например, причин, по которым производительность параллельно выполняемого приложения не повышается при наличии в системе большего количества логических ядер.
  • Определение степени параллелизма приложения для содействия в применении принципа параллелизма.
  • Определение зависимостей между рабочими потоками и критическими путями выполнения.

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

Чтобы запустить визуализатор параллелизма, выберите Анализ>Визуализатор параллелизма, а затем выберите параметр, например Запустить новый процесс.

Визуализатор параллелизма запускает приложение и собирает данные трассировки, пока вы не щелкните Остановить сбор данных. Затем визуализатор анализирует данные трассировки и отображает результаты на странице отчета трассировки.

Чтобы открыть представление Потоки, перейдите в представление Потоки в верхней левой части отчета.

Threads view

Выберите промежутки времени и потоки, чтобы начать анализ производительности.

Анализ временной шкалы

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

На временной шкале по оси X отмечается время, а по оси Y — несколько каналов:

  • В системе предусмотрены два канала ввода-вывода для каждого жесткого диска: один канал для чтения и один — для записи.
  • Канал для каждого потока процесса.
  • Каналы маркеров, если в трассировке есть события маркеров. Каналы маркеров изначально отображаются в списке каналов потоков, которые инициировали эти события.
  • Каналы GPU.

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

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

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

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

Если в определенный момент времени выполняется только один поток, возможно, приложение не использует все преимущества параллелизма в системе. Кроме того, временной шкалой можно воспользоваться для анализа зависимостей между потоками и для анализа временных отношений между блокирующим и заблокированными потоками. Чтобы изменить порядок потоков, выберите поток, а затем на панели инструментов щелкните значок с изображением стрелки вверх или вниз.

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

Сведения о выполнении потока

Чтобы получить более подробные сведения о сегменте выполнения, выберите точку в зеленом сегменте на временной шкале. Визуализатор параллелизма отображает черный курсор над выбранной точкой и выводит стек вызовов на вкладке Текущий на нижней панели. В сегменте выполнения можно выбрать несколько точек.

Примечание.

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

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

Сведения о блокировании потока

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

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

Зависимости между потоками

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

Чтобы определить, какой поток разблокировал другой поток, выберите блокирующий сегмент на временной шкале. Если визуализатор параллелизма может определить разблокировавший поток, то рисуется линия между разблокировавшим потоком и выполняемым сегментом, который следует за сегментом блокировки. Чтобы просмотреть соответствующий стек вызовов, откройте вкладку Разблокировка стека в нижней области.

Отчеты о профиле

Под временной шкалой располагается панель с вкладками для отчетов Отчет о профиле, Текущий и Разблокировка стека. Отчеты автоматически обновляются при изменении выбора данных на временной шкале и выбора потоков. Для больших трассировок панель отчетов может быть временно недоступна, пока выполняется расчет.

Вкладка "Отчет о профиле"

Для отчета о профиле доступно два фильтра.

  • Чтобы отфильтровать записи дерева вызовов, на которые потрачено мало времени, в поле Снижение шума введите значение фильтра в диапазоне от 0 до 99 процентов. Значение по умолчанию — 2 процента.
  • Чтобы просмотреть деревья вызовов только своего кода, установите флажок Только мой код. Чтобы просмотреть все деревья вызовов, снимите флажок.

На вкладке Отчет о профиле отображаются отчеты для категорий и ссылки в ленте условных обозначений. Для вывода отчета выберите одну из записей в левой части.

  • Выполнение. В отчете Выполнение отображаются интервалы времени, в которые выполнялось приложение.

    Чтобы найти строку кода, на которую было затрачено время выполнения, разверните дерево вызовов и в контекстном меню элемента дерева вызовов выберите пункт Просмотреть исходный код или Просмотреть сайты вызовов. Команда Просмотреть исходный код позволяет найти выполненную строку кода. Команда Просмотреть сайты вызовов позволяет найти строку кода, в которой была вызвана выполненная строка. Если существует строка только одного сайта вызова, то его код будет выделен. Если существует несколько сайтов вызова, выберите нужный в диалоговом окне, а затем щелкните Перейти к источнику. Зачастую полезнее всего найти сайт вызова либо с наибольшим количеством экземпляров, либо с наибольшим временем выполнения, либо и с тем, и с другим. Дополнительные сведения см. в разделе Выполнение отчета профилирования.

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

  • Ввод-вывод. В отчете Ввод-вывод отображаются вызовы, отвечающие за блокировки ввода-вывода, с указанием общего времени блокировки каждого стека вызовов. Дополнительные сведения см. в статье Время ввода-вывода (представление "Потоки").

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

  • Управление памятью. В отчете Управление памятью отображаются вызовы, где происходили блокировки управления памятью, с указанием общего времени блокировки каждого стека вызовов. Эти сведения можно использовать для определения областей, в которых чрезмерно много проблем с подкачкой или сборкой мусора. Дополнительные сведения см. в статье Время управления памятью.

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

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

  • Сводка по потокам. Выберите Сводка по потокам для отображения диаграммы, показывающей состояние потоков в течение выбранного интервала времени. Столбцы с цветовыми обозначениями показывают общее время, затраченное каждым потоком на пребывание в состоянии выполнения, блокировки, ввода-вывода или в каком-либо другом состоянии. Метки потоков расположены внизу. При изменении масштаба временной шкалы эта диаграмма автоматически обновляется.

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

  • Операции диска. На вкладке Операции диска показано, какие процессы и потоки использовались для дискового ввода-вывода для текущего процесса, какие файлы они затронули (например, библиотеки DLL, которые были загружены), сколько байт они считали, а также другие сведения. Этот отчет можно использовать для оценки времени, затраченного на доступ к файлам во время выполнения, особенно если процесс связан с операциями ввода-вывода. Дополнительные сведения см. в разделе Отчет операций диска.

Вкладка "Текущий"

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

Вкладка "Разблокировка стека"

На этой вкладке показано, какой поток разблокировал выбранный поток, а также стек разблокирующих вызовов.

Каналы (представление "Потоки")

Визуализатор параллелизма показывает четыре типа каналов: каналы потоков, каналы дисков, каналы маркеров и каналы GPU.

Каналы потоков

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

Дискуссия Description
Главный поток Поток, запустивший приложение.
Рабочий поток Поток, созданный главным потоком приложения.
Рабочий поток CLR Рабочий поток, созданный средой CLR.
Справка отладчика Рабочий поток, созданный отладчиком Visual Studio.
Поток ConcRT Поток, созданный средой выполнения с параллелизмом Microsoft.
Поток GDI Поток, созданный GDIPlus.
Поток OLE/RPC Поток, созданный рабочим потоком RPC.
Поток RPC Поток, созданный потоком RPC.
Поток Winsock Поток, созданный потоком Winsock.
Пул потоков Поток, созданный пулом потоков CLR.

Каналы диска

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

Каналы маркеров

Каналы маркеров соответствуют событиям, созданным приложением и используемыми им библиотеками. Например, библиотека параллельных задач, библиотека параллельных шаблонов и C++ AMP создают события, которые отображаются в виде маркеров. Каждый канал маркер связан с идентификатором потока, который отображается рядом с описанием канала. Идентификатор определяет поток, создавший событие. Описание канала содержит имя поставщика трассировки событий для Windows (ETW), создающего события. Если канал отображает события из пакта SDK визуализатора параллелизма, также отображается имя ряда.

Каналы GPU

Каналы GPU отображает сведения о действиях DirectX 11 в системе. Каждый обработчик DirectX, который связан с видеокартой, имеет отдельный канал. Отдельные сегменты представляют время, затраченное на обработку пакета прямого доступа к памяти.

Копировать выделение

Чтобы скопировать весь стек вызовов на вкладке отчета, щелкните Копировать. Затем стек вызовов можно вставить в любую программу, поддерживающую это действие.

Вкладка "Текущий"

На вкладке Текущий можно просмотреть стек вызова (если он доступен), ближайший к выбранной на данный момент точке на временной шкале, если выбран сегмент потока ЦП. В данном случае точка выбора обозначена черной стрелкой или "крышкой", расположенной над временной шкалой. При выборе заблокированного сегмента "крышка" не отображается из-за отсутствия выполнения. Однако сегмент по-прежнему выбран и отображается стек вызовов.

На вкладке Текущий также содержатся сведения о действующих сегментах DirectX, маркерах и доступе ввода-вывода. Для действующих сегментов DirectX отображаются сведения о способе обработки пакетов прямого доступа к памяти отображаемой аппаратной очередью. Для маркеров отображаются сведения о типе и описании маркера. Информация о доступе ввода-вывода содержит файлы и количество прочитанных или записанных байт.

Пустой сегмент временной шкалы

В визуализаторе параллелизма причина, по которой часть временной шкалы пуста (имеет белый фон), зависит от типа канала.

  • Для канала потока ЦП это означает, что поток не существовал на этом промежутке временной шкалы. Если вы заинтересованы в потоке, можно найти соответствующий промежуток выполнения, используя элементы управления масштабирования или прокрутки по горизонтали.

  • Для канала ввода-вывода это означает, что в данный момент времени не выполнялся доступ к диску от имени целевого процесса.

  • Для канала DirectX это означает, что никакая работа графического процессора не выполнялась от имени целевого процесса в этом промежутке временной шкалы.

  • Для канала маркеров это означает, что маркеры не создавались.

Кнопка экспорта (визуализатор параллелизма)

Кнопка Экспорт позволяет экспортировать стек вызовов в виде CSV-файла для собственных записей пользователя или для использования в другом средстве, например Microsoft Excel.

Только мой код (представление "Потоки")

При выборе этого параметра вы отфильтруете стек вызовов, чтобы показывать только код и один уровень вызываемых функций.

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

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

Управление каналами

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

Сортировать по

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

Критерии Определение
Время начала Сортировка потоков по времени начала. Это порядок сортировки по умолчанию.
Время завершения Сортировка потоков по времени завершения.
Выполнение Сортировка потоков по доле времени, затраченного на выполнение.
Синхронизация Сортировка потоков по доле времени, затраченного на синхронизацию.
ВВОД-ВЫВОД Сортировка потоков по доле времени, затраченного на операции ввода-вывода (чтение и запись данных).
Sleep Сортировка потоков по доле времени, затраченного на спящий режим.
Разбиение на страницы Сортировка потоков по доле времени, затраченного на подкачку.
Вытеснение Сортировка потоков по доле времени, затраченного на вытеснение.
Обработка пользовательского интерфейса Сортировка потоков по доле времени, затраченного на обработку пользовательского интерфейса.

Перемещение выбранного канала вверх или вниз

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

Перемещение выбранного канала в верхнюю или нижнюю строку

Выбранные каналы можно переместить в верхнюю или нижнюю строку списка, чтобы изучить определенный шаблон, или переместить некоторые каналы так, чтобы они не мешали про работе.

Скрыть выбранные каналы

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

Примечание.

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

Показ всех каналов

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

Переместить маркеры в начало

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

Группировать маркеры по потокам

Если трассировка содержит события маркеров, эту команду можно использовать, чтобы группировать каналы маркеров в потоке, создавшем события маркеров. Каналы диска перемещаются в верхнюю строку списка каналов, а каналы GPU — в нижнюю.

Режим измерения (вкл./выкл.)

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

Процесс измерения можно повторить, но отображается только самое последнее измерение. Чтобы отключить режим измерения, снова нажмите кнопку измерения.

Процент снижения шума

По умолчанию процентное значение снижения шума равно 2. В дереве вызовов отображаются только те записи, процент инклюзивного времени которых больше или равен значению этого параметра. Изменяя это значение, можно управлять числом записей, отображаемых в дереве вызовов. Например, при изменении значения на 10 в дереве вызовов будут отображаться только те записи, инклюзивное время которых больше или равно 10 %. Увеличив значение этого параметра, можно сосредоточиться на записях, которые наиболее ощутимо влияют на производительность процесса.

Отчет на основе видимого временного диапазона

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

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

Соединитель готовности потока

Когда вы выбираете блокирующий сегмент для просмотра стека вызовов и его разблокирующего стека, также может появиться соединитель для потока. Если событие разблокировки произошло в другом потоке в текущем процессе, соединитель для потока наглядно представляет поток и сегмент выполнения, которые инициировали возобновление выполнения заблокированного потока.

Курсор на временной шкале

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

Разблокировка стека

Если выбранный в данный момент элемент потока представляет блокированный сегмент, выполнение которого началось после разблокирования другим потоком в выбранном процессе, то в этой таблице отображается стек вызовов для потока, снявшего блокировку.

Профиль видимой временной шкалы

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

Элемент управления масштабом (представление "Потоки")

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

Увеличение путем перетаскивания в представлении временной шкалы

Увеличение путем перетаскивания в представлении временной шкалы приводит к созданию области, выделенной желтым цветом. Когда кнопка мыши будет отпущена, представление временной шкалы увеличится по выбранному диапазону.

Увеличение и уменьшение с помощью колесика мыши

Щелкните любую точку временной шкалы (чтобы перевести на нее фокус мыши), а затем нажмите клавишу CTRL и вращайте колесико мыши (вперед — увеличение; назад — уменьшение).